bundle.js
239 KB
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
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**This class is automatically generated by LayaAirIDE, please do not make any modifications. */
var TestScene_1 = require("./TestScene");
var ScaleButtonScript_1 = require("./uitl/ScaleButtonScript");
var RedDrawal_1 = require("./RedDrawal");
var NativeAd_1 = require("./sdk/NativeAd");
/*
* 游戏初始化配置;
*/
var GameConfig = /** @class */ (function () {
function GameConfig() {
}
GameConfig.init = function () {
var reg = Laya.ClassUtils.regClass;
reg("TestScene.ts", TestScene_1.default);
reg("uitl/ScaleButtonScript.ts", ScaleButtonScript_1.default);
reg("RedDrawal.ts", RedDrawal_1.default);
reg("sdk/NativeAd.ts", NativeAd_1.default);
};
GameConfig.width = 750;
GameConfig.height = 1334;
GameConfig.scaleMode = "fixedwidth";
GameConfig.screenMode = "none";
GameConfig.alignV = "top";
GameConfig.alignH = "left";
GameConfig.startScene = "TestScene.scene";
GameConfig.sceneRoot = "";
GameConfig.debug = false;
GameConfig.stat = false;
GameConfig.physicsDebug = false;
GameConfig.exportSceneToJson = true;
return GameConfig;
}());
exports.default = GameConfig;
GameConfig.init();
},{"./RedDrawal":3,"./TestScene":4,"./sdk/NativeAd":10,"./uitl/ScaleButtonScript":25}],2:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var GameConfig_1 = require("./GameConfig");
var AppSdk_1 = require("./sdk/AppSdk");
var Main = /** @class */ (function () {
function Main() {
this.checkLoad = 0;
//根据IDE设置初始化引擎
if (window["Laya3D"])
Laya3D.init(GameConfig_1.default.width, GameConfig_1.default.height);
else
Laya.init(GameConfig_1.default.width, GameConfig_1.default.height, Laya["WebGL"]);
Laya["Physics"] && Laya["Physics"].enable();
Laya["DebugPanel"] && Laya["DebugPanel"].enable();
Laya.stage.scaleMode = GameConfig_1.default.scaleMode;
Laya.stage.screenMode = GameConfig_1.default.screenMode;
Laya.stage.alignV = GameConfig_1.default.alignV;
Laya.stage.alignH = GameConfig_1.default.alignH;
//兼容微信不支持加载scene后缀场景
Laya.URL.exportSceneToJson = GameConfig_1.default.exportSceneToJson;
//打开调试面板(通过IDE设置调试模式,或者url地址增加debug=true参数,均可打开调试面板)
if (GameConfig_1.default.debug || Laya.Utils.getQueryString("debug") == "true")
Laya.enableDebugPanel();
if (GameConfig_1.default.physicsDebug && Laya["PhysicsDebugDraw"])
Laya["PhysicsDebugDraw"].enable();
if (GameConfig_1.default.stat)
Laya.Stat.show();
Laya.alertGlobalError = true;
//激活资源版本控制,version.json由IDE发布功能自动生成,如果没有也不影响后续流程
Laya.ResourceVersion.enable("version.json", Laya.Handler.create(this, this.onVersionLoaded), Laya.ResourceVersion.FILENAME_VERSION);
}
Main.prototype.onVersionLoaded = function () {
//激活大小图映射,加载小图的时候,如果发现小图在大图合集里面,则优先加载大图合集,而不是小图
Laya.AtlasInfoManager.enable("fileconfig.json", Laya.Handler.create(this, this.onConfigLoaded));
};
Main.prototype.onConfigLoaded = function () {
this.initSdk();
this.loadData();
};
/**初始化SDK */
Main.prototype.initSdk = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!AppSdk_1.default.I.isMyBridge) return [3 /*break*/, 2];
AppSdk_1.default.init();
return [4 /*yield*/, AppSdk_1.default.I.initSdk()];
case 1:
_a.sent();
this.toggleScene();
return [3 /*break*/, 3];
case 2:
Laya.timer.once(100, this, this.initSdk);
_a.label = 3;
case 3: return [2 /*return*/];
}
});
});
};
Main.prototype.loadData = function () {
// 处理游戏加载
//加载完成
this.toggleScene();
};
Main.prototype.toggleScene = function () {
//加载IDE指定的场景
this.checkLoad++;
if (this.checkLoad < 2) {
return;
}
AppSdk_1.default.I.hideSplash(); //隐藏加载页 可根据需求放到其他位置
GameConfig_1.default.startScene && Laya.Scene.open(GameConfig_1.default.startScene);
};
return Main;
}());
//激活启动类
new Main();
},{"./GameConfig":1,"./sdk/AppSdk":8}],3:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var EventCenter_1 = require("./event/EventCenter");
var EventEnum_1 = require("./event/EventEnum");
/**
* 主界面 金币金额
*/
var RedDrawal = /** @class */ (function (_super) {
__extends(RedDrawal, _super);
function RedDrawal() {
var _this = _super.call(this) || this;
_this.totalCoin = 110;
return _this;
}
RedDrawal.prototype.onStart = function () {
this.updateStar();
// this.tiplab.visible = false;
};
RedDrawal.prototype.onEnable = function () {
EventCenter_1.EventCenter.add(EventEnum_1.EventEnum.APP_SHOW, this, this.updateStar);
EventCenter_1.EventCenter.add(EventEnum_1.EventEnum.UPDATE_COIN, this, this.updateStar);
};
RedDrawal.prototype.onDisable = function () {
EventCenter_1.EventCenter.remove(EventEnum_1.EventEnum.APP_SHOW, this, this.updateStar);
EventCenter_1.EventCenter.remove(EventEnum_1.EventEnum.UPDATE_COIN, this, this.updateStar);
};
RedDrawal.prototype.updateStar = function () {
return __awaiter(this, void 0, void 0, function () {
var coin, str, nextDrawal, leftCoin;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, RedpacketModel_1.default.I.getTotalCoin()];
case 1:
coin = _a.sent();
// let coin = 1000
this.totalCoin = coin;
this.coinlab.text = '' + coin;
str = '可提现';
return [4 /*yield*/, RedpacketModel_1.default.I.minWithDrawal()];
case 2:
nextDrawal = _a.sent();
if (this.totalCoin > 0) {
leftCoin = nextDrawal - this.totalCoin;
if (leftCoin > 0)
str = "\u8FD8\u5DEE" + (leftCoin / 10000).toFixed(3) + "\u91D1\u989D\u53EF\u63D0\u73B0";
}
this.tiplab.text = str;
this.tiplab.visible = Boolean(nextDrawal);
return [2 /*return*/];
}
});
});
};
return RedDrawal;
}(Laya.Script));
exports.default = RedDrawal;
},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/model/RedpacketModel":15}],4:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var layaMaxUI_1 = require("./ui/layaMaxUI");
var AdManager_1 = require("./sdk/AdManager");
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var AppSdk_1 = require("./sdk/AppSdk");
var TeaSdk_1 = require("./sdk/TeaSdk");
var EventCenter_1 = require("./event/EventCenter");
var EventEnum_1 = require("./event/EventEnum");
var TestScene = /** @class */ (function (_super) {
__extends(TestScene, _super);
function TestScene() {
var _this = _super.call(this) || this;
//关闭多点触控,否则就无敌了
Laya.MouseManager.multiTouchEnabled = false;
console.log('---------------TestScene-------');
_this.NativeAD.visible = false;
return _this;
}
TestScene.prototype.onEnable = function () {
this.btnServer.on(Laya.Event.CLICK, this, this.openServer);
this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal);
this.btnDraw.on(Laya.Event.CLICK, this, this.onDraw);
this.btnInvite.on(Laya.Event.CLICK, this, this.invitation);
this.btnVibrate.on(Laya.Event.CLICK, this, this.onVibrate);
this.btnPreloadAD.on(Laya.Event.CLICK, this, this.preloadAD);
this.btnShowBanner.on(Laya.Event.CLICK, this, this.showBanner);
this.btnShowFullAd.on(Laya.Event.CLICK, this, this.showFullAd);
this.btnShowNativeAd.on(Laya.Event.CLICK, this, this.showNativeAd);
this.btnShowInterAd.on(Laya.Event.CLICK, this, this.showInterAd);
this.btnRewardAd.on(Laya.Event.CLICK, this, this.showRewardAd);
this.btnRedpacket.on(Laya.Event.CLICK, this, this.openRedpacket);
};
/**预加载广告 */
TestScene.prototype.preloadAD = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log('---------------preloadAD-------');
return [4 /*yield*/, AdManager_1.default.I.init()];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
/**显示全屏广告 */
TestScene.prototype.showFullAd = function () {
console.log('---------------showFullAd-------');
AdManager_1.default.I.showFullAd();
// var ret = MyBridge.mapToString({
// data: {
// "count": 2, "title": [{ "name": "nnn", "value": "nnnvalue", "default_show": 1 }
// , { "name": "mmm", "value": "mmmvalue\"aasdasd" }]
// }
// });
// console.log("-------web--------onClick----->>cocos JS-------MyBridge.mapToString------" + JSON.stringify(ret));
};
/**显示banner */
TestScene.prototype.showBanner = function () {
console.log('---------------showBanner-------');
AdManager_1.default.I.showBanner();
};
/**信息流广告 */
TestScene.prototype.showNativeAd = function () {
console.log('---------------showNativeAd-------');
this.NativeAD.visible = true;
};
/**插屏广告 */
TestScene.prototype.showInterAd = function () {
console.log('---------------showInterAd-------');
AdManager_1.default.I.showInterAd();
};
/**激励视频广告 */
TestScene.prototype.showRewardAd = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log('---------------showRewardAd-------');
return [4 /*yield*/, AdManager_1.default.I.showRewardAd('videoType')];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
/**意见反馈 */
TestScene.prototype.openServer = function () {
console.log('---------------openServer-------');
AppSdk_1.default.I.feedback();
};
TestScene.prototype.openRedpacket = function () {
return __awaiter(this, void 0, void 0, function () {
var bol;
var _this = this;
return __generator(this, function (_a) {
bol = RedpacketModel_1.default.I.checkRedpacket();
console.log(bol + '红包获取结果:curRedpacket' + RedpacketModel_1.default.I.curRedpacket);
if (bol) {
//**弹出红包的界面, 暂时处理成 直接看广告获取金币 */
AdManager_1.default.I.showRewardAd(TeaSdk_1.DotKey.reward_ad).then(function (res) { return __awaiter(_this, void 0, void 0, function () {
var coin;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("加金币");
return [4 /*yield*/, RedpacketModel_1.default.I.addCoin()];
case 1:
coin = _a.sent();
console.log("获取了钱", coin);
RedpacketModel_1.default.I.getRepacket(); //计数
/**更新基本显示 */
EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.UPDATE_COIN);
return [2 /*return*/];
}
});
}); }).catch(function (err) {
console.log("onVideo error");
});
}
return [2 /*return*/];
});
});
};
/**打开个人中心 */
TestScene.prototype.openPersonal = function () {
console.log('---------------openServer-------');
AppSdk_1.default.I.personal();
};
/**邀请好友 */
TestScene.prototype.invitation = function () {
AppSdk_1.default.I.invitation();
};
//震动
TestScene.prototype.onVibrate = function () {
AppSdk_1.default.I.vibrate(0);
};
TestScene.prototype.getProps = function (data) {
var booster;
var rewardNum = data.num;
var type = data.type;
/**
* 处理游戏中的道具显示
*/
// switch (type) {
// case 4:
// booster = BoosterType.Remove;
// break;
// case 6:
// booster = BoosterType.Change;
// break;
// case 5:
// booster = BoosterType.Refresh;
// break;
// case 7:
// booster = BoosterType.RandRemove;
// break;
// case 3:
// booster = BoosterType.Star;
// break;
// }
// ViewManager.I.openPopwin(ReceivePropsPopwin, booster, rewardNum);
};
/**
* 看广告获得红包
*/
TestScene.prototype.watchADCoin = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, AdManager_1.default.I.showRewardAd('videoType')];
case 1:
_a.sent();
this.getCoin();
return [2 /*return*/];
}
});
});
};
/**直接获得红包 */
TestScene.prototype.getCoin = function () {
//刷新总金币
// AppManager.I.redpacket.getRepacket()
// ViewManager.I.openPopwin(RedPacketReward, 2);
};
TestScene.prototype.onDraw = function () {
AppSdk_1.default.I.openReward();
};
return TestScene;
}(layaMaxUI_1.ui.TestSceneUI));
exports.default = TestScene;
},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/AdManager":7,"./sdk/AppSdk":8,"./sdk/TeaSdk":12,"./sdk/model/RedpacketModel":15,"./ui/layaMaxUI":20}],5:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/*
* name;
*/
var EventCenter = /** @class */ (function () {
function EventCenter() {
}
Object.defineProperty(EventCenter, "I", {
get: function () {
window['ev'] = this._instance;
return this._instance || (this._instance = new Laya.EventDispatcher);
},
enumerable: true,
configurable: true
});
EventCenter.emit = function (event) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
this.I.event(event.toString(), args);
};
EventCenter.add = function (type, caller, listener, args) {
this.I.on(type.toString(), caller, listener, args);
};
EventCenter.remove = function (type, caller, listener) {
this.I.off(type.toString(), caller, listener);
};
return EventCenter;
}());
exports.EventCenter = EventCenter;
},{}],6:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EventEnum;
(function (EventEnum) {
EventEnum[EventEnum["CHECK_REDPACKET"] = 'check_redpacket'] = "CHECK_REDPACKET";
EventEnum[EventEnum["APP_SHOW"] = 'app.show'] = "APP_SHOW";
EventEnum[EventEnum["APP_HIDE"] = 'app.hide'] = "APP_HIDE";
EventEnum[EventEnum["UPDATE_COIN"] = 'update.coin'] = "UPDATE_COIN";
})(EventEnum = exports.EventEnum || (exports.EventEnum = {}));
},{}],7:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TTAdSdk_1 = require("./TTAdSdk");
var TeaSdk_1 = require("./TeaSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AdManager = /** @class */ (function () {
function AdManager() {
}
AdManager.prototype.init = function () {
this.preloadRewardAd();
this.preloadBanner();
this.preloadFullAd();
};
AdManager.prototype.preloadBanner = function () {
TTAdSdk_1.default.I.loadBannerExpressAd(1);
};
AdManager.prototype.preloadRewardAd = function () {
TTAdSdk_1.default.I.showRewardVideoAd(1);
};
AdManager.prototype.preloadFullAd = function () {
TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
};
AdManager.prototype.preloadNativeAdYLH = function () {
TTAdSdk_1.default.I.loadNativeAdYLH(1, 1, 600, 300, 1);
};
AdManager.prototype.preloadInterAd = function () {
TTAdSdk_1.default.I.showInteractionExpressAd(1);
};
AdManager.prototype.preloadNativeAd = function () {
TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
};
AdManager.prototype.closeAdverDialog = function () {
if (!Laya.Browser.onAndroid) {
return;
}
TTAdSdk_1.default.I.closeAdverDialog();
};
AdManager.prototype.closeAdBanner = function () {
TTAdSdk_1.default.I.closeAdBanner();
};
AdManager.prototype.showRewardAd = function (point) {
return __awaiter(this, void 0, void 0, function () {
var ret, e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, TTAdSdk_1.default.I.showRewardVideoAd(0, point)];
case 1:
ret = _a.sent();
// this.lastVideoTime = Laya.timer.currTimer;
// this.preloadRewardAd();
return [2 /*return*/, Promise.resolve(ret)];
case 2:
e_1 = _a.sent();
this.preloadRewardAd();
return [2 /*return*/, Promise.reject(e_1)];
case 3: return [2 /*return*/];
}
});
});
};
AdManager.prototype.showFullAd = function () {
return __awaiter(this, void 0, void 0, function () {
var ret, e_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, TTAdSdk_1.default.I.loadFullScreenVideoAd()];
case 1:
ret = _a.sent();
TeaSdk_1.default.I.dot(TeaSdk_1.DotKey.fullScreen, { from: 'show' });
this.preloadFullAd();
return [2 /*return*/, Promise.resolve(ret)];
case 2:
e_2 = _a.sent();
this.preloadFullAd();
return [2 /*return*/, Promise.reject(e_2)];
case 3: return [2 /*return*/];
}
});
});
};
AdManager.prototype.showInterAd = function () {
return __awaiter(this, void 0, void 0, function () {
var ret, e_3;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 3]);
return [4 /*yield*/, TTAdSdk_1.default.I.showInteractionExpressAd()];
case 1:
ret = _a.sent();
this.preloadInterAd();
return [2 /*return*/, Promise.resolve(ret)];
case 2:
e_3 = _a.sent();
this.preloadInterAd();
return [2 /*return*/, Promise.reject(e_3)];
case 3: return [2 /*return*/];
}
});
});
};
AdManager.prototype.checkVideoInCd = function () {
return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000);
};
AdManager.prototype.showBanner = function () {
TTAdSdk_1.default.I.loadBannerExpressAd();
};
AdManager.prototype.showNativeAd = function (x, y, w, h, preload) {
if (preload === void 0) { preload = 0; }
TTAdSdk_1.default.I.loadNativeExpressAd(x, y, w, h, preload);
};
// 优量汇信息流广告
AdManager.prototype.showNativeAdYLH = function (x, y, w, h, preload) {
if (preload === void 0) { preload = 0; }
return TTAdSdk_1.default.I.loadNativeAdYLH(x, y, w, h, preload);
};
AdManager.prototype.openLoadNativeAdEvent = function () {
TTAdSdk_1.default.I.openLoadNativeAdEvent();
};
Object.defineProperty(AdManager, "I", {
get: function () {
return ObjectInstance_1.default.get(AdManager);
},
enumerable: true,
configurable: true
});
return AdManager;
}());
exports.default = AdManager;
},{"../uitl/ObjectInstance":23,"./TTAdSdk":11,"./TeaSdk":12}],8:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AdManager_1 = require("./AdManager");
var RedpacketModel_1 = require("./model/RedpacketModel");
var LuckDrawModel_1 = require("./LuckDrawModel");
var AppSdkData_1 = require("./sdkData/AppSdkData");
var LuckDrawData_1 = require("./sdkData/LuckDrawData");
var AppSdk = /** @class */ (function () {
function AppSdk() {
}
AppSdk.init = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
AppSdk.I.getSystemInfo();
AppSdk.I.initGameConfig();
AdManager_1.default.I.init(); //预加载广告
return [4 /*yield*/, ObjectInstance_1.default.get(RedpacketModel_1.default).init()];
case 1:
_a.sent();
LuckDrawModel_1.default.I.init();
return [2 /*return*/];
}
});
});
};
AppSdk.prototype.initSdk = function () {
var _this = this;
return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.getUserInfo()];
case 1:
_a.sent();
resolve(1);
return [2 /*return*/];
}
});
}); });
};
Object.defineProperty(AppSdk.prototype, "myBridge", {
get: function () {
if (typeof MyBridge !== 'undefined') {
return MyBridge;
}
else {
console.error(' no register myBridge!!!');
}
},
enumerable: true,
configurable: true
});
/**获取基本版本信息以及手机的配置 */
AppSdk.prototype.getSystemInfo = function (key) {
if (key === void 0) { key = 0; }
var _a;
var ret = this.myBridge.getSystemInfo(key);
var _b = JSON.parse(ret), w = _b.w, h = _b.h, versionName = _b.versionName, channel = _b.channel, pangolin = _b.pangolin, adnet = _b.adnet, level = _b.level;
_a = [w, h, versionName, channel, pangolin, adnet, level], this._width = _a[0], this._height = _a[1], this._version = _a[2], this._channel = _a[3], this.pangolinId = _a[4], this.adnetId = _a[5], this._level = _a[6];
};
AppSdk.prototype.getUserInfo = function () {
var _this = this;
return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
console.log("-------------getUserInfo回调 前---------------");
this.myBridge.getGameUserInfo(function (ret) {
console.log("-------------getUserInfo回调---------------", ret);
var res = JSON.parse(ret);
AppSdkData_1.AppSdkData.I.initData(res);
resolve(1);
});
return [2 /*return*/];
});
}); });
};
AppSdk.prototype.initGameConfig = function () {
this._gameConfig = this.getGameConfig();
};
/**
* 震动
* @param key 0 短震动 1 长震动
*/
AppSdk.prototype.vibrate = function (key) {
if (key === void 0) { key = 0; }
this.myBridge.openSystemFun(key);
};
/**隐藏启动屏 */
AppSdk.prototype.hideSplash = function () {
this.myBridge.hideSplash();
};
/**弹出提现 */
AppSdk.prototype.withDrawal = function () {
this.myBridge.withDrawal();
};
/**意见反馈 */
AppSdk.prototype.feedback = function () {
this.myBridge.feedback();
};
/**
* key 默认0 ,签到 1
*/
AppSdk.prototype.personal = function () {
this.myBridge.personal();
};
/**邀请好友*/
AppSdk.prototype.invitation = function () {
this.myBridge.invitation();
};
/**邀请好友*/
AppSdk.prototype.openReward = function () {
this.myBridge.openReward();
};
/**签到*/
AppSdk.prototype.openSignin = function () {
this.myBridge.openSingin();
};
AppSdk.prototype.putData = function (key, value) {
this.myBridge.putData(key, value);
};
/**
* @param key 存数据的时候的唯一key
* @return 存储的数据
* */
AppSdk.prototype.getData = function (key) {
var ret = this.myBridge.getData(key);
return JSON.parse(ret);
};
/**
* 获取游戏配置
*/
AppSdk.prototype.getGameConfig = function () {
var result = this.myBridge.getGameConfig();
console.log("获取游戏配置", JSON.stringify(result));
LuckDrawData_1.LuckDrawData.I.initData(JSON.parse(result)['draw']); //转盘数据配置
return JSON.parse(result);
};
/**
* 要求发放金币
* @param key 1红包
*/
AppSdk.prototype.addGold = function (key) {
if (key === void 0) { key = 1; }
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.myBridge.addGold(key, function (res) {
console.log("要求发放金币", JSON.stringify(res));
res = JSON.parse(res);
var code = res.code, data = res.data, msg = res.msg;
if ('0' === code || !code) {
resolve(data);
}
else {
reject(msg);
}
})];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); })];
});
});
};
/**
* 要求发放金币 可翻倍类型
*/
AppSdk.prototype.rewardInfo = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.myBridge.rewardInfo(function (res) {
res = JSON.parse(res);
var code = res.code, data = res.data, msg = res.msg;
if ('0' === code || !code) {
resolve(data.coin);
}
else {
reject(msg);
}
});
return [2 /*return*/];
});
}); })];
});
});
};
/**
* 获取双倍金币
* @param type 1原金币 2双倍金币
*/
AppSdk.prototype.twofoldReward = function (type) {
if (type === void 0) { type = 1; }
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
this.myBridge.twofoldReward(type, function (res) {
res = JSON.parse(res);
var code = res.code, data = res.data, msg = res.msg;
if ('0' === code || !code) {
resolve(data.coin);
}
else {
reject(msg);
}
});
return [2 /*return*/];
});
}); })];
});
});
};
/**获取总金币 */
AppSdk.prototype.myCoin = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.myBridge.myCoin(function (res) {
res = JSON.parse(res);
var code = res.code, data = res.data, msg = res.msg;
if ('0' === code || !code) {
resolve(data['coin']);
}
else {
reject(msg);
}
})];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); })];
});
});
};
/**获取当前提现的档位 */
AppSdk.prototype.minWithDrawal = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.myBridge.minWithDrawal(function (res) {
res = JSON.parse(res);
var code = res.code, data = res.data, msg = res.msg;
if ('0' === code || !code) {
resolve(data['money']);
}
else {
reject(msg);
}
})];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); })];
});
});
};
/**上报埋点 */
AppSdk.prototype.appDotLog = function (key, value) {
this.myBridge.appDotLog(key, value);
};
/**热云打点 */
AppSdk.prototype.appDotTracKing = function (key) {
this.myBridge.appDotTracKing(key);
};
AppSdk.prototype.setCallback = function (funName, pramas) {
var _this = this;
console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge));
return new Promise(function (resolve, reject) {
_this.myBridge[funName](pramas, function (res) {
var _a = JSON.parse(res), code = _a.code, data = _a.data;
if ('0' === code) {
resolve(data);
}
else {
reject(0);
}
});
});
};
AppSdk.prototype.closeAdverDialog = function () {
this.myBridge.closeAdverDialog();
};
AppSdk.prototype.closeAdBanner = function () {
this.myBridge.closeAdBanner();
};
/**激励视频 */
AppSdk.prototype.showRewardVideoAd = function (value, JBCallback) {
this.myBridge.showRewardVideoAd(value, JBCallback);
};
/** 全屏广告*/
AppSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) {
this.myBridge.loadFullScreenVideoAd(data, JBCallback);
};
/**信息流广告 */
AppSdk.prototype.loadNativeExpressAd = function (data, JBCallback) {
this.myBridge.loadNativeExpressAd(data, JBCallback);
};
/**信息流广告- 优量汇 */
AppSdk.prototype.loadNativeAdYLH = function (data, JBCallback) {
this.myBridge.loadNativeAd(data, JBCallback);
};
// 打开信息流-优量汇
AppSdk.prototype.openLoadNativeAdEvent = function () {
this.myBridge.openLoadNativeAdEvent();
};
/**banner */
AppSdk.prototype.loadBannerExpressAd = function (data, JBCallback) {
this.myBridge.loadBannerExpressAd(data, JBCallback);
};
/**插屏广告 */
AppSdk.prototype.showInteractionExpressAd = function (data, JBCallback) {
this.myBridge.showInteractionExpressAd(data, JBCallback);
};
Object.defineProperty(AppSdk.prototype, "level", {
get: function () {
return this._level;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk.prototype, "width", {
get: function () {
return this._width;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk.prototype, "height", {
get: function () {
return this._height;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk.prototype, "version", {
get: function () {
return this._version;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk.prototype, "channel", {
get: function () {
return this._channel;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk.prototype, "bridge", {
get: function () {
return null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk.prototype, "gameConfig", {
get: function () {
return this._gameConfig;
},
enumerable: true,
configurable: true
});
Object.defineProperty(AppSdk, "I", {
get: function () {
return ObjectInstance_1.default.get(AppSdk);
},
enumerable: true,
configurable: true
});
return AppSdk;
}());
exports.default = AppSdk;
// //这里是浏览器环境下, 接收web传过来的消息
window.onMyBridgeReady = function () {
AppSdk.I.isMyBridge = true;
console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms");
MyBridge.App.onResume = function () {
var ret = [];
for (var _i = 0; _i < arguments.length; _i++) {
ret[_i] = arguments[_i];
}
console.log(' laya onResume', ret);
};
MyBridge.App.onPause = function () {
var ret = [];
for (var _i = 0; _i < arguments.length; _i++) {
ret[_i] = arguments[_i];
}
console.log(' laya onPause', ret);
};
};
},{"../uitl/ObjectInstance":23,"./AdManager":7,"./LuckDrawModel":9,"./model/RedpacketModel":15,"./sdkData/AppSdkData":17,"./sdkData/LuckDrawData":19}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var DateUtils_1 = require("../uitl/DateUtils");
/**转盘 获取转盘机会的 */
var LuckDrawModel = /** @class */ (function () {
function LuckDrawModel() {
this.propRemove = 0;
this.propChange = 0;
}
LuckDrawModel.prototype.init = function () {
return __awaiter(this, void 0, void 0, function () {
var _a;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
_a = this;
return [4 /*yield*/, this.initData()];
case 1:
_a._data = _b.sent();
AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: 0 }));
AppSdk_1.default.I.putData('LuckDrawToSign', JSON.stringify({ istoSignin: 0 }));
return [2 /*return*/];
}
});
});
};
LuckDrawModel.prototype.initData = function () {
return __awaiter(this, void 0, void 0, function () {
var data, lastTime, last, today, list, index, item, luckDrawData;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
data = new LuckDrawData;
lastTime = Laya.LocalStorage.getItem('LuckDrawLastTime') || '0';
data.luckDrawLastTime = parseInt(lastTime);
last = DateUtils_1.default.timeDay(data.luckDrawLastTime);
today = DateUtils_1.default.today;
if (!(last != today)) return [3 /*break*/, 1];
lastTime = DateUtils_1.default.nowTime.toString();
Laya.LocalStorage.setItem('LuckDrawLastTime', lastTime);
data.luckDrawLastTime = parseInt(lastTime);
/**初始化数据
* 1 签到
* 2 视频
* 3 摇一摇
* 4 红包
*/
data.list = [];
list = [];
for (index = 0; index < 4; index++) {
item = new LuckDrawVo;
item.type = index + 1;
item.num = 0;
item.isUse = 0;
item.useNum = 0;
list.push(item);
}
data.list = list;
return [3 /*break*/, 3];
case 1: return [4 /*yield*/, AppSdk_1.default.I.getData('LuckDrawData')];
case 2:
luckDrawData = _a.sent();
if (luckDrawData)
data.list = luckDrawData.list;
_a.label = 3;
case 3:
AppSdk_1.default.I.putData('LuckDrawData', JSON.stringify(data));
this._data = data;
return [2 /*return*/, data];
}
});
});
};
Object.defineProperty(LuckDrawModel.prototype, "data", {
get: function () {
return this._data;
},
enumerable: true,
configurable: true
});
LuckDrawModel.prototype.updateData = function (index, addNum) {
if (addNum === void 0) { addNum = 1; }
if (this.data) {
this.data.list[index].num += addNum;
AppSdk_1.default.I.putData('LuckDrawData', JSON.stringify(this.data));
}
};
LuckDrawModel.prototype.getPropData = function () {
return __awaiter(this, void 0, void 0, function () {
var luckDrawProp;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, AppSdk_1.default.I.getData('luckDrawProp')];
case 1:
luckDrawProp = _a.sent();
console.log(' -------yyyyy laya luckDrawProp ' + JSON.stringify(luckDrawProp));
this.propRemove = Number(luckDrawProp.remove);
this.propChange = Number(luckDrawProp.change);
if (this.propRemove > 0) {
this.updateRemoveProp();
}
else {
this.updateChangeProp();
}
return [2 /*return*/, luckDrawProp];
}
});
});
};
LuckDrawModel.prototype.updateRemoveProp = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
if (this.propRemove > 0) {
/* 处理获得第1个道具*/
this.propRemove = 0;
AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: this.propChange }));
}
return [2 /*return*/];
});
});
};
LuckDrawModel.prototype.updateChangeProp = function () {
if (this.propChange > 0) {
/* 处理获得第2个道具*/
this.propChange = 0;
AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: this.propRemove, change: 0 }));
}
};
Object.defineProperty(LuckDrawModel, "I", {
get: function () {
return ObjectInstance_1.default.get(LuckDrawModel);
},
enumerable: true,
configurable: true
});
return LuckDrawModel;
}());
exports.default = LuckDrawModel;
var LuckDrawData = /** @class */ (function () {
function LuckDrawData() {
}
return LuckDrawData;
}());
var LuckDrawVo = /** @class */ (function () {
function LuckDrawVo() {
}
return LuckDrawVo;
}());
},{"../uitl/DateUtils":22,"../uitl/ObjectInstance":23,"./AppSdk":8}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AdManager_1 = require("./AdManager");
var NativeAd = /** @class */ (function (_super) {
__extends(NativeAd, _super);
function NativeAd() {
return _super !== null && _super.apply(this, arguments) || this;
}
NativeAd.prototype.onEnable = function () {
var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true);
AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height);
};
NativeAd.prototype.onDisable = function () {
AdManager_1.default.I.closeAdverDialog();
};
Object.defineProperty(NativeAd.prototype, "item", {
get: function () {
return this.owner;
},
enumerable: true,
configurable: true
});
return NativeAd;
}(Laya.Script));
exports.default = NativeAd;
},{"./AdManager":7}],11:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var TeaSdk_1 = require("./TeaSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var TTAdSdk = /** @class */ (function () {
function TTAdSdk() {
}
/**
*
* @param preload 0 直接加载;1 预加载
*/
TTAdSdk.prototype.showRewardVideoAd = function (preload, point) {
if (preload === void 0) { preload = 0; }
if (point === void 0) { point = TeaSdk_1.DotKey.proloading; }
return __awaiter(this, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
data = {
type: 1,
preloading: preload,
};
return [2 /*return*/, new Promise(function (resolve, reject) {
var isComplete = false;
AppSdk_1.default.I.showRewardVideoAd(data, function (ret) {
console.log("视频回调", JSON.stringify(ret));
var _a = JSON.parse(ret), code = _a.code, msg = _a.msg;
switch (code) {
case -1:
reject('error');
/**'暂无视频广告!每日0点重置'*/ ;
break;
case 0:
break;
case 100:
break;
case 102:
isComplete = true;
break;
case 101:
console.log("视频点了关闭");
if (isComplete) {
console.log("视频观看完闭并点了关闭");
// TeaSdk.I.dot(DotKey.reward_ad, { from: point });
resolve(1);
}
else {
reject('unComplete');
}
break;
default:
reject('加载失败');
// TeaSdk.I.dot(DotKey.reward_ad_fail, { from: point, code: code });
break;
}
});
})];
});
});
};
TTAdSdk.prototype.loadFullScreenVideoAd = function (preload) {
if (preload === void 0) { preload = 0; }
return __awaiter(this, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
data = {
w: AppSdk_1.default.I.width,
h: AppSdk_1.default.I.width * 90 / 600,
preloading: preload,
type: 1
};
return [2 /*return*/, new Promise(function (resolve, reject) {
AppSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) {
resolve(res);
});
})];
});
});
};
TTAdSdk.prototype.loadNativeExpressAd = function (x, y, width, height, preload) {
if (preload === void 0) { preload = 0; }
return __awaiter(this, void 0, void 0, function () {
var scaleX, scaleY, data;
return __generator(this, function (_a) {
scaleX = AppSdk_1.default.I.width / Laya.stage.width;
scaleY = AppSdk_1.default.I.height / Laya.stage.height;
data = {
type: 1,
preloading: preload,
w: width * scaleX,
h: height * scaleY,
left: x * scaleX,
top: y * scaleY
};
AppSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) {
return Promise.resolve(res);
});
return [2 /*return*/];
});
});
};
TTAdSdk.prototype.loadNativeAdYLH = function (x, y, width, height, preload) {
if (preload === void 0) { preload = 0; }
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) {
var scaleX = AppSdk_1.default.I.width / Laya.stage.width;
var scaleY = AppSdk_1.default.I.height / Laya.stage.height;
var data = {
type: 1,
preloading: preload,
w: width * scaleX,
h: height * scaleY,
left: x * scaleX,
bottom: AppSdk_1.default.I.height - height * scaleY - y * scaleY,
};
// console.log(JSON.stringify(data))
// console.log(AppSdk.I.height, height, y, scaleY)
AppSdk_1.default.I.loadNativeAdYLH(JSON.stringify(data), function (res) {
resolve(JSON.parse(res));
});
})];
});
});
};
TTAdSdk.prototype.openLoadNativeAdEvent = function () {
AppSdk_1.default.I.openLoadNativeAdEvent();
};
TTAdSdk.prototype.loadBannerExpressAd = function (preload) {
if (preload === void 0) { preload = 0; }
return __awaiter(this, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
data = {
w: AppSdk_1.default.I.width,
h: AppSdk_1.default.I.width * 90 / 600,
preloading: preload,
type: 1
};
return [2 /*return*/, new Promise(function (resolve, reject) {
AppSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) {
resolve(res);
});
})];
});
});
};
TTAdSdk.prototype.closeAdverDialog = function () {
AppSdk_1.default.I.closeAdverDialog();
};
TTAdSdk.prototype.closeAdBanner = function () {
AppSdk_1.default.I.closeAdBanner();
};
TTAdSdk.prototype.showInteractionExpressAd = function (preload) {
if (preload === void 0) { preload = 0; }
return __awaiter(this, void 0, void 0, function () {
var data;
return __generator(this, function (_a) {
data = {
w: AppSdk_1.default.I.width * 0.8,
h: AppSdk_1.default.I.height,
preloading: preload,
};
return [2 /*return*/, new Promise(function (resolve, reject) {
var isComplete = false;
AppSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) {
resolve(res);
});
})];
});
});
};
Object.defineProperty(TTAdSdk, "I", {
get: function () {
return ObjectInstance_1.default.get(TTAdSdk);
},
enumerable: true,
configurable: true
});
return TTAdSdk;
}());
exports.default = TTAdSdk;
},{"../uitl/ObjectInstance":23,"./AppSdk":8,"./TeaSdk":12}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AppSdk_1 = require("./AppSdk");
/**
* 上报埋点⽇志
* 具体的打点需要跟运营联系
*/
var TeaSdk = /** @class */ (function () {
function TeaSdk() {
}
TeaSdk.prototype.dot = function (key, value) {
if (!Laya.Browser.onAndroid) {
return;
}
if (!value) {
value = '';
}
else if (typeof (value) == 'object') {
value = JSON.stringify(value);
}
AppSdk_1.default.I.appDotLog(key, value);
};
Object.defineProperty(TeaSdk, "I", {
get: function () {
return ObjectInstance_1.default.get(TeaSdk);
},
enumerable: true,
configurable: true
});
return TeaSdk;
}());
exports.default = TeaSdk;
var DotKey;
(function (DotKey) {
DotKey["proloading"] = "proloading";
DotKey["reward_ad"] = "reward_ad";
DotKey["reward_ad_fail"] = "ad_fail";
DotKey["fullScreen"] = "fullScreen";
})(DotKey = exports.DotKey || (exports.DotKey = {}));
},{"../uitl/ObjectInstance":23,"./AppSdk":8}],13:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var TrackingSdk = /** @class */ (function () {
function TrackingSdk() {
}
TrackingSdk.prototype.dot = function (key) {
AppSdk_1.default.I.appDotTracKing(key);
};
Object.defineProperty(TrackingSdk, "I", {
get: function () {
return ObjectInstance_1.default.get(TrackingSdk);
},
enumerable: true,
configurable: true
});
return TrackingSdk;
}());
exports.default = TrackingSdk;
var TrackingKey;
(function (TrackingKey) {
TrackingKey["RedPack1"] = "event_5";
TrackingKey["RedPack5"] = "event_6";
})(TrackingKey = exports.TrackingKey || (exports.TrackingKey = {}));
},{"../uitl/ObjectInstance":23,"./AppSdk":8}],14:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils_1 = require("../../uitl/ArrayUtils");
/*
* name;
*/
var BaseModel = /** @class */ (function () {
function BaseModel() {
this._data = {};
this.updateArr = [];
this.keyUpdateArr = {};
}
BaseModel.prototype.update = function (data) {
return __awaiter(this, void 0, void 0, function () {
var _loop_1, this_1, key;
var _this = this;
return __generator(this, function (_a) {
this._data = __assign({}, this._data, data);
this.updateArr.forEach(function (func) {
func(_this._data);
});
_loop_1 = function (key) {
var value = data[key];
if (value != null) {
var arr = this_1.keyUpdateArr[key];
arr && arr.forEach(function (func) {
func(value);
});
}
};
this_1 = this;
for (key in this.keyUpdateArr) {
_loop_1(key);
}
return [2 /*return*/];
});
});
};
BaseModel.prototype.waitFor = function (key) {
var _this = this;
return new Promise(function (resolve) {
var value;
value = _this._data[key];
if (value) {
resolve(value);
return;
}
var cb = function (data) {
if (data) {
resolve(data);
_this.offUpdate(cb, key);
}
};
_this.onUpdate(cb, key, true);
});
};
BaseModel.prototype.onUpdate = function (func, key, run) {
if (run === void 0) { run = true; }
if (key) {
var value = this._data[key];
run && value != null && func(value);
var arr = this.keyUpdateArr[key];
!arr && (this.keyUpdateArr[key] = arr = []);
arr.push(func);
}
else {
run && func(this._data);
this.updateArr.push(func);
}
};
BaseModel.prototype.offUpdate = function (func, key) {
if (key) {
ArrayUtils_1.default.removeFromArr(this.keyUpdateArr[key], func);
}
else {
ArrayUtils_1.default.removeFromArr(this.updateArr, func);
}
};
BaseModel.prototype.clearGame = function () {
this._data = {};
};
return BaseModel;
}());
exports.default = BaseModel;
},{"../../uitl/ArrayUtils":21}],15:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseModel_1 = require("./BaseModel");
var AdManager_1 = require("../../sdk/AdManager");
var TrackingSdk_1 = require("../../sdk/TrackingSdk");
var GoldConfigData_1 = require("../../sdk/sdkData/GoldConfigData");
var AddGoldData_1 = require("../../sdk/sdkData/AddGoldData");
var DateUtils_1 = require("../../uitl/DateUtils");
var Util_1 = require("../../uitl/Util");
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
var AppSdk_1 = require("../AppSdk");
var RedpacketModel = /** @class */ (function (_super) {
__extends(RedpacketModel, _super);
function RedpacketModel() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.MAX = 20;
/**当天领取红包的最大次数 */
_this.DAY_MAX_CNT = 50;
_this.curRedpacket = 0;
_this.confLen = 0;
return _this;
}
/**初始化红包配置 */
RedpacketModel.prototype.init = function () {
return __awaiter(this, void 0, void 0, function () {
var arr, cash;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, GoldConfigData_1.GoldConfigData.I.getGoldConfig()];
case 1:
arr = _a.sent();
cash = 0;
this.conf = {};
arr.forEach(function (confData) {
_this.conf[confData.id] = confData;
});
this.update(this.initData());
this.confLen = this.conf.length;
return [2 /*return*/];
}
});
});
};
RedpacketModel.prototype.initData = function () {
var data = new RedpacketData;
var lastTime = Util_1.default.I.getItem(Util_1.DataKey.lastTime) || '0';
data.lastTime = parseInt(lastTime);
var last = DateUtils_1.default.timeDay(data.lastTime);
var today = DateUtils_1.default.today;
if (last != today) {
data.todayCnt = 0;
lastTime = DateUtils_1.default.nowTime.toString();
Util_1.default.I.setItem(Util_1.DataKey.lastTime, lastTime);
Util_1.default.I.setItem(Util_1.DataKey.todayCnt, 0);
}
else {
var todayCnt = Util_1.default.I.getItem(Util_1.DataKey.todayCnt) || '0';
data.todayCnt = parseInt(todayCnt);
}
data.lastTime = parseInt(lastTime);
var dataCnt = Util_1.default.I.getItem(Util_1.DataKey.dataCNT) || '0';
data.cnt = parseInt(dataCnt);
data.list = [];
return data;
};
RedpacketModel.prototype.checkRedpacket = function () {
return __awaiter(this, void 0, void 0, function () {
var cnt, data, ran2, cash;
return __generator(this, function (_a) {
if (this.data.todayCnt >= this.DAY_MAX_CNT)
return [2 /*return*/, false];
if (AdManager_1.default.I.checkVideoInCd())
return [2 /*return*/, false];
/**红包获取后没有看广告领取,再次获得红包的机会,不会获取红包, 自己也可以处理成 对应的红包提醒或不需要这里的判断 */
if (this.curRedpacket) {
return [2 /*return*/, false];
}
if (undefined === this.data.cnt)
this.data.cnt = 0;
cnt = this.data.cnt;
if (cnt >= this.confLen)
cnt = this.confLen - 1;
data = this.conf[cnt + 1];
ran2 = Math.random();
if (data && ran2 < data.per) {
cash = 0.000001;
this.curRedpacket = cash;
console.log("看视频领红包");
// //**弹出红包的界面, 暂时处理成 直接看广告获取金币 */
// await AdManager.I.showRewardAd(DotKey.reward_ad)
// console.log("加金币")
// let coin = await this.addCoin(); // 看完广告获取钱(此时已经加到账户了,暂未提供提前知道获取多少钱的方法)
// console.log("获取了钱", coin)
// this.getRepacket()
// /**更新基本显示 */
// EventCenter.emit(EventEnum.UPDATE_COIN);
/*** */
return [2 /*return*/, true];
}
return [2 /*return*/, false];
});
});
};
RedpacketModel.prototype.getRepacket = function () {
if (!this.curRedpacket)
return;
this.data.cnt += 1;
this.data.list.push(this.curRedpacket);
this.data.lastTime = (new Date).getTime();
this.data.todayCnt += 1;
if (this.data.cnt == 1)
TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack1);
if (this.data.cnt == 5)
TrackingSdk_1.default.I.dot(TrackingSdk_1.TrackingKey.RedPack5);
this.curRedpacket = 0;
Util_1.default.I.setItem(Util_1.DataKey.dataCNT, this.data.cnt);
Util_1.default.I.setItem(Util_1.DataKey.todayCnt, this.data.todayCnt);
this.update(this.data);
};
/** */
RedpacketModel.prototype.getCurRedpacket = function () {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.curRedpacket];
});
});
};
Object.defineProperty(RedpacketModel.prototype, "data", {
get: function () {
return this._data;
},
enumerable: true,
configurable: true
});
/**获取总共的金币数 */
RedpacketModel.prototype.getTotalCoin = function () {
return __awaiter(this, void 0, void 0, function () {
var totalCoin;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, AppSdk_1.default.I.myCoin()];
case 1:
totalCoin = _a.sent();
return [2 /*return*/, totalCoin];
}
});
});
};
/**获取本次奖励的金币数 */
RedpacketModel.prototype.addCoin = function () {
return __awaiter(this, void 0, void 0, function () {
var coinData;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, AddGoldData_1.default.addCoin()];
case 1:
coinData = _a.sent();
return [2 /*return*/, coinData];
}
});
});
};
/**获取最低提档 */
RedpacketModel.prototype.minWithDrawal = function () {
return __awaiter(this, void 0, void 0, function () {
var minCoin;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, AppSdk_1.default.I.minWithDrawal()];
case 1:
minCoin = _a.sent();
return [2 /*return*/, minCoin];
}
});
});
};
Object.defineProperty(RedpacketModel, "I", {
get: function () {
return ObjectInstance_1.default.get(RedpacketModel);
},
enumerable: true,
configurable: true
});
return RedpacketModel;
}(BaseModel_1.default));
exports.default = RedpacketModel;
var RedpacketData = /** @class */ (function () {
function RedpacketData() {
}
return RedpacketData;
}());
var RedpacketConfigData = /** @class */ (function () {
function RedpacketConfigData() {
}
return RedpacketConfigData;
}());
},{"../../sdk/AdManager":7,"../../sdk/TrackingSdk":13,"../../sdk/sdkData/AddGoldData":16,"../../sdk/sdkData/GoldConfigData":18,"../../uitl/DateUtils":22,"../../uitl/ObjectInstance":23,"../../uitl/Util":26,"../AppSdk":8,"./BaseModel":14}],16:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("../AppSdk");
var AddGoldData = /** @class */ (function () {
function AddGoldData() {
}
AddGoldData.initData = function (data) {
if (!parseInt(data.code)) {
AddGoldData.coin = data.data.coin;
AddGoldData.mycoin = data.data.mycoin;
}
};
AddGoldData.addCoin = function () {
return __awaiter(this, void 0, void 0, function () {
var result;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, AppSdk_1.default.I.addGold()];
case 1:
result = _a.sent();
return [2 /*return*/, [parseInt(result.coin), parseInt(result.mycoin)]];
}
});
});
};
AddGoldData.coin = '0';
AddGoldData.mycoin = '0';
return AddGoldData;
}());
exports.default = AddGoldData;
},{"../AppSdk":8}],17:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
// sdk返回的用户信息
var AppSdkData = /** @class */ (function () {
function AppSdkData() {
this.isnew = 0;
}
AppSdkData.prototype.initData = function (data) {
var _a;
var d = data.data;
var isnew = d.isnew, uid = d.uid, openid = d.openid, nickname = d.nickname, headimgurl = d.headimgurl;
_a = [isnew, uid, openid, nickname, headimgurl], this.isnew = _a[0], this.uid = _a[1], this.openid = _a[2], this.nickname = _a[3], this.headimgurl = _a[4];
};
Object.defineProperty(AppSdkData, "I", {
get: function () {
return ObjectInstance_1.default.get(AppSdkData);
},
enumerable: true,
configurable: true
});
return AppSdkData;
}());
exports.AppSdkData = AppSdkData;
},{"../../uitl/ObjectInstance":23}],18:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Util_1 = require("../../uitl/Util");
var AppSdk_1 = require("../AppSdk");
var GoldConfigData = /** @class */ (function () {
function GoldConfigData() {
this.coin_config = '';
this.code = -3;
}
Object.defineProperty(GoldConfigData, "I", {
get: function () {
if (!this.instance)
this.instance = new GoldConfigData();
return this.instance;
},
enumerable: true,
configurable: true
});
GoldConfigData.prototype.initData = function (data) {
this.code = data.code;
if (!data.code) {
data = data.data;
for (var key in data) {
if (data.hasOwnProperty(key)) {
var ele = data[key];
this[key] = ele;
}
}
}
};
GoldConfigData.prototype.getGoldConfig = function () {
return __awaiter(this, void 0, void 0, function () {
var _this = this;
return __generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
var result, configJson;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
result = AppSdk_1.default.I.gameConfig;
if (!result) return [3 /*break*/, 2];
return [4 /*yield*/, this.loadGoldCfg(result['coin_config'][0])];
case 1:
configJson = _a.sent();
resolve(configJson);
_a.label = 2;
case 2: return [2 /*return*/];
}
});
}); })];
});
});
};
GoldConfigData.prototype.loadGoldCfg = function (res) {
return __awaiter(this, void 0, void 0, function () {
var configJson;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, Util_1.default.I.load(res)];
case 1:
configJson = _a.sent();
return [2 /*return*/, configJson];
}
});
});
};
GoldConfigData.instance = null;
return GoldConfigData;
}());
exports.GoldConfigData = GoldConfigData;
},{"../../uitl/Util":26,"../AppSdk":8}],19:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
var Util_1 = require("../../uitl/Util");
var LuckDrawData = /** @class */ (function () {
function LuckDrawData() {
}
Object.defineProperty(LuckDrawData, "I", {
get: function () {
return ObjectInstance_1.default.get(LuckDrawData);
},
enumerable: true,
configurable: true
});
LuckDrawData.prototype.initData = function (data) {
return __awaiter(this, void 0, void 0, function () {
var _a, red_turntable_times, red_turntable_config, shake_turntable_config, shake_turntable_times;
return __generator(this, function (_b) {
red_turntable_times = data.red_turntable_times, red_turntable_config = data.red_turntable_config, shake_turntable_config = data.shake_turntable_config, shake_turntable_times = data.shake_turntable_times;
_a = [red_turntable_times, red_turntable_config,
shake_turntable_config, shake_turntable_times], this.red_turntable_times = _a[0], this.red_turntable_config = _a[1], this.shake_turntable_config = _a[2], this.shake_turntable_times = _a[3];
return [2 /*return*/];
});
});
};
LuckDrawData.prototype.loadGoldCfg = function (res) {
return __awaiter(this, void 0, void 0, function () {
var configJson;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, Util_1.default.I.load(res)];
case 1:
configJson = _a.sent();
return [2 /*return*/, configJson];
}
});
});
};
return LuckDrawData;
}());
exports.LuckDrawData = LuckDrawData;
},{"../../uitl/ObjectInstance":23,"../../uitl/Util":26}],20:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Scene = Laya.Scene;
var REG = Laya.ClassUtils.regClass;
var ui;
(function (ui) {
var TestSceneUI = /** @class */ (function (_super) {
__extends(TestSceneUI, _super);
function TestSceneUI() {
return _super.call(this) || this;
}
TestSceneUI.prototype.createChildren = function () {
_super.prototype.createChildren.call(this);
this.loadScene("TestScene");
};
return TestSceneUI;
}(Scene));
ui.TestSceneUI = TestSceneUI;
REG("ui.TestSceneUI", TestSceneUI);
})(ui = exports.ui || (exports.ui = {}));
},{}],21:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils = /** @class */ (function () {
function ArrayUtils() {
}
/**
* 移除元素
*/
ArrayUtils.removeFromArr = function (arr, obj) {
var index = arr.indexOf(obj);
arr.splice(index, 1);
};
ArrayUtils.randomFromArr = function (arr) {
var index = Math.floor(Math.random() * arr.length);
return arr[index];
};
/**
* 数组随机排序
*/
ArrayUtils.shuffle = function (arr) {
return arr.sort(function () {
return Math.random() - 0.5;
});
};
ArrayUtils.indexOf = function (arr, callback, ctx) {
for (var i = 0; i < arr.length; i++) {
if (callback.call(ctx, this[i], i))
return i;
}
return -1;
};
ArrayUtils.each = function (arr, callback, context) {
if (typeof callback !== 'function')
throw new TypeError();
for (var i = 0, len = arr.length; i < len; i++) {
if (callback.call(context, arr[i], i, arr))
break;
}
};
ArrayUtils.queue = function (arr) {
return __awaiter(this, void 0, void 0, function () {
var res, _i, arr_1, promise;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
res = null;
_i = 0, arr_1 = arr;
_a.label = 1;
case 1:
if (!(_i < arr_1.length)) return [3 /*break*/, 4];
promise = arr_1[_i];
return [4 /*yield*/, promise(res)];
case 2:
res = _a.sent();
_a.label = 3;
case 3:
_i++;
return [3 /*break*/, 1];
case 4: return [4 /*yield*/, res];
case 5: return [2 /*return*/, _a.sent()];
}
});
});
};
ArrayUtils.getRandomArray = function (arr, count) {
var shuffled = arr.slice(0);
var len = arr.length;
var min = len - count, temp, index;
while (len-- > min) {
index = Math.floor((len + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[len];
shuffled[len] = temp;
}
return shuffled.slice(min);
};
return ArrayUtils;
}());
exports.default = ArrayUtils;
},{}],22:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
* 日期工具类
*/
var DateUtils = /** @class */ (function () {
function DateUtils() {
}
Object.defineProperty(DateUtils, "now", {
get: function () {
return Math.floor(this.nowTime / 1000);
},
enumerable: true,
configurable: true
});
Object.defineProperty(DateUtils, "nowTime", {
get: function () {
return new Date().getTime();
},
enumerable: true,
configurable: true
});
Object.defineProperty(DateUtils, "today", {
get: function () {
var time = new Date(this.nowTime);
var year = time.getFullYear();
var month = time.getMonth() + 1;
var date = time.getDate();
return year + "-" + this.add(month) + "-" + this.add(date);
},
enumerable: true,
configurable: true
});
DateUtils.timeDay = function (timeNum) {
var time = new Date(timeNum);
var year = time.getFullYear();
var month = time.getMonth() + 1;
var date = time.getDate();
return year + "-" + this.add(month) + "-" + this.add(date);
};
/**
* 根据秒数格式化字符串
* @param second 秒数
* @param type 1:00:00:00 2:yyyy-mm-dd h:m:s 3:00:00 4:xx天前,xx小时前,xx分钟前
* @return
*/
DateUtils.getFormatBySecond = function (second, type) {
if (type === void 0) { type = 1; }
var str = "";
switch (type) {
case 0:
str = this.getFormatBySecond0(second);
break;
case 1:
str = this.getFormatBySecond1(second);
break;
case 2:
str = this.getFormatBySecond2(second);
break;
case 3:
str = this.getFormatBySecond3(second);
break;
case 4:
str = this.getFormatBySecond4(second);
break;
case 5:
str = this.getFormatBySecond5(second);
break;
}
return str;
};
// 0: 00:00
DateUtils.getFormatBySecond0 = function (t) {
if (t === void 0) { t = 0; }
var minst = Math.floor(t / 60);
var secondt = Math.floor(t % 60);
var mins;
var sens;
if (minst == 0) {
mins = "00";
}
else if (minst < 10) {
mins = "0" + minst;
}
else {
mins = "" + minst;
}
if (secondt == 0) {
sens = "00";
}
else if (secondt < 10) {
sens = "0" + secondt;
}
else {
sens = "" + secondt;
}
return mins + ":" + sens;
};
//1: 00:00:00
DateUtils.getFormatBySecond1 = function (t) {
if (t === void 0) { t = 0; }
var hourst = Math.floor(t / 3600);
var hours;
var day = '';
if (hourst == 0) {
hours = "00";
}
else {
if (hourst < 10)
hours = "0" + hourst;
else {
var h = hourst % 24;
if (hourst >= 24) {
hours = h < 10 ? "0" + h : '' + h;
day = Math.floor(hourst / 24) + 'd ';
}
else
hours = h < 10 ? "0" + h : '' + h;
}
}
var minst = Math.floor((t - hourst * 3600) / 60);
var secondt = Math.floor((t - hourst * 3600) % 60);
var mins;
var sens;
if (minst == 0) {
mins = "00";
}
else if (minst < 10) {
mins = "0" + minst;
}
else {
mins = "" + minst;
}
if (secondt == 0) {
sens = "00";
}
else if (secondt < 10) {
sens = "0" + secondt;
}
else {
sens = "" + secondt;
}
return day + hours + ":" + mins + ":" + sens;
};
//3: 00:00
DateUtils.getFormatBySecond3 = function (t) {
if (t === void 0) { t = 0; }
var hourst = Math.floor(t / 3600);
var minst = Math.floor((t - hourst * 3600) / 60);
var secondt = Math.floor((t - hourst * 3600) % 60);
var mins;
var sens;
if (minst == 0) {
mins = "00";
}
else if (minst < 10) {
mins = "0" + minst;
}
else {
mins = "" + minst;
}
if (secondt == 0) {
sens = "00";
}
else if (secondt < 10) {
sens = "0" + secondt;
}
else {
sens = "" + secondt;
}
return mins + ":" + sens;
};
//2:yyyy-mm-dd h:m:s
DateUtils.getFormatBySecond2 = function (time) {
var date = new Date(time);
var year = date.getFullYear();
var month = date.getMonth() + 1; //返回的月份从0-11;
var day = date.getDate();
var hours = date.getHours();
var minute = date.getMinutes();
var second = date.getSeconds();
return year + "-" + month + "-" + day + " " + hours + ":" + minute + ":" + second;
};
//4:xx天前,xx小时前,xx分钟前
DateUtils.getFormatBySecond4 = function (time) {
var t = Math.floor(time / 3600);
if (t > 0) {
if (t > 24) {
return Math.floor(t / 24) + "天前";
}
else {
return t + "小时前";
}
}
else {
return Math.floor(time / 60) + "分钟前";
}
};
DateUtils.getFormatBySecond5 = function (time) {
// 每个时间单位所对应的秒数
var oneDay = 3600 * 24;
var oneHourst = 3600;
var oneMinst = 60;
var days = Math.floor(time / oneDay);
var hourst = Math.floor(time % oneDay / oneHourst);
var minst = Math.floor((time - hourst * oneHourst) / oneMinst); //Math.floor(time % oneDay % oneHourst / oneMinst);
var secondt = Math.floor((time - hourst * oneHourst) % oneMinst); //time;
var dayss = "";
var hourss = "";
var minss = "";
var secss = "";
if (time > 0) {
//天
if (days == 0) {
dayss = "";
//小时
if (hourst == 0) {
hourss = "";
//分
if (minst == 0) {
minss = "";
if (secondt == 0) {
secss = "";
}
else if (secondt < 10) {
secss = "0" + secondt + "秒";
}
else {
secss = "" + secondt + "秒";
}
return secss;
}
else {
minss = "" + minst + "分钟";
if (secondt == 0) {
secss = "";
}
else if (secondt < 10) {
secss = "0" + secondt + "秒";
}
else {
secss = "" + secondt + "秒";
}
}
return minss + secss;
}
else {
hourss = hourst + "小时";
if (minst == 0) {
minss = "";
if (secondt == 0) {
secss = "";
}
else if (secondt < 10) {
secss = "0" + secondt + "秒";
}
else {
secss = "" + secondt + "秒";
}
return hourss + secss;
}
else if (minst < 10) {
minss = "0" + minst + "分钟";
}
else {
minss = "" + minst + "分钟";
}
return hourss + minss;
}
}
else {
dayss = days + "天";
if (hourst == 0) {
hourss = "";
}
else {
if (hourst < 10)
hourss = "0" + hourst + "小时";
else
hourss = "" + hourst + "小时";
;
}
return dayss + hourss;
}
}
return "";
};
DateUtils.add = function (num) {
return num < 10 ? '0' + num : num;
};
return DateUtils;
}());
exports.default = DateUtils;
},{}],23:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectPool_1 = require("./ObjectPool");
/*
* name;
*/
var ObjectInstance = /** @class */ (function () {
function ObjectInstance() {
}
ObjectInstance.get = function (cls) {
var idx = this.clzs.indexOf(cls);
return (idx >= 0 && this.objects[idx]) || this.create(cls);
};
ObjectInstance.create = function (cls) {
var obj = ObjectPool_1.default.pop(cls);
this.objects.push(obj);
this.clzs.push(cls);
return obj;
};
ObjectInstance.clzs = [];
ObjectInstance.objects = [];
return ObjectInstance;
}());
exports.default = ObjectInstance;
},{"./ObjectPool":24}],24:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectPool = /** @class */ (function () {
function ObjectPool() {
}
ObjectPool.pop = function (cls) {
var idx = this.clsArr.indexOf(cls);
if (idx < 0) {
idx = this.clsArr.length;
this.clsArr.push(cls);
}
var key = 'poolKey' + idx;
var item = Laya.Pool.getItemByClass(key, cls);
item.poolKey = key;
return item;
};
ObjectPool.push = function (item) {
Laya.Pool.recover(item.poolKey, item);
};
ObjectPool.clsArr = [];
return ObjectPool;
}());
exports.default = ObjectPool;
},{}],25:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ScaleButtonScript = /** @class */ (function () {
function ScaleButtonScript() {
this.delayTime = 0;
this.minScale = 0;
}
Object.defineProperty(ScaleButtonScript.prototype, "owner", {
/**
*设置owner函数,可以直接获取到添加附加脚本的组件实例
**/
set: function (value) {
this.monkeyBox = value;
//自定义的脚本会有时序问题,所以在此添加一个延时
this.monkeyBox.frameOnce(2, this, this.onLoaded);
},
enumerable: true,
configurable: true
});
ScaleButtonScript.prototype.onLoaded = function () {
/* 设置按钮为单态按钮
** 取值:
** 1:单态。图片不做切割,按钮的皮肤状态只有一种。
** 2:两态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、按下和经过及选中状态皮肤。
** 3:三态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、经过状态皮肤、按下和选中状态皮肤
*/
//添加鼠标按下事件侦听。按时时缩小按钮。
this.monkeyBox.on(Laya.Event.MOUSE_DOWN, this, this.scaleSmall);
//添加鼠标抬起事件侦听。抬起时还原按钮。
this.monkeyBox.on(Laya.Event.MOUSE_UP, this, this.scaleBig);
//添加鼠标离开事件侦听。离开时还原按钮。
this.monkeyBox.on(Laya.Event.MOUSE_OUT, this, this.scaleBig);
};
ScaleButtonScript.prototype.scaleSmall = function () {
//缩小至0.8的缓动效果
Laya.Tween.to(this.monkeyBox, { scaleX: 0.8, scaleY: 0.8 }, 2);
};
ScaleButtonScript.prototype.scaleBig = function () {
//变大还原的缓动效果
Laya.Tween.to(this.monkeyBox, { scaleX: 1, scaleY: 1 }, 2);
};
return ScaleButtonScript;
}());
exports.default = ScaleButtonScript;
},{}],26:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Util = /** @class */ (function () {
function Util() {
}
Util.prototype.load = function (res, onProgress) {
var _this = this;
return new Promise(function (suc, fail) {
Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress);
});
};
Util.prototype.setItem = function (key, value) {
Laya.LocalStorage.setItem(key, value.toString());
};
Util.prototype.getItem = function (key) {
return Laya.LocalStorage.getItem(key);
};
Object.defineProperty(Util, "I", {
get: function () {
return this._instance || (this._instance = new Util);
},
enumerable: true,
configurable: true
});
return Util;
}());
exports.default = Util;
var DataKey;
(function (DataKey) {
DataKey["cur_red_day_limit"] = "cur_red_day_limit";
DataKey["cur_shake_day_limit"] = "cur_shake_day_limit";
DataKey["shakeLastTime"] = "shakeLastTime";
DataKey["dataCNT"] = "dataCNT";
DataKey["todayCnt"] = "todayCnt";
DataKey["lastTime"] = "lastTime";
})(DataKey = exports.DataKey || (exports.DataKey = {}));
},{}]},{},[2])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFX2JldGEyXzFfMS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2FwcC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwic3JjL0dhbWVDb25maWcudHMiLCJzcmMvTWFpbi50cyIsInNyYy9SZWREcmF3YWwudHMiLCJzcmMvVGVzdFNjZW5lLnRzIiwic3JjL2V2ZW50L0V2ZW50Q2VudGVyLnRzIiwic3JjL2V2ZW50L0V2ZW50RW51bS50cyIsInNyYy9zZGsvQWRNYW5hZ2VyLnRzIiwic3JjL3Nkay9BcHBTZGsudHMiLCJzcmMvc2RrL0x1Y2tEcmF3TW9kZWwudHMiLCJzcmMvc2RrL05hdGl2ZUFkLnRzIiwic3JjL3Nkay9UVEFkU2RrLnRzIiwic3JjL3Nkay9UZWFTZGsudHMiLCJzcmMvc2RrL1RyYWNraW5nU2RrLnRzIiwic3JjL3Nkay9tb2RlbC9CYXNlTW9kZWwudHMiLCJzcmMvc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsLnRzIiwic3JjL3Nkay9zZGtEYXRhL0FkZEdvbGREYXRhLnRzIiwic3JjL3Nkay9zZGtEYXRhL0FwcFNka0RhdGEudHMiLCJzcmMvc2RrL3Nka0RhdGEvR29sZENvbmZpZ0RhdGEudHMiLCJzcmMvc2RrL3Nka0RhdGEvTHVja0RyYXdEYXRhLnRzIiwic3JjL3VpL2xheWFNYXhVSS50cyIsInNyYy91aXRsL0FycmF5VXRpbHMudHMiLCJzcmMvdWl0bC9EYXRlVXRpbHMudHMiLCJzcmMvdWl0bC9PYmplY3RJbnN0YW5jZS50cyIsInNyYy91aXRsL09iamVjdFBvb2wudHMiLCJzcmMvdWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50cyIsInNyYy91aXRsL1V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDVkEsZ0dBQWdHO0FBQ2hH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QUFSO1FBQ0ksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFB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cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxufSkoKTtcclxuKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qKlRoaXMgY2xhc3MgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgTGF5YUFpcklERSwgcGxlYXNlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zLiAqL1xyXG5pbXBvcnQgVGVzdFNjZW5lIGZyb20gXCIuL1Rlc3RTY2VuZVwiXG5pbXBvcnQgU2NhbGVCdXR0b25TY3JpcHQgZnJvbSBcIi4vdWl0bC9TY2FsZUJ1dHRvblNjcmlwdFwiXG5pbXBvcnQgUmVkRHJhd2FsIGZyb20gXCIuL1JlZERyYXdhbFwiXG5pbXBvcnQgTmF0aXZlQWQgZnJvbSBcIi4vc2RrL05hdGl2ZUFkXCJcclxuLypcclxuKiDmuLjmiI/liJ3lp4vljJbphY3nva47XHJcbiovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhbWVDb25maWd7XHJcbiAgICBzdGF0aWMgd2lkdGg6bnVtYmVyPTc1MDtcclxuICAgIHN0YXRpYyBoZWlnaHQ6bnVtYmVyPTEzMzQ7XHJcbiAgICBzdGF0aWMgc2NhbGVNb2RlOnN0cmluZz1cImZpeGVkd2lkdGhcIjtcclxuICAgIHN0YXRpYyBzY3JlZW5Nb2RlOnN0cmluZz1cIm5vbmVcIjtcclxuICAgIHN0YXRpYyBhbGlnblY6c3RyaW5nPVwidG9wXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25IOnN0cmluZz1cImxlZnRcIjtcclxuICAgIHN0YXRpYyBzdGFydFNjZW5lOmFueT1cIlRlc3RTY2VuZS5zY2VuZVwiO1xyXG4gICAgc3RhdGljIHNjZW5lUm9vdDpzdHJpbmc9XCJcIjtcclxuICAgIHN0YXRpYyBkZWJ1Zzpib29sZWFuPWZhbHNlO1xyXG4gICAgc3RhdGljIHN0YXQ6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBwaHlzaWNzRGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBleHBvcnRTY2VuZVRvSnNvbjpib29sZWFuPXRydWU7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe31cclxuICAgIHN0YXRpYyBpbml0KCl7XHJcbiAgICAgICAgdmFyIHJlZzogRnVuY3Rpb24gPSBMYXlhLkNsYXNzVXRpbHMucmVnQ2xhc3M7XHJcbiAgICAgICAgcmVnKFwiVGVzdFNjZW5lLnRzXCIsVGVzdFNjZW5lKTtcbiAgICAgICAgcmVnKFwidWl0bC9TY2FsZUJ1dHRvblNjcmlwdC50c1wiLFNjYWxlQnV0dG9uU2NyaXB0KTtcbiAgICAgICAgcmVnKFwiUmVkRHJhd2FsLnRzXCIsUmVkRHJhd2FsKTtcbiAgICAgICAgcmVnKFwic2RrL05hdGl2ZUFkLnRzXCIsTmF0aXZlQWQpO1xyXG4gICAgfVxyXG59XHJcbkdhbWVDb25maWcuaW5pdCgpOyIsImltcG9ydCBHYW1lQ29uZmlnIGZyb20gXCIuL0dhbWVDb25maWdcIjtcclxuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XHJcbmltcG9ydCBSZWRwYWNrZXRNb2RlbCBmcm9tIFwiLi9zZGsvbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcclxuaW1wb3J0IEFwcFNkayBmcm9tIFwiLi9zZGsvQXBwU2RrXCI7XHJcbmNsYXNzIE1haW4ge1xyXG5cdGNvbnN0cnVjdG9yKCkge1xyXG5cdFx0Ly/moLnmja5JREXorr7nva7liJ3lp4vljJblvJXmk45cdFx0XHJcblx0XHRpZiAod2luZG93W1wiTGF5YTNEXCJdKSBMYXlhM0QuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCk7XHJcblx0XHRlbHNlIExheWEuaW5pdChHYW1lQ29uZmlnLndpZHRoLCBHYW1lQ29uZmlnLmhlaWdodCwgTGF5YVtcIldlYkdMXCJdKTtcclxuXHRcdExheWFbXCJQaHlzaWNzXCJdICYmIExheWFbXCJQaHlzaWNzXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YVtcIkRlYnVnUGFuZWxcIl0gJiYgTGF5YVtcIkRlYnVnUGFuZWxcIl0uZW5hYmxlKCk7XHJcblx0XHRMYXlhLnN0YWdlLnNjYWxlTW9kZSA9IEdhbWVDb25maWcuc2NhbGVNb2RlO1xyXG5cdFx0TGF5YS5zdGFnZS5zY3JlZW5Nb2RlID0gR2FtZUNvbmZpZy5zY3JlZW5Nb2RlO1xyXG5cdFx0TGF5YS5zdGFnZS5hbGlnblYgPSBHYW1lQ29uZmlnLmFsaWduVjtcclxuXHRcdExheWEuc3RhZ2UuYWxpZ25IID0gR2FtZUNvbmZpZy5hbGlnbkg7XHJcblx0XHQvL+WFvOWuueW+ruS/oeS4jeaUr+aMgeWKoOi9vXNjZW5l5ZCO57yA5Zy65pmvXHJcblx0XHRMYXlhLlVSTC5leHBvcnRTY2VuZVRvSnNvbiA9IEdhbWVDb25maWcuZXhwb3J0U2NlbmVUb0pzb247XHJcblxyXG5cdFx0Ly/miZPlvIDosIPor5XpnaLmnb/vvIjpgJrov4dJREXorr7nva7osIPor5XmqKHlvI/vvIzmiJbogIV1cmzlnLDlnYDlop7liqBkZWJ1Zz10cnVl5Y+C5pWw77yM5Z2H5Y+v5omT5byA6LCD6K+V6Z2i5p2/77yJXHJcblx0XHRpZiAoR2FtZUNvbmZpZy5kZWJ1ZyB8fCBMYXlhLlV0aWxzLmdldFF1ZXJ5U3RyaW5nKFwiZGVidWdcIikgPT0gXCJ0cnVlXCIpIExheWEuZW5hYmxlRGVidWdQYW5lbCgpO1xyXG5cdFx0aWYgKEdhbWVDb25maWcucGh5c2ljc0RlYnVnICYmIExheWFbXCJQaHlzaWNzRGVidWdEcmF3XCJdKSBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXS5lbmFibGUoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnN0YXQpIExheWEuU3RhdC5zaG93KCk7XHJcblx0XHRMYXlhLmFsZXJ0R2xvYmFsRXJyb3IgPSB0cnVlO1xyXG5cclxuXHRcdC8v5r+A5rS76LWE5rqQ54mI5pys5o6n5Yi277yMdmVyc2lvbi5qc29u55SxSURF5Y+R5biD5Yqf6IO96Ieq5Yqo55Sf5oiQ77yM5aaC5p6c5rKh5pyJ5Lmf5LiN5b2x5ZON5ZCO57ut5rWB56iLXHJcblx0XHRMYXlhLlJlc291cmNlVmVyc2lvbi5lbmFibGUoXCJ2ZXJzaW9uLmpzb25cIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uVmVyc2lvbkxvYWRlZCksIExheWEuUmVzb3VyY2VWZXJzaW9uLkZJTEVOQU1FX1ZFUlNJT04pO1xyXG5cdH1cclxuXHJcblx0b25WZXJzaW9uTG9hZGVkKCk6IHZvaWQge1xyXG5cdFx0Ly/mv4DmtLvlpKflsI/lm77mmKDlsITvvIzliqDovb3lsI/lm77nmoTml7blgJnvvIzlpoLmnpzlj5HnjrDlsI/lm77lnKjlpKflm77lkIjpm4bph4zpnaLvvIzliJnkvJjlhYjliqDovb3lpKflm77lkIjpm4bvvIzogIzkuI3mmK/lsI/lm75cclxuXHRcdExheWEuQXRsYXNJbmZvTWFuYWdlci5lbmFibGUoXCJmaWxlY29uZmlnLmpzb25cIiwgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCB0aGlzLm9uQ29uZmlnTG9hZGVkKSk7XHJcblx0fVxyXG5cclxuXHRvbkNvbmZpZ0xvYWRlZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaW5pdFNkaygpO1xyXG5cdFx0dGhpcy5sb2FkRGF0YSgpO1xyXG5cdH1cclxuXHJcblx0Lyoq5Yid5aeL5YyWU0RLICovXHJcblx0cHJpdmF0ZSBhc3luYyBpbml0U2RrKCkge1xyXG5cdFx0aWYgKEFwcFNkay5JLmlzTXlCcmlkZ2UpIHtcclxuXHRcdFx0QXBwU2RrLmluaXQoKVxyXG5cdFx0XHRhd2FpdCBBcHBTZGsuSS5pbml0U2RrKCk7XHJcblx0XHRcdHRoaXMudG9nZ2xlU2NlbmUoKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdExheWEudGltZXIub25jZSgxMDAsIHRoaXMsIHRoaXMuaW5pdFNkayk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGxvYWREYXRhKCkge1xyXG5cdFx0Ly8g5aSE55CG5ri45oiP5Yqg6L29XHJcblxyXG5cclxuXHRcdC8v5Yqg6L295a6M5oiQXHJcblx0XHR0aGlzLnRvZ2dsZVNjZW5lKCk7XHJcblxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBjaGVja0xvYWQ6IG51bWJlciA9IDA7XHJcblx0cHJpdmF0ZSB0b2dnbGVTY2VuZSgpIHtcclxuXHRcdC8v5Yqg6L29SURF5oyH5a6a55qE5Zy65pmvXHJcblx0XHR0aGlzLmNoZWNrTG9hZCsrO1xyXG5cdFx0aWYgKHRoaXMuY2hlY2tMb2FkIDwgMikge1xyXG5cdFx0XHRyZXR1cm5cclxuXHRcdH1cclxuXHRcdEFwcFNkay5JLmhpZGVTcGxhc2goKTsvL+makOiXj+WKoOi9vemhtSDlj6/moLnmja7pnIDmsYLmlL7liLDlhbbku5bkvY3nva5cclxuXHRcdEdhbWVDb25maWcuc3RhcnRTY2VuZSAmJiBMYXlhLlNjZW5lLm9wZW4oR2FtZUNvbmZpZy5zdGFydFNjZW5lKTtcclxuXHR9XHJcbn1cclxuLy/mv4DmtLvlkK/liqjnsbtcclxubmV3IE1haW4oKTtcclxuIiwiaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi9ldmVudC9FdmVudENlbnRlclwiO1xuaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vZXZlbnQvRXZlbnRFbnVtXCI7XG4vKipcbiAqIOS4u+eVjOmdoiAg6YeR5biB6YeR6aKdXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZERyYXdhbCBleHRlbmRzIExheWEuU2NyaXB0IHtcbiAgICAvKiogQHByb3Age25hbWU6Y29pbmxhYiwgdGlwczpcIumHkeW4gVwiLCB0eXBlOk5vZGV9Ki9cbiAgICBjb2lubGFiOiBMYXlhLkxhYmVsO1xuICAgIC8qKiBAcHJvcCB7bmFtZTp0aXBsYWIsIHRpcHM6XCLmj5DnpLpcIiwgdHlwZTpOb2RlfSovXG4gICAgdGlwbGFiOiBMYXlhLkxhYmVsO1xuXG4gICAgcHJpdmF0ZSB0b3RhbENvaW46IG51bWJlciA9IDExMDtcblxuICAgIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG4gICAgb25TdGFydCgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTdGFyKCk7XG4gICAgICAgIC8vIHRoaXMudGlwbGFiLnZpc2libGUgPSBmYWxzZTtcbiAgICB9XG4gICAgb25FbmFibGUoKSB7XG4gICAgICAgIEV2ZW50Q2VudGVyLmFkZChFdmVudEVudW0uQVBQX1NIT1csIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgICAgIEV2ZW50Q2VudGVyLmFkZChFdmVudEVudW0uVVBEQVRFX0NPSU4sIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgfVxuXG4gICAgb25EaXNhYmxlKCkge1xuICAgICAgICBFdmVudENlbnRlci5yZW1vdmUoRXZlbnRFbnVtLkFQUF9TSE9XLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgICAgICBFdmVudENlbnRlci5yZW1vdmUoRXZlbnRFbnVtLlVQREFURV9DT0lOLCB0aGlzLCB0aGlzLnVwZGF0ZVN0YXIpO1xuICAgIH1cblxuICAgIGFzeW5jIHVwZGF0ZVN0YXIoKSB7XG4gICAgICAgIGxldCBjb2luID0gYXdhaXQgUmVkcGFja2V0TW9kZWwuSS5nZXRUb3RhbENvaW4oKTtcbiAgICAgICAgLy8gbGV0IGNvaW4gPSAxMDAwXG4gICAgICAgIHRoaXMudG90YWxDb2luID0gY29pbjtcbiAgICAgICAgdGhpcy5jb2lubGFiLnRleHQgPSAnJyArIGNvaW47XG4gICAgICAgIGxldCBzdHIgPSAn5Y+v5o+Q546wJztcbiAgICAgICAgLyoq5pu05paw5LiL5LiL5LiA5qyh5o+Q546w55qE6aKd5bqmICovXG4gICAgICAgIGxldCBuZXh0RHJhd2FsID0gYXdhaXQgUmVkcGFja2V0TW9kZWwuSS5taW5XaXRoRHJhd2FsKCk7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsQ29pbiA+IDApIHtcbiAgICAgICAgICAgIGxldCBsZWZ0Q29pbiA9IG5leHREcmF3YWwgLSB0aGlzLnRvdGFsQ29pbjtcbiAgICAgICAgICAgIGlmIChsZWZ0Q29pbiA+IDApXG4gICAgICAgICAgICAgICAgc3RyID0gYOi/mOW3riR7KGxlZnRDb2luIC8gMTAwMDApLnRvRml4ZWQoMyl96YeR6aKd5Y+v5o+Q546wYDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpcGxhYi50ZXh0ID0gc3RyO1xuICAgICAgICB0aGlzLnRpcGxhYi52aXNpYmxlID0gQm9vbGVhbihuZXh0RHJhd2FsKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgdWkgfSBmcm9tIFwiLi91aS9sYXlhTWF4VUlcIjtcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vc2RrL0FkTWFuYWdlclwiO1xuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbFwiO1xuaW1wb3J0IEFwcFNkayBmcm9tIFwiLi9zZGsvQXBwU2RrXCI7XG5pbXBvcnQgeyBEb3RLZXkgfSBmcm9tIFwiLi9zZGsvVGVhU2RrXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9ldmVudC9FdmVudEVudW1cIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFNjZW5lIGV4dGVuZHMgdWkuVGVzdFNjZW5lVUkge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvL+WFs+mXreWkmueCueinpuaOp++8jOWQpuWImeWwseaXoOaVjOS6hlxuICAgICAgICBMYXlhLk1vdXNlTWFuYWdlci5tdWx0aVRvdWNoRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tVGVzdFNjZW5lLS0tLS0tLScpXG4gICAgICAgIHRoaXMuTmF0aXZlQUQudmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgfVxuXG4gICAgb25FbmFibGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYnRuU2VydmVyLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblNlcnZlcik7XG4gICAgICAgIHRoaXMuYnRuRHJhd2FsLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblBlcnNvbmFsKTtcbiAgICAgICAgdGhpcy5idG5EcmF3Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25EcmF3KTtcbiAgICAgICAgdGhpcy5idG5JbnZpdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5pbnZpdGF0aW9uKTtcbiAgICAgICAgdGhpcy5idG5WaWJyYXRlLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub25WaWJyYXRlKTtcbiAgICAgICAgdGhpcy5idG5QcmVsb2FkQUQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5wcmVsb2FkQUQpO1xuICAgICAgICB0aGlzLmJ0blNob3dCYW5uZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93QmFubmVyKTtcbiAgICAgICAgdGhpcy5idG5TaG93RnVsbEFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0Z1bGxBZCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd05hdGl2ZUFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd05hdGl2ZUFkKTtcbiAgICAgICAgdGhpcy5idG5TaG93SW50ZXJBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dJbnRlckFkKTtcbiAgICAgICAgdGhpcy5idG5SZXdhcmRBZC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dSZXdhcmRBZCk7XG4gICAgICAgIHRoaXMuYnRuUmVkcGFja2V0Lm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMub3BlblJlZHBhY2tldCk7XG5cbiAgICB9XG5cbiAgICAvKirpooTliqDovb3lub/lkYogKi9cbiAgICBhc3luYyBwcmVsb2FkQUQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1wcmVsb2FkQUQtLS0tLS0tJylcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuaW5pdCgpO1xuICAgICAgICAvLyBNeUJyaWRnZS50ZXN0UmV0dXJuKGZ1bmN0aW9uICguLi5hcnJheSkge1xuICAgICAgICAvLyAgICAgY29uc29sZS5sb2coXCItLS0tLS0td2ViLS0tLS0tLS1vbkNsaWNrLS0tLS0+PmNvY29zIEpTLS0tLS0tLU15QnJpZGdlLnRlc3RSZXR1cm4tLS0tLS1cIiArIEpTT04uc3RyaW5naWZ5KGFycmF5KSk7XG5cbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgLyoq5pi+56S65YWo5bGP5bm/5ZGKICovXG4gICAgc2hvd0Z1bGxBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dGdWxsQWQtLS0tLS0tJylcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0Z1bGxBZCgpO1xuICAgICAgICAvLyB2YXIgcmV0ID0gTXlCcmlkZ2UubWFwVG9TdHJpbmcoe1xuICAgICAgICAvLyAgICAgZGF0YToge1xuICAgICAgICAvLyAgICAgICAgIFwiY291bnRcIjogMiwgXCJ0aXRsZVwiOiBbeyBcIm5hbWVcIjogXCJubm5cIiwgXCJ2YWx1ZVwiOiBcIm5ubnZhbHVlXCIsIFwiZGVmYXVsdF9zaG93XCI6IDEgfVxuICAgICAgICAvLyAgICAgICAgICAgICAsIHsgXCJuYW1lXCI6IFwibW1tXCIsIFwidmFsdWVcIjogXCJtbW12YWx1ZVxcXCJhYXNkYXNkXCIgfV1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXCItLS0tLS0td2ViLS0tLS0tLS1vbkNsaWNrLS0tLS0+PmNvY29zIEpTLS0tLS0tLU15QnJpZGdlLm1hcFRvU3RyaW5nLS0tLS0tXCIgKyBKU09OLnN0cmluZ2lmeShyZXQpKTtcbiAgICB9XG4gICAgLyoq5pi+56S6YmFubmVyICovXG4gICAgc2hvd0Jhbm5lcigpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dCYW5uZXItLS0tLS0tJylcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd0Jhbm5lcigpO1xuICAgIH1cblxuICAgIC8qKuS/oeaBr+a1geW5v+WRiiAqL1xuICAgIHNob3dOYXRpdmVBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dOYXRpdmVBZC0tLS0tLS0nKVxuICAgICAgICB0aGlzLk5hdGl2ZUFELnZpc2libGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKuaPkuWxj+W5v+WRiiAqL1xuICAgIHNob3dJbnRlckFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0ludGVyQWQtLS0tLS0tJylcblxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93SW50ZXJBZCgpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopHlub/lkYogKi9cbiAgICBhc3luYyBzaG93UmV3YXJkQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93UmV3YXJkQWQtLS0tLS0tJylcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCd2aWRlb1R5cGUnKTtcbiAgICAgICAgLyoq5oiQ5Yqf5ZCO5omn6KGM5a+55bqU55qE5aWW5YqxICovXG4gICAgfVxuICAgIC8qKuaEj+ingeWPjemmiCAqL1xuICAgIG9wZW5TZXJ2ZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1vcGVuU2VydmVyLS0tLS0tLScpXG4gICAgICAgIEFwcFNkay5JLmZlZWRiYWNrKCk7XG4gICAgfVxuXG5cbiAgICBhc3luYyBvcGVuUmVkcGFja2V0KCkge1xuICAgICAgICBsZXQgYm9sID0gUmVkcGFja2V0TW9kZWwuSS5jaGVja1JlZHBhY2tldCgpO1xuICAgICAgICBjb25zb2xlLmxvZyhib2wgKyAn57qi5YyF6I635Y+W57uT5p6c77yaY3VyUmVkcGFja2V0JyArIFJlZHBhY2tldE1vZGVsLkkuY3VyUmVkcGFja2V0KVxuICAgICAgICBpZiAoYm9sKSB7XG4gICAgICAgICAgICAvLyoq5by55Ye657qi5YyF55qE55WM6Z2iLCAg5pqC5pe25aSE55CG5oiQIOebtOaOpeeci+W5v+WRiuiOt+WPlumHkeW4gSAqL1xuICAgICAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKERvdEtleS5yZXdhcmRfYWQpLnRoZW4oYXN5bmMgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi5Yqg6YeR5biBXCIpXG4gICAgICAgICAgICAgICAgbGV0IGNvaW4gPSBhd2FpdCBSZWRwYWNrZXRNb2RlbC5JLmFkZENvaW4oKTsgLy8g55yL5a6M5bm/5ZGK6I635Y+W6ZKx77yI5q2k5pe25bey57uP5Yqg5Yiw6LSm5oi35LqG77yM5pqC5pyq5o+Q5L6b5o+Q5YmN55+l6YGT6I635Y+W5aSa5bCR6ZKx55qE5pa55rOV77yJXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bkuobpkrFcIiwgY29pbilcbiAgICAgICAgICAgICAgICBSZWRwYWNrZXRNb2RlbC5JLmdldFJlcGFja2V0KCk7Ly/orqHmlbBcbiAgICAgICAgICAgICAgICAvKirmm7TmlrDln7rmnKzmmL7npLogKi9cbiAgICAgICAgICAgICAgICBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5VUERBVEVfQ09JTik7XG4gICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib25WaWRlbyBlcnJvclwiKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCfnuqLljIXojrflj5bnu5PmnpzvvJonICsgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkkub3BlblBvcHdpbihSZWRwYWNrZXRQb3B3aW4sIDApO1xuICAgIH1cblxuICAgIC8qKuaJk+W8gOS4quS6uuS4reW/gyAqL1xuICAgIG9wZW5QZXJzb25hbCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLW9wZW5TZXJ2ZXItLS0tLS0tJylcbiAgICAgICAgQXBwU2RrLkkucGVyc29uYWwoKTtcbiAgICB9XG4gICAgLyoq6YKA6K+35aW95Y+LICovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgQXBwU2RrLkkuaW52aXRhdGlvbigpO1xuICAgIH1cbiAgICAvL+mch+WKqFxuICAgIHByaXZhdGUgb25WaWJyYXRlKCkge1xuICAgICAgICBBcHBTZGsuSS52aWJyYXRlKDApXG4gICAgfVxuXG5cbiAgICBnZXRQcm9wcyhkYXRhKSB7XG4gICAgICAgIGxldCBib29zdGVyO1xuICAgICAgICBsZXQgcmV3YXJkTnVtID0gZGF0YS5udW07XG4gICAgICAgIGxldCB0eXBlID0gZGF0YS50eXBlO1xuICAgICAgICAvKipcbiAgICAgICAgICog5aSE55CG5ri45oiP5Lit55qE6YGT5YW35pi+56S6XG4gICAgICAgICAqL1xuICAgICAgICAvLyBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgLy8gICAgIGNhc2UgNDpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVtb3ZlO1xuICAgICAgICAvLyAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyAgICAgY2FzZSA2OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5DaGFuZ2U7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDU6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJlZnJlc2g7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDc6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlJhbmRSZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDM6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLlN0YXI7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlY2VpdmVQcm9wc1BvcHdpbiwgYm9vc3RlciwgcmV3YXJkTnVtKTtcblxuICAgIH1cbiAgICAvKipcbiAgICAgKiDnnIvlub/lkYrojrflvpfnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyB3YXRjaEFEQ29pbigpIHtcbiAgICAgICAgYXdhaXQgQWRNYW5hZ2VyLkkuc2hvd1Jld2FyZEFkKCd2aWRlb1R5cGUnKTtcbiAgICAgICAgdGhpcy5nZXRDb2luKCk7XG4gICAgfVxuICAgIC8qKuebtOaOpeiOt+W+l+e6ouWMhSAqL1xuICAgIGdldENvaW4oKSB7XG4gICAgICAgIC8vXGLliLfmlrDmgLvph5HluIFcbiAgICAgICAgLy8gQXBwTWFuYWdlci5JLnJlZHBhY2tldC5nZXRSZXBhY2tldCgpXG4gICAgICAgIC8vIFZpZXdNYW5hZ2VyLkkub3BlblBvcHdpbihSZWRQYWNrZXRSZXdhcmQsIDIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EcmF3KCkge1xuICAgICAgICBBcHBTZGsuSS5vcGVuUmV3YXJkKClcbiAgICB9XG59IiwiaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4vRXZlbnRFbnVtXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGNsYXNzIEV2ZW50Q2VudGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IExheWEuRXZlbnREaXNwYXRjaGVyO1xuICAgIHByaXZhdGUgc3RhdGljIGdldCBJKCk6IExheWEuRXZlbnREaXNwYXRjaGVyIHtcbiAgICAgICAgd2luZG93WydldiddID0gdGhpcy5faW5zdGFuY2U7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZSB8fCAodGhpcy5faW5zdGFuY2UgPSBuZXcgTGF5YS5FdmVudERpc3BhdGNoZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZW1pdChldmVudDogRXZlbnRFbnVtLCAuLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuSS5ldmVudChldmVudC50b1N0cmluZygpLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZCh0eXBlOiBFdmVudEVudW0sIGNhbGxlcjogYW55LCBsaXN0ZW5lcjogRnVuY3Rpb24sIGFyZ3M/OiBBcnJheTxhbnk+KSB7XG4gICAgICAgIHRoaXMuSS5vbih0eXBlLnRvU3RyaW5nKCksIGNhbGxlciwgbGlzdGVuZXIsIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgcmVtb3ZlKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLkkub2ZmKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lcik7XG4gICAgfVxufSIsImV4cG9ydCBlbnVtIEV2ZW50RW51bSB7XG5cblx0Q0hFQ0tfUkVEUEFDS0VUID0gPGFueT4nY2hlY2tfcmVkcGFja2V0Jyxcblx0QVBQX1NIT1cgPSA8YW55PidhcHAuc2hvdycsXG5cdEFQUF9ISURFID0gPGFueT4nYXBwLmhpZGUnLFxuXG5cblx0VVBEQVRFX0NPSU4gPSA8YW55Pid1cGRhdGUuY29pbicsXG5cbn0iLCJpbXBvcnQgVFRBZFNkayBmcm9tIFwiLi9UVEFkU2RrXCI7XHJcbmltcG9ydCB7IEFwcFNka0RhdGEgfSBmcm9tIFwiLi9zZGtEYXRhL0FwcFNka0RhdGFcIjtcclxuaW1wb3J0IFRlYVNkaywgeyBEb3RLZXkgfSBmcm9tIFwiLi9UZWFTZGtcIjtcclxuaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZE1hbmFnZXIge1xyXG4gICAgcHJpdmF0ZSBsYXN0VmlkZW9UaW1lOiBudW1iZXI7XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgIHRoaXMucHJlbG9hZEJhbm5lcigpO1xyXG4gICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZFJld2FyZEFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5zaG93UmV3YXJkVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkRnVsbEFkKCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoMSk7XHJcbiAgICB9XHJcbiAgICBwcmVsb2FkTmF0aXZlQWRZTEgoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWROYXRpdmVBZFlMSCgxLCAxLCA2MDAsIDMwMCwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZEludGVyQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkTmF0aXZlQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xyXG4gICAgICAgIGlmICghTGF5YS5Ccm93c2VyLm9uQW5kcm9pZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFRUQWRTZGsuSS5jbG9zZUFkdmVyRGlhbG9nKClcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmNsb3NlQWRCYW5uZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dSZXdhcmRBZChwb2ludDogRG90S2V5IHwgc3RyaW5nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IFRUQWRTZGsuSS5zaG93UmV3YXJkVmlkZW9BZCgwLCBwb2ludCk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMubGFzdFZpZGVvVGltZSA9IExheWEudGltZXIuY3VyclRpbWVyO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgIC8vIC8vIOWKoOi9vea/gOWKseinhumikeWksei0peiwg+eUqOWFqOWxj+inhumikeW5tui/lOWbnuaIkOWKn++8gVxyXG4gICAgICAgICAgICAvLyB0aGlzLnNob3dGdWxsQWQoKS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XHJcbiAgICAgICAgICAgIC8vIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgICB0aGlzLnByZWxvYWRSZXdhcmRBZCgpO1xyXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAvLyB9KVxyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGFzeW5jIHNob3dGdWxsQWQoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJldCA9IGF3YWl0IFRUQWRTZGsuSS5sb2FkRnVsbFNjcmVlblZpZGVvQWQoKTtcclxuXHJcbiAgICAgICAgICAgIFRlYVNkay5JLmRvdChEb3RLZXkuZnVsbFNjcmVlbiwgeyBmcm9tOiAnc2hvdycgfSk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJldCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRGdWxsQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaG93SW50ZXJBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZCgpO1xyXG4gICAgICAgICAgICB0aGlzLnByZWxvYWRJbnRlckFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgY2hlY2tWaWRlb0luQ2QoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFzdFZpZGVvVGltZSAmJiAoTGF5YS50aW1lci5jdXJyVGltZXIgLSB0aGlzLmxhc3RWaWRlb1RpbWUgPD0gMzAwMDApO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dCYW5uZXIoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93TmF0aXZlQWQoeCwgeSwgdywgaCwgcHJlbG9hZCA9IDApIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZE5hdGl2ZUV4cHJlc3NBZCh4LCB5LCB3LCBoLCBwcmVsb2FkKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDkvJjph4/msYfkv6Hmga/mtYHlub/lkYpcclxuICAgIHNob3dOYXRpdmVBZFlMSCh4LCB5LCB3LCBoLCBwcmVsb2FkID0gMCkge1xyXG4gICAgICAgIHJldHVybiBUVEFkU2RrLkkubG9hZE5hdGl2ZUFkWUxIKHgsIHksIHcsIGgsIHByZWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkub3BlbkxvYWROYXRpdmVBZEV2ZW50KClcclxuICAgIH1cclxuXHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IEFkTWFuYWdlciB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChBZE1hbmFnZXIpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XG5pbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuL0FkTWFuYWdlclwiO1xuaW1wb3J0IFJlZHBhY2tldE1vZGVsIGZyb20gXCIuL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgTHVja0RyYXdNb2RlbCBmcm9tIFwiLi9MdWNrRHJhd01vZGVsXCI7XG5pbXBvcnQgeyBBcHBTZGtEYXRhIH0gZnJvbSBcIi4vc2RrRGF0YS9BcHBTZGtEYXRhXCI7XG5pbXBvcnQgeyBMdWNrRHJhd0RhdGEgfSBmcm9tIFwiLi9zZGtEYXRhL0x1Y2tEcmF3RGF0YVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBcHBTZGsge1xuICAgIHByaXZhdGUgX3dpZHRoOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfaGVpZ2h0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfY2hhbm5lbDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3ZlcnNpb246IHN0cmluZztcbiAgICBwcml2YXRlIF9sZXZlbDogbnVtYmVyO1xuICAgIHByaXZhdGUgX2dhbWVDb25maWc6IG51bWJlcjtcblxuICAgIHB1YmxpYyBwYW5nb2xpbklkOiBzdHJpbmc7XG4gICAgcHVibGljIGFkbmV0SWQ6IHN0cmluZztcbiAgICBwdWJsaWMgdWlkOiBudW1iZXJcbiAgICBwdWJsaWMgaXNNeUJyaWRnZTogYm9vbGVhblxuICAgIHB1YmxpYyBpc0hpZGU6IGJvb2xlYW5cblxuICAgIHN0YXRpYyBhc3luYyBpbml0KCkge1xuICAgICAgICBBcHBTZGsuSS5nZXRTeXN0ZW1JbmZvKClcbiAgICAgICAgQXBwU2RrLkkuaW5pdEdhbWVDb25maWcoKTtcbiAgICAgICAgQWRNYW5hZ2VyLkkuaW5pdCgpOy8v6aKE5Yqg6L295bm/5ZGKIFxuICAgICAgICBhd2FpdCBPYmplY3RJbnN0YW5jZS5nZXQoUmVkcGFja2V0TW9kZWwpLmluaXQoKTtcbiAgICAgICAgTHVja0RyYXdNb2RlbC5JLmluaXQoKTtcbiAgICB9XG5cbiAgICBpbml0U2RrKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRVc2VySW5mbygpO1xuICAgICAgICAgICAgcmVzb2x2ZSgxKVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IG15QnJpZGdlKCkge1xuICAgICAgICBpZiAodHlwZW9mIE15QnJpZGdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIE15QnJpZGdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignIG5vIHJlZ2lzdGVyIG15QnJpZGdlISEhJylcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbiAgICAvKirojrflj5bln7rmnKzniYjmnKzkv6Hmga/ku6Xlj4rmiYvmnLrnmoTphY3nva4gKi9cbiAgICBnZXRTeXN0ZW1JbmZvKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICBsZXQgcmV0ID0gdGhpcy5teUJyaWRnZS5nZXRTeXN0ZW1JbmZvKGtleSk7XG4gICAgICAgIGxldCB7IHcsIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsIH0gPSBKU09OLnBhcnNlKHJldCk7XG4gICAgICAgIFt0aGlzLl93aWR0aCwgdGhpcy5faGVpZ2h0LCB0aGlzLl92ZXJzaW9uLFxuICAgICAgICB0aGlzLl9jaGFubmVsLCB0aGlzLnBhbmdvbGluSWQsXG4gICAgICAgIHRoaXMuYWRuZXRJZCwgdGhpcy5fbGV2ZWxdID0gW3csIGgsIHZlcnNpb25OYW1lLCBjaGFubmVsLCBwYW5nb2xpbiwgYWRuZXQsIGxldmVsXTtcblxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VXNlckluZm8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS1nZXRVc2VySW5mb+WbnuiwgyDliY0tLS0tLS0tLS0tLS0tLS1cIilcbiAgICAgICAgICAgIHRoaXMubXlCcmlkZ2UuZ2V0R2FtZVVzZXJJbmZvKChyZXQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS1nZXRVc2VySW5mb+Wbnuiwgy0tLS0tLS0tLS0tLS0tLVwiLCByZXQpXG4gICAgICAgICAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UocmV0KTtcbiAgICAgICAgICAgICAgICBBcHBTZGtEYXRhLkkuaW5pdERhdGEocmVzKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKDEpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBpbml0R2FtZUNvbmZpZygpIHtcbiAgICAgICAgdGhpcy5fZ2FtZUNvbmZpZyA9IHRoaXMuZ2V0R2FtZUNvbmZpZygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOmch+WKqFxuICAgICAqIEBwYXJhbSBrZXkgMCDnn63pnIfliqggMSDplb/pnIfliqhcbiAgICAgKi9cbiAgICB2aWJyYXRlKGtleTogbnVtYmVyID0gMCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5TeXN0ZW1GdW4oa2V5KTtcbiAgICB9XG5cbiAgICAvKirpmpDol4/lkK/liqjlsY8gKi9cbiAgICBoaWRlU3BsYXNoKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmhpZGVTcGxhc2goKTtcbiAgICB9XG5cbiAgICAvKirlvLnlh7rmj5DnjrAgKi9cbiAgICB3aXRoRHJhd2FsKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLndpdGhEcmF3YWwoKTtcbiAgICB9XG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXG4gICAgZmVlZGJhY2soKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuZmVlZGJhY2soKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICoga2V5IOm7mOiupDAg77yM562+5YiwIDFcbiAgICAgKi9cbiAgICBwZXJzb25hbCgpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5wZXJzb25hbCgpO1xuICAgIH1cbiAgICAvKirpgoDor7flpb3lj4sqL1xuICAgIGludml0YXRpb24oKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuaW52aXRhdGlvbigpO1xuICAgIH1cblxuICAgIC8qKumCgOivt+WlveWPiyovXG4gICAgb3BlblJld2FyZCgpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5vcGVuUmV3YXJkKCk7XG4gICAgfVxuICAgIC8qKuetvuWIsCovXG4gICAgb3BlblNpZ25pbigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5vcGVuU2luZ2luKCk7XG4gICAgfVxuXG4gICAgcHV0RGF0YShrZXk6IFN0cmluZywgdmFsdWU6IFN0cmluZykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnB1dERhdGEoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBrZXkgIOWtmOaVsOaNrueahOaXtuWAmeeahOWUr+S4gGtleVxuICAgICAqIEByZXR1cm4gIOWtmOWCqOeahOaVsOaNrlxuICAgICAqICovXG4gICAgZ2V0RGF0YShrZXk6IFN0cmluZykge1xuICAgICAgICBsZXQgcmV0ID0gdGhpcy5teUJyaWRnZS5nZXREYXRhKGtleSk7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJldCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6I635Y+W5ri45oiP6YWN572uXG4gICAgICovXG4gICAgcHVibGljIGdldEdhbWVDb25maWcoKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm15QnJpZGdlLmdldEdhbWVDb25maWcoKTtcbiAgICAgICAgY29uc29sZS5sb2coXCLojrflj5bmuLjmiI/phY3nva5cIixKU09OLnN0cmluZ2lmeShyZXN1bHQpKVxuICAgICAgICBMdWNrRHJhd0RhdGEuSS5pbml0RGF0YShKU09OLnBhcnNlKHJlc3VsdClbJ2RyYXcnXSk7Ly/ovaznm5jmlbDmja7phY3nva5cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICog6KaB5rGC5Y+R5pS+6YeR5biBXG4gICAgICogQHBhcmFtIGtleSAx57qi5YyFXG4gICAgICovXG4gICAgYXN5bmMgYWRkR29sZChrZXkgPSAxKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXlCcmlkZ2UuYWRkR29sZChrZXksIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLopoHmsYLlj5HmlL7ph5HluIFcIixKU09OLnN0cmluZ2lmeShyZXMpKVxuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOimgeaxguWPkeaUvumHkeW4gSDlj6/nv7vlgI3nsbvlnotcbiAgICAgKi9cbiAgICBhc3luYyByZXdhcmRJbmZvKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm15QnJpZGdlLnJld2FyZEluZm8ocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvaW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cbiAgICAvKipcbiAgICAgKiDojrflj5blj4zlgI3ph5HluIFcbiAgICAgKiBAcGFyYW0gdHlwZSAx5Y6f6YeR5biBIDLlj4zlgI3ph5HluIFcbiAgICAgKi9cbiAgICBhc3luYyB0d29mb2xkUmV3YXJkKHR5cGU6IG51bWJlciA9IDEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5teUJyaWRnZS50d29mb2xkUmV3YXJkKHR5cGUsIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YS5jb2luKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKirojrflj5bmgLvph5HluIEgKi9cbiAgICBhc3luYyBteUNvaW4oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubXlCcmlkZ2UubXlDb2luKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVsnY29pbiddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuXG4gICAgLyoq6I635Y+W5b2T5YmN5o+Q546w55qE5qGj5L2NICovXG4gICAgYXN5bmMgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5taW5XaXRoRHJhd2FsKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YVsnbW9uZXknXSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvKirkuIrmiqXln4vngrkgKi9cbiAgICBhcHBEb3RMb2coa2V5OiBzdHJpbmcsIHZhbHVlPykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmFwcERvdExvZyhrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLyoq54Ot5LqR5omT54K5ICovXG4gICAgYXBwRG90VHJhY0tpbmcoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5hcHBEb3RUcmFjS2luZyhrZXkpO1xuICAgIH1cblxuICAgIHNldENhbGxiYWNrKGZ1bk5hbWU6IHN0cmluZywgcHJhbWFzPzogYW55KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zZXRDYWxsYmFjay0tLS0gdGhpcy5teUJyaWRnZS0tLScgKyBKU09OLnN0cmluZ2lmeSh0aGlzLm15QnJpZGdlKSlcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXlCcmlkZ2VbZnVuTmFtZV0ocHJhbWFzLCByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIGRhdGEgfSA9IEpTT04ucGFyc2UocmVzKTtcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgY2xvc2VBZHZlckRpYWxvZygpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuY2xvc2VBZEJhbm5lcigpO1xuICAgIH1cbiAgICAvKirmv4DlirHop4bpopEgKi9cbiAgICBzaG93UmV3YXJkVmlkZW9BZCh2YWx1ZTogSVZpZGVvLCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnNob3dSZXdhcmRWaWRlb0FkKHZhbHVlLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKiog5YWo5bGP5bm/5ZGKKi9cbiAgICBsb2FkRnVsbFNjcmVlblZpZGVvQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWRGdWxsU2NyZWVuVmlkZW9BZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKirkv6Hmga/mtYHlub/lkYogKi9cbiAgICBsb2FkTmF0aXZlRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkTmF0aXZlRXhwcmVzc0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKuS/oeaBr+a1geW5v+WRii0g5LyY6YeP5rGHICovXG4gICAgbG9hZE5hdGl2ZUFkWUxIKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5sb2FkTmF0aXZlQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLy8g5omT5byA5L+h5oGv5rWBLeS8mOmHj+axh1xuICAgIG9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpe1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpXG4gICAgfVxuICAgIC8qKmJhbm5lciAqL1xuICAgIGxvYWRCYW5uZXJFeHByZXNzQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWRCYW5uZXJFeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5o+S5bGP5bm/5ZGKICovXG4gICAgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKGRhdGE6IGFueSwgSkJDYWxsYmFjazogRnVuY3Rpb24pIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5zaG93SW50ZXJhY3Rpb25FeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG5cbiAgICBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgICB9XG4gICAgZ2V0IHdpZHRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgfVxuXG4gICAgZ2V0IGhlaWdodCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlaWdodDtcbiAgICB9XG5cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuXG4gICAgZ2V0IGNoYW5uZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGFubmVsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgYnJpZGdlKCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXQgZ2FtZUNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dhbWVDb25maWc7XG5cbiAgICB9XG4gICAgc3RhdGljIGdldCBJKCk6IEFwcFNkayB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQXBwU2RrKTtcbiAgICB9XG5cbiAgICBcbn1cbi8vICAgICAvL+i/memHjOaYr+a1j+iniOWZqOeOr+Wig+S4i++8jCDmjqXmlLZ3ZWLkvKDov4fmnaXnmoTmtojmga9cbndpbmRvdy5vbk15QnJpZGdlUmVhZHkgPSAoKSA9PiB7XG4gICAgQXBwU2RrLkkuaXNNeUJyaWRnZSA9IHRydWU7XG4gICAgY29uc29sZS5sb2coXCJvbk15QnJpZGdlUmVhZHkgbG9hZCBmaW5pc2gsIGNvc3Q6XCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpICsgXCJtc1wiKTtcbiAgICBNeUJyaWRnZS5BcHAub25SZXN1bWUgPSAoLi4ucmV0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgIGxheWEgb25SZXN1bWUnLCByZXQpXG4gICAgfVxuICAgIE15QnJpZGdlLkFwcC5vblBhdXNlID0gKC4uLnJldCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnICAgIGxheWEgb25QYXVzZScsIHJldClcbiAgICB9XG59XG5cbmludGVyZmFjZSBJVmlkZW8ge1xuICAgIHByZWxvYWRpbmc6IG51bWJlcixcbiAgICB0eXBlOiBudW1iZXIsXG59IiwiXHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XHJcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi91aXRsL0RhdGVVdGlsc1wiO1xyXG5cclxuLyoq6L2s55uYIOiOt+WPlui9rOebmOacuuS8mueahCAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMdWNrRHJhd01vZGVsIHtcclxuICAgIHByaXZhdGUgX2RhdGE6IEx1Y2tEcmF3RGF0YTtcclxuXHJcbiAgICBwcml2YXRlIHByb3BSZW1vdmU6IG51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHByb3BDaGFuZ2U6IG51bWJlciA9IDA7XHJcbiAgICBhc3luYyBpbml0KCkge1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBhd2FpdCB0aGlzLmluaXREYXRhKCk7XHJcbiAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IDAsIGNoYW5nZTogMCB9KSlcclxuICAgICAgICBBcHBTZGsuSS5wdXREYXRhKCdMdWNrRHJhd1RvU2lnbicsIEpTT04uc3RyaW5naWZ5KHsgaXN0b1NpZ25pbjogMCB9KSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0RGF0YSgpIHtcclxuICAgICAgICBsZXQgZGF0YSA9IG5ldyBMdWNrRHJhd0RhdGE7XHJcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTHVja0RyYXdMYXN0VGltZScpIHx8ICcwJztcclxuICAgICAgICBkYXRhLmx1Y2tEcmF3TGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XHJcbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShkYXRhLmx1Y2tEcmF3TGFzdFRpbWUpO1xyXG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcclxuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xyXG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0x1Y2tEcmF3TGFzdFRpbWUnLCBsYXN0VGltZSk7XHJcbiAgICAgICAgICAgIGRhdGEubHVja0RyYXdMYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcclxuICAgICAgICAgICAgLyoq5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgICAgICAgICAqIDEg562+5YiwXHJcbiAgICAgICAgICAgICAqIDIg6KeG6aKRXHJcbiAgICAgICAgICAgICAqIDMg5pGH5LiA5pGHXHJcbiAgICAgICAgICAgICAqIDQg57qi5YyFXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBkYXRhLmxpc3QgPSBbXTtcclxuICAgICAgICAgICAgbGV0IGxpc3QgPSBbXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBpdGVtID0gbmV3IEx1Y2tEcmF3Vm87XHJcbiAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICBpdGVtLm51bSA9IDA7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmlzVXNlID0gMDtcclxuICAgICAgICAgICAgICAgIGl0ZW0udXNlTnVtID0gMDtcclxuICAgICAgICAgICAgICAgIGxpc3QucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkYXRhLmxpc3QgPSBsaXN0O1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBsZXQgbHVja0RyYXdEYXRhOiBhbnkgPSBhd2FpdCBBcHBTZGsuSS5nZXREYXRhKCdMdWNrRHJhd0RhdGEnKTtcclxuICAgICAgICAgICAgaWYgKGx1Y2tEcmF3RGF0YSlcclxuICAgICAgICAgICAgICAgIGRhdGEubGlzdCA9IGx1Y2tEcmF3RGF0YS5saXN0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBBcHBTZGsuSS5wdXREYXRhKCdMdWNrRHJhd0RhdGEnLCBKU09OLnN0cmluZ2lmeShkYXRhKSlcclxuICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgIH1cclxuICAgIGdldCBkYXRhKCk6IEx1Y2tEcmF3RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRGF0YShpbmRleDogbnVtYmVyLCBhZGROdW06IG51bWJlciA9IDEpIHtcclxuICAgICAgICBpZih0aGlzLmRhdGEpe1xyXG4gICAgICAgICAgICB0aGlzLmRhdGEubGlzdFtpbmRleF0ubnVtICs9IGFkZE51bTtcclxuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnTHVja0RyYXdEYXRhJywgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0UHJvcERhdGEoKSB7XHJcbiAgICAgICAgbGV0IGx1Y2tEcmF3UHJvcDogYW55ID0gYXdhaXQgQXBwU2RrLkkuZ2V0RGF0YSgnbHVja0RyYXdQcm9wJyk7XHJcbiAgICAgICAgY29uc29sZS5sb2coJyAgICAtLS0tLS0teXl5eXkgbGF5YSBsdWNrRHJhd1Byb3AgJyArIEpTT04uc3RyaW5naWZ5KGx1Y2tEcmF3UHJvcCkpXHJcbiAgICAgICAgdGhpcy5wcm9wUmVtb3ZlID0gTnVtYmVyKGx1Y2tEcmF3UHJvcC5yZW1vdmUpO1xyXG4gICAgICAgIHRoaXMucHJvcENoYW5nZSA9IE51bWJlcihsdWNrRHJhd1Byb3AuY2hhbmdlKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcFJlbW92ZSA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZW1vdmVQcm9wKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGFuZ2VQcm9wKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsdWNrRHJhd1Byb3A7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlUmVtb3ZlUHJvcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wUmVtb3ZlID4gMCkge1xyXG4gICAgICAgICAgICAvKiDlpITnkIbojrflvpfnrKwx5Liq6YGT5YW3Ki9cclxuICAgICAgICAgICAgdGhpcy5wcm9wUmVtb3ZlID0gMDtcclxuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IDAsIGNoYW5nZTogdGhpcy5wcm9wQ2hhbmdlIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ2hhbmdlUHJvcCgpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wQ2hhbmdlID4gMCkge1xyXG4gICAgICAgICAgICAvKiDlpITnkIbojrflvpfnrKwy5Liq6YGT5YW3Ki9cclxuICAgICAgICAgICAgdGhpcy5wcm9wQ2hhbmdlID0gMDtcclxuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IHRoaXMucHJvcFJlbW92ZSwgY2hhbmdlOiAwIH0pKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IEx1Y2tEcmF3TW9kZWwge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoTHVja0RyYXdNb2RlbCkgYXMgTHVja0RyYXdNb2RlbDtcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgTHVja0RyYXdEYXRhIHtcclxuICAgIGxpc3Q6IEx1Y2tEcmF3Vm9bXTtcclxuICAgIGx1Y2tEcmF3TGFzdFRpbWU6IG51bWJlcjtcclxufVxyXG5cclxuY2xhc3MgTHVja0RyYXdWbyB7XHJcbiAgICB0eXBlOiBudW1iZXI7XHJcbiAgICBudW06IG51bWJlcjtcclxuICAgIGlzVXNlOiBudW1iZXI7XHJcbiAgICB1c2VOdW06IG51bWJlcjtcclxufSIsImltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vQWRNYW5hZ2VyXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdGl2ZUFkIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuICAgIG9uRW5hYmxlKCk6IHZvaWQge1xuICAgICAgICBsZXQgZ2xvYmFsUG9pbnQgPSB0aGlzLml0ZW0ubG9jYWxUb0dsb2JhbChMYXlhLlBvaW50LkVNUFRZLCB0cnVlKTtcbiAgICAgICAgQWRNYW5hZ2VyLkkuc2hvd05hdGl2ZUFkKGdsb2JhbFBvaW50LngsIGdsb2JhbFBvaW50LnksIHRoaXMuaXRlbS53aWR0aCwgdGhpcy5pdGVtLmhlaWdodCk7XG4gICAgfVxuXG4gICAgb25EaXNhYmxlKCk6IHZvaWQge1xuICAgICAgICBBZE1hbmFnZXIuSS5jbG9zZUFkdmVyRGlhbG9nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaXRlbSgpOiBMYXlhLlZpZXcge1xuICAgICAgICByZXR1cm4gdGhpcy5vd25lciBhcyBhbnk7XG4gICAgfVxufSIsImltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XHJcbmltcG9ydCBUZWFTZGssIHsgRG90S2V5IH0gZnJvbSBcIi4vVGVhU2RrXCI7XHJcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVFRBZFNkayB7XHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHByZWxvYWQgIDAg55u05o6l5Yqg6L2977ybMSDpooTliqDovb1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgc2hvd1Jld2FyZFZpZGVvQWQocHJlbG9hZDogbnVtYmVyID0gMCwgcG9pbnQ6IHN0cmluZyA9IERvdEtleS5wcm9sb2FkaW5nKSB7XHJcblxyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICB0eXBlOiAxLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICBBcHBTZGsuSS5zaG93UmV3YXJkVmlkZW9BZChkYXRhLCByZXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop4bpopHlm57osINcIiwgSlNPTi5zdHJpbmdpZnkocmV0KSlcclxuICAgICAgICAgICAgICAgIGxldCB7IGNvZGUsIG1zZyB9ID0gSlNPTi5wYXJzZShyZXQpO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChjb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAtMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgIC8qKifmmoLml6Dop4bpopHlub/lkYrvvIHmr4/ml6Uw54K56YeN572uJyovO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV0ZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTAxOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuinhumikeeCueS6huWFs+mXrVwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb21wbGV0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop4bpopHop4LnnIvlrozpl63lubbngrnkuoblhbPpl61cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlYVNkay5JLmRvdChEb3RLZXkucmV3YXJkX2FkLCB7IGZyb206IHBvaW50IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgndW5Db21wbGV0ZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgn5Yqg6L295aSx6LSlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlYVNkay5JLmRvdChEb3RLZXkucmV3YXJkX2FkX2ZhaWwsIHsgZnJvbTogcG9pbnQsIGNvZGU6IGNvZGUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEZ1bGxTY3JlZW5WaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogQXBwU2RrLkkud2lkdGgsXHJcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLndpZHRoICogOTAgLyA2MDAsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgICAgIHR5cGU6IDFcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgQXBwU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgc2NhbGVYID0gQXBwU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgIGxldCBzY2FsZVkgPSBBcHBTZGsuSS5oZWlnaHQgLyBMYXlhLnN0YWdlLmhlaWdodDtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdHlwZTogMSxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICAgICAgdzogd2lkdGggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgIGg6IGhlaWdodCAqIHNjYWxlWSxcclxuICAgICAgICAgICAgbGVmdDogeCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgdG9wOiB5ICogc2NhbGVZXHJcbiAgICAgICAgfVxyXG4gICAgICAgIEFwcFNkay5JLmxvYWROYXRpdmVFeHByZXNzQWQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE5hdGl2ZUFkWUxIKHgsIHksIHdpZHRoLCBoZWlnaHQsIHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2NhbGVYID0gQXBwU2RrLkkud2lkdGggLyBMYXlhLnN0YWdlLndpZHRoO1xyXG4gICAgICAgICAgICBsZXQgc2NhbGVZID0gQXBwU2RrLkkuaGVpZ2h0IC8gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogMSxcclxuICAgICAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgICAgICAgICB3OiB3aWR0aCAqIHNjYWxlWCxcclxuICAgICAgICAgICAgICAgIGg6IGhlaWdodCAqIHNjYWxlWSxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IHggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgICAgICBib3R0b206IEFwcFNkay5JLmhlaWdodCAtIGhlaWdodCAqIHNjYWxlWSAtIHkgKiBzY2FsZVksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGF0YSkpXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKEFwcFNkay5JLmhlaWdodCwgaGVpZ2h0LCB5LCBzY2FsZVkpXHJcbiAgICAgICAgICAgIEFwcFNkay5JLmxvYWROYXRpdmVBZFlMSChKU09OLnN0cmluZ2lmeShkYXRhKSwgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoSlNPTi5wYXJzZShyZXMpKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgb3BlbkxvYWROYXRpdmVBZEV2ZW50KCkge1xyXG4gICAgICAgIEFwcFNkay5JLm9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEJhbm5lckV4cHJlc3NBZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoLFxyXG4gICAgICAgICAgICBoOiBBcHBTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEFwcFNkay5JLmxvYWRCYW5uZXJFeHByZXNzQWQoSlNPTi5zdHJpbmdpZnkoZGF0YSksIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHJlcylcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XHJcbiAgICAgICAgQXBwU2RrLkkuY2xvc2VBZHZlckRpYWxvZygpO1xyXG4gICAgfVxyXG4gICAgY2xvc2VBZEJhbm5lcigpIHtcclxuICAgICAgICBBcHBTZGsuSS5jbG9zZUFkQmFubmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKHByZWxvYWQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdzogQXBwU2RrLkkud2lkdGggKiAwLjgsXHJcbiAgICAgICAgICAgIGg6IEFwcFNkay5JLmhlaWdodCxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgQXBwU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVFRBZFNkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUVEFkU2RrKSBhcyBUVEFkU2RrO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XHJcbi8qKlxyXG4gKiDkuIrmiqXln4vngrnivYflv5dcclxuICog5YW35L2T55qE5omT54K56ZyA6KaB6Lef6L+Q6JCl6IGU57O7XHJcbiAqL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZWFTZGsge1xyXG4gICAgZG90KGtleTogc3RyaW5nLCB2YWx1ZT8pIHtcclxuICAgICAgICBpZiAoIUxheWEuQnJvd3Nlci5vbkFuZHJvaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnJztcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiAodmFsdWUpID09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBBcHBTZGsuSS5hcHBEb3RMb2coa2V5LCB2YWx1ZSlcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogVGVhU2RrIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFRlYVNkaykgYXMgVGVhU2RrO1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZW51bSBEb3RLZXkge1xyXG4gICAgcHJvbG9hZGluZyA9ICdwcm9sb2FkaW5nJywgICAgICAgICAgICAgICAgICAvL+mihOWKoOi9vVxyXG4gICAgcmV3YXJkX2FkID0gJ3Jld2FyZF9hZCcsXHRcdCAgICAgICAgICAgIC8v6KeG6aKR5omT54K5XHJcbiAgICByZXdhcmRfYWRfZmFpbCA9ICdhZF9mYWlsJywgICAgICAgICAgICAgICAgIC8v6KeG6aKR5Yqg6L295aSx6LSlXHJcbiAgICBmdWxsU2NyZWVuID0gJ2Z1bGxTY3JlZW4nLCAgICAgICAgICAgICAgICAgIC8v5YWo5bGP6KeG6aKRXHJcbiAgICBcclxufVxyXG4iLCJpbXBvcnQgQXBwU2RrIGZyb20gXCIuL0FwcFNka1wiO1xyXG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYWNraW5nU2RrIHtcclxuICAgIGRvdChrZXk6IHN0cmluZykge1xyXG4gICAgICAgIEFwcFNkay5JLmFwcERvdFRyYWNLaW5nKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IFRyYWNraW5nU2RrIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFRyYWNraW5nU2RrKSBhcyBUcmFja2luZ1NkaztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGVudW0gVHJhY2tpbmdLZXkge1xyXG4gICAgUmVkUGFjazEgPSAnZXZlbnRfNScsXHJcbiAgICBSZWRQYWNrNSA9ICdldmVudF82J1xyXG59XHJcbiIsImltcG9ydCBBcnJheVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0FycmF5VXRpbHNcIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYXNlTW9kZWwge1xuICAgIHByb3RlY3RlZCBfZGF0YTogYW55ID0ge307XG4gICAgcHJpdmF0ZSB1cGRhdGVBcnI6IEFycmF5PEZ1bmN0aW9uPiA9IFtdO1xuICAgIHByaXZhdGUga2V5VXBkYXRlQXJyOiBhbnkgPSB7fTtcblxuICAgIHB1YmxpYyBhc3luYyB1cGRhdGUoZGF0YTogYW55KSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7XG4gICAgICAgICAgICAuLi50aGlzLl9kYXRhLFxuICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXJyLmZvckVhY2goZnVuYyA9PiB7XG4gICAgICAgICAgICBmdW5jKHRoaXMuX2RhdGEpO1xuICAgICAgICB9KVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5rZXlVcGRhdGVBcnIpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMua2V5VXBkYXRlQXJyW2tleV07XG4gICAgICAgICAgICAgICAgYXJyICYmIGFyci5mb3JFYWNoKGZ1bmMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBmdW5jKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHdhaXRGb3Ioa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9kYXRhW2tleV07XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY2IgPSBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZlVwZGF0ZShjYiwga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uVXBkYXRlKGNiLCBrZXksIHRydWUpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIHB1YmxpYyBvblVwZGF0ZShmdW5jOiBGdW5jdGlvbiwga2V5Pzogc3RyaW5nLCBydW46IGJvb2xlYW4gPSB0cnVlKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgIHJ1biAmJiB2YWx1ZSAhPSBudWxsICYmIGZ1bmModmFsdWUpO1xuICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMua2V5VXBkYXRlQXJyW2tleV07XG4gICAgICAgICAgICAhYXJyICYmICh0aGlzLmtleVVwZGF0ZUFycltrZXldID0gYXJyID0gW10pO1xuICAgICAgICAgICAgYXJyLnB1c2goZnVuYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBydW4gJiYgZnVuYyh0aGlzLl9kYXRhKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQXJyLnB1c2goZnVuYyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb2ZmVXBkYXRlKGZ1bmM6IEZ1bmN0aW9uLCBrZXk/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgQXJyYXlVdGlscy5yZW1vdmVGcm9tQXJyKHRoaXMua2V5VXBkYXRlQXJyW2tleV0sIGZ1bmMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgQXJyYXlVdGlscy5yZW1vdmVGcm9tQXJyKHRoaXMudXBkYXRlQXJyLCBmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhckdhbWUoKSB7XG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcbiAgICB9XG59IiwiaW1wb3J0IEJhc2VNb2RlbCBmcm9tIFwiLi9CYXNlTW9kZWxcIjtcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4uLy4uL3Nkay9BZE1hbmFnZXJcIjtcbmltcG9ydCBUZWFTZGssIHsgRG90S2V5IH0gZnJvbSBcIi4uLy4uL3Nkay9UZWFTZGtcIjtcbmltcG9ydCBUcmFja2luZ1NkaywgeyBUcmFja2luZ0tleSB9IGZyb20gXCIuLi8uLi9zZGsvVHJhY2tpbmdTZGtcIjtcbmltcG9ydCB7IEdvbGRDb25maWdEYXRhIH0gZnJvbSBcIi4uLy4uL3Nkay9zZGtEYXRhL0dvbGRDb25maWdEYXRhXCI7XG5pbXBvcnQgQWRkR29sZERhdGEgZnJvbSBcIi4uLy4uL3Nkay9zZGtEYXRhL0FkZEdvbGREYXRhXCI7XG5pbXBvcnQgRGF0ZVV0aWxzIGZyb20gXCIuLi8uLi91aXRsL0RhdGVVdGlsc1wiO1xuaW1wb3J0IFV0aWwsIHsgRGF0YUtleSB9IGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcbmltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xuaW1wb3J0IHsgRXZlbnRDZW50ZXIgfSBmcm9tIFwiLi4vLi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuLi8uLi9ldmVudC9FdmVudEVudW1cIjtcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4uL0FwcFNka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRwYWNrZXRNb2RlbCBleHRlbmRzIEJhc2VNb2RlbCB7XG4gICAgcHJpdmF0ZSBNQVggPSAyMDtcbiAgICAvKirlvZPlpKnpooblj5bnuqLljIXnmoTmnIDlpKfmrKHmlbAgKi9cbiAgICBwcml2YXRlIERBWV9NQVhfQ05UID0gNTA7XG4gICAgcHJpdmF0ZSBjb25mOiBhbnk7XG4gICAgcHVibGljIGN1clJlZHBhY2tldDogbnVtYmVyID0gMDtcbiAgICBwdWJsaWMgY29uZkxlbjogbnVtYmVyID0gMDtcblxuICAgIC8qKuWIneWni+WMlue6ouWMhemFjee9riAqL1xuICAgIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Yid5aeL5YyW57qi5YyF6YWN572uaW5pdFwiKVxuICAgICAgICBsZXQgYXJyID0gYXdhaXQgR29sZENvbmZpZ0RhdGEuSS5nZXRHb2xkQ29uZmlnKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1SZWRwYWNrZXRNb2RlbC0tLS0tLS0nK0pTT04uc3RyaW5naWZ5KGFycikpXG4gICAgICAgIGxldCBjYXNoID0gMDtcbiAgICAgICAgdGhpcy5jb25mID0ge307XG4gICAgICAgIGFyci5mb3JFYWNoKGNvbmZEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZltjb25mRGF0YS5pZF0gPSBjb25mRGF0YTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5pbml0RGF0YSgpKTtcbiAgICAgICAgdGhpcy5jb25mTGVuID0gdGhpcy5jb25mLmxlbmd0aDtcblxuICAgIH1cblxuICAgIGluaXREYXRhKCkge1xuICAgICAgICBsZXQgZGF0YSA9IG5ldyBSZWRwYWNrZXREYXRhO1xuICAgICAgICBsZXQgbGFzdFRpbWUgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5Lmxhc3RUaW1lKSB8fCAnMCc7XG4gICAgICAgIGRhdGEubGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XG5cbiAgICAgICAgbGV0IGxhc3QgPSBEYXRlVXRpbHMudGltZURheShkYXRhLmxhc3RUaW1lKTtcbiAgICAgICAgbGV0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5O1xuICAgICAgICBpZiAobGFzdCAhPSB0b2RheSkge1xuICAgICAgICAgICAgZGF0YS50b2RheUNudCA9IDA7XG4gICAgICAgICAgICBsYXN0VGltZSA9IERhdGVVdGlscy5ub3dUaW1lLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBVdGlsLkkuc2V0SXRlbShEYXRhS2V5Lmxhc3RUaW1lLCBsYXN0VGltZSlcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRvZGF5Q250ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS50b2RheUNudCkgfHwgJzAnO1xuICAgICAgICAgICAgZGF0YS50b2RheUNudCA9IHBhcnNlSW50KHRvZGF5Q250KTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLmxhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuICAgICAgICBsZXQgZGF0YUNudCA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkuZGF0YUNOVCkgfHwgJzAnO1xuICAgICAgICBkYXRhLmNudCA9IHBhcnNlSW50KGRhdGFDbnQpO1xuICAgICAgICBkYXRhLmxpc3QgPSBbXTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgYXN5bmMgY2hlY2tSZWRwYWNrZXQoKSB7XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YS50b2RheUNudCA+PSB0aGlzLkRBWV9NQVhfQ05UKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChBZE1hbmFnZXIuSS5jaGVja1ZpZGVvSW5DZCgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIC8qKue6ouWMheiOt+WPluWQjuayoeacieeci+W5v+WRiumihuWPlu+8jOWGjeasoeiOt+W+l+e6ouWMheeahOacuuS8mu+8jOS4jeS8muiOt+WPlue6ouWMhe+8jCDoh6rlt7HkuZ/lj6/ku6XlpITnkIbmiJAg5a+55bqU55qE57qi5YyF5o+Q6YaS5oiW5LiN6ZyA6KaB6L+Z6YeM55qE5Yik5patICovXG4gICAgICAgIGlmICh0aGlzLmN1clJlZHBhY2tldCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmRlZmluZWQgPT09IHRoaXMuZGF0YS5jbnQpIHRoaXMuZGF0YS5jbnQgPSAwO1xuICAgICAgICBsZXQgY250ID0gdGhpcy5kYXRhLmNudDtcbiAgICAgICAgaWYgKGNudCA+PSB0aGlzLmNvbmZMZW4pIGNudCA9IHRoaXMuY29uZkxlbiAtIDE7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5jb25mW2NudCArIDFdO1xuICAgICAgICBsZXQgcmFuMiA9IE1hdGgucmFuZG9tKCk7XG5cbiAgICAgICAgaWYgKGRhdGEgJiYgcmFuMiA8IGRhdGEucGVyKSB7XG4gICAgICAgICAgICBsZXQgY2FzaCA9IDAuMDAwMDAxO1xuICAgICAgICAgICAgdGhpcy5jdXJSZWRwYWNrZXQgPSBjYXNoO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCLnnIvop4bpopHpoobnuqLljIVcIilcbiAgICAgICAgICAgIC8vIC8vKirlvLnlh7rnuqLljIXnmoTnlYzpnaIsICDmmoLml7blpITnkIbmiJAg55u05o6l55yL5bm/5ZGK6I635Y+W6YeR5biBICovXG4gICAgICAgICAgICAvLyBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoRG90S2V5LnJld2FyZF9hZClcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi5Yqg6YeR5biBXCIpXG4gICAgICAgICAgICAvLyBsZXQgY29pbiA9IGF3YWl0IHRoaXMuYWRkQ29pbigpOyAvLyDnnIvlrozlub/lkYrojrflj5bpkrHvvIjmraTml7blt7Lnu4/liqDliLDotKbmiLfkuobvvIzmmoLmnKrmj5Dkvpvmj5DliY3nn6XpgZPojrflj5blpJrlsJHpkrHnmoTmlrnms5XvvIlcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6I635Y+W5LqG6ZKxXCIsIGNvaW4pXG4gICAgICAgICAgICAvLyB0aGlzLmdldFJlcGFja2V0KClcbiAgICAgICAgICAgIC8vIC8qKuabtOaWsOWfuuacrOaYvuekuiAqL1xuICAgICAgICAgICAgLy8gRXZlbnRDZW50ZXIuZW1pdChFdmVudEVudW0uVVBEQVRFX0NPSU4pO1xuXG4gICAgICAgICAgICAvKioqICovXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZ2V0UmVwYWNrZXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXJSZWRwYWNrZXQpIHJldHVybjtcbiAgICAgICAgdGhpcy5kYXRhLmNudCArPSAxO1xuICAgICAgICB0aGlzLmRhdGEubGlzdC5wdXNoKHRoaXMuY3VyUmVkcGFja2V0KTtcbiAgICAgICAgdGhpcy5kYXRhLmxhc3RUaW1lID0gKG5ldyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHRoaXMuZGF0YS50b2RheUNudCArPSAxO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSAxKVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazEpO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmNudCA9PSA1KVxuICAgICAgICAgICAgVHJhY2tpbmdTZGsuSS5kb3QoVHJhY2tpbmdLZXkuUmVkUGFjazUpO1xuICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IDA7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkuZGF0YUNOVCwgdGhpcy5kYXRhLmNudCk7XG4gICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkudG9kYXlDbnQsIHRoaXMuZGF0YS50b2RheUNudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvKiogKi9cbiAgICBhc3luYyBnZXRDdXJSZWRwYWNrZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmN1clJlZHBhY2tldDtcbiAgICB9XG5cbiAgICBnZXQgZGF0YSgpOiBSZWRwYWNrZXREYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuICAgIC8qKuiOt+WPluaAu+WFseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGdldFRvdGFsQ29pbigpIHtcbiAgICAgICAgbGV0IHRvdGFsQ29pbiA9IGF3YWl0IEFwcFNkay5JLm15Q29pbigpO1xuICAgICAgICByZXR1cm4gdG90YWxDb2luO1xuICAgIH1cbiAgICAvKirojrflj5bmnKzmrKHlpZblirHnmoTph5HluIHmlbAgKi9cbiAgICBhc3luYyBhZGRDb2luKCkge1xuICAgICAgICBsZXQgY29pbkRhdGEgPSBhd2FpdCBBZGRHb2xkRGF0YS5hZGRDb2luKCk7XG4gICAgICAgIHJldHVybiBjb2luRGF0YTtcbiAgICB9XG5cbiAgICAvKirojrflj5bmnIDkvY7mj5DmoaMgKi9cbiAgICBhc3luYyAgbWluV2l0aERyYXdhbCgpIHtcbiAgICAgICAgbGV0IG1pbkNvaW4gPSBhd2FpdCBBcHBTZGsuSS5taW5XaXRoRHJhd2FsKCk7XG4gICAgICAgIHJldHVybiBtaW5Db2luO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogUmVkcGFja2V0TW9kZWwge1xuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KFJlZHBhY2tldE1vZGVsKSBhcyBSZWRwYWNrZXRNb2RlbDtcbiAgICB9XG59XG5cbmNsYXNzIFJlZHBhY2tldERhdGEge1xuICAgIGNudDogbnVtYmVyO1xuICAgIGxpc3Q6IEFycmF5PG51bWJlcj47XG4gICAgbGFzdFRpbWU6IG51bWJlcjtcbiAgICB0b2RheUNudDogbnVtYmVyO1xufVxuXG5jbGFzcyBSZWRwYWNrZXRDb25maWdEYXRhIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIHBlcjogbnVtYmVyO1xuICAgIGNhc2g6IG51bWJlcjtcbn0iLCJpbXBvcnQgQXBwU2RrIGZyb20gXCIuLi9BcHBTZGtcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWRkR29sZERhdGEge1xuICAgIHN0YXRpYyBjb2luOiBzdHJpbmcgPSAnMCc7XG4gICAgc3RhdGljIG15Y29pbjogc3RyaW5nID0gJzAnO1xuICAgIHN0YXRpYyBpbml0RGF0YShkYXRhOiBhbnkpIHtcbiAgICAgICAgaWYgKCFwYXJzZUludChkYXRhLmNvZGUpKSB7XG4gICAgICAgICAgICBBZGRHb2xkRGF0YS5jb2luID0gZGF0YS5kYXRhLmNvaW47XG4gICAgICAgICAgICBBZGRHb2xkRGF0YS5teWNvaW4gPSBkYXRhLmRhdGEubXljb2luO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgIGFkZENvaW4oKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBBcHBTZGsuSS5hZGRHb2xkKCk7XG4gICAgICAgIHJldHVybiBbcGFyc2VJbnQocmVzdWx0LmNvaW4pLCBwYXJzZUludChyZXN1bHQubXljb2luKV07XG4gICAgfVxufSIsImltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5cclxuLy8gc2Rr6L+U5Zue55qE55So5oi35L+h5oGvXHJcbmV4cG9ydCBjbGFzcyBBcHBTZGtEYXRhIGltcGxlbWVudHMgSUFwcFNka0RhdGEge1xyXG4gICAgaXNuZXc6IG51bWJlciA9IDA7XHJcbiAgICB1aWQ6IG51bWJlcjtcclxuICAgIG9wZW5pZDogc3RyaW5nO1xyXG4gICAgbmlja25hbWU6IHN0cmluZztcclxuICAgIGhlYWRpbWd1cmw6IHN0cmluZztcclxuICAgIGluaXREYXRhKGRhdGE6IGFueSkge1xyXG4gICAgICAgIGxldCBkID1kYXRhLmRhdGE7XHJcbiAgICAgICAgY29uc3QgeyBpc25ldywgdWlkLCBvcGVuaWQsIG5pY2tuYW1lLCBoZWFkaW1ndXJsIH0gPSBkO1xyXG4gICAgICAgIFt0aGlzLmlzbmV3LCB0aGlzLnVpZCwgdGhpcy5vcGVuaWQsIHRoaXMubmlja25hbWUsIHRoaXMuaGVhZGltZ3VybF0gPSBbaXNuZXcsIHVpZCwgb3BlbmlkLCBuaWNrbmFtZSwgaGVhZGltZ3VybF07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IEFwcFNka0RhdGEge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoQXBwU2RrRGF0YSkgYXMgQXBwU2RrRGF0YTtcclxuICAgIH1cclxufVxyXG5cclxuXHJcblxyXG5pbnRlcmZhY2UgSUFwcFNka0RhdGEge1xyXG4gICAgaXNuZXc6IG51bWJlcjtcclxuICAgIHVpZDogbnVtYmVyO1xyXG4gICAgb3BlbmlkOiBzdHJpbmc7XHJcbiAgICBuaWNrbmFtZTogc3RyaW5nO1xyXG4gICAgaGVhZGltZ3VybDogc3RyaW5nO1xyXG59IiwiaW1wb3J0IFV0aWwgZnJvbSBcIi4uLy4uL3VpdGwvVXRpbFwiO1xyXG5pbXBvcnQgQXBwU2RrIGZyb20gXCIuLi9BcHBTZGtcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHb2xkQ29uZmlnRGF0YSB7XHJcbiAgICBhZDogT2JqZWN0O1xyXG4gICAgYWRuZXQ6IHN0cmluZztcclxuICAgIGFwcF9uYW1lOiBzdHJpbmc7XHJcbiAgICBjb2luX2NvbmZpZzogc3RyaW5nID0gJyc7XHJcbiAgICBnYW1lVXJsOiBzdHJpbmc7XHJcbiAgICBrdWFpX2FwcF9uYW1lOiBzdHJpbmc7XHJcbiAgICBwYW5nb2xpbjogc3RyaW5nO1xyXG4gICAgdFR1cmJvQWdlbnQ6IHN0cmluZztcclxuICAgIHRlYUFnZW50OiBudW1iZXI7XHJcbiAgICB0cmFja2luZzogc3RyaW5nO1xyXG4gICAgdHRBcHBMb2c6IHN0cmluZztcclxuICAgIHVtaWQ6IHN0cmluZztcclxuICAgIGdhbWVDb25maWc6IGFueTtcclxuXHJcbiAgICBjb2RlOiBudW1iZXIgPSAtMztcclxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBHb2xkQ29uZmlnRGF0YSA9IG51bGw7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBnZXQgSSgpOiBHb2xkQ29uZmlnRGF0YSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKVxyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gbmV3IEdvbGRDb25maWdEYXRhKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2U7XHJcbiAgICB9XHJcbiAgICBpbml0RGF0YShkYXRhKSB7XHJcbiAgICAgICAgdGhpcy5jb2RlID0gZGF0YS5jb2RlO1xyXG4gICAgICAgIGlmICghZGF0YS5jb2RlKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRhdGE7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGUgPSBkYXRhW2tleV07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpc1trZXldID0gZWxlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEdvbGRDb25maWcoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gQXBwU2RrLkkuZ2FtZUNvbmZpZztcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0pzb24gPSBhd2FpdCB0aGlzLmxvYWRHb2xkQ2ZnKHJlc3VsdFsnY29pbl9jb25maWcnXVswXSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGNvbmZpZ0pzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZEdvbGRDZmcocmVzOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IFV0aWwuSS5sb2FkKHJlcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0pzb247XHJcbiAgICB9XHJcbn1cclxuIiwiaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi8uLi91aXRsL09iamVjdEluc3RhbmNlXCI7XHJcbmltcG9ydCBVdGlsIGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgTHVja0RyYXdEYXRhIGltcGxlbWVudHMgSVR1cm5DZmcge1xyXG4gICAgcmVkX3R1cm50YWJsZV90aW1lczogbnVtYmVyO1xyXG4gICAgcmVkX3R1cm50YWJsZV9jb25maWc6IElUdXJuQ2VsbENmZztcclxuICAgIHNoYWtlX3R1cm50YWJsZV9jb25maWc6IElUdXJuQ2VsbENmZztcclxuICAgIHNoYWtlX3R1cm50YWJsZV90aW1lczogbnVtYmVyO1xyXG4gICAgc3RhdGljIGdldCBJKCk6IEx1Y2tEcmF3RGF0YSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChMdWNrRHJhd0RhdGEpIGFzIEx1Y2tEcmF3RGF0YTtcclxuICAgIH1cclxuICAgIGFzeW5jIGluaXREYXRhKGRhdGE6IElUdXJuQ2ZnKSB7XHJcbiAgICAgICAgY29uc3QgeyByZWRfdHVybnRhYmxlX3RpbWVzLCByZWRfdHVybnRhYmxlX2NvbmZpZyxcclxuICAgICAgICAgICAgc2hha2VfdHVybnRhYmxlX2NvbmZpZywgc2hha2VfdHVybnRhYmxlX3RpbWVzIH0gPSBkYXRhO1xyXG5cclxuICAgICAgICBbdGhpcy5yZWRfdHVybnRhYmxlX3RpbWVzLCB0aGlzLnJlZF90dXJudGFibGVfY29uZmlnLCB0aGlzLnNoYWtlX3R1cm50YWJsZV9jb25maWcsIHRoaXMuc2hha2VfdHVybnRhYmxlX3RpbWVzXSA9IFtyZWRfdHVybnRhYmxlX3RpbWVzLCByZWRfdHVybnRhYmxlX2NvbmZpZyxcclxuICAgICAgICAgICAgc2hha2VfdHVybnRhYmxlX2NvbmZpZywgc2hha2VfdHVybnRhYmxlX3RpbWVzXTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgbG9hZEdvbGRDZmcocmVzOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IFV0aWwuSS5sb2FkKHJlcyk7XHJcbiAgICAgICAgcmV0dXJuIGNvbmZpZ0pzb247XHJcbiAgICB9XHJcbn1cclxuaW50ZXJmYWNlIElUdXJuQ2ZnIHtcclxuICAgIHJlZF90dXJudGFibGVfdGltZXM6IG51bWJlcjtcclxuICAgIHJlZF90dXJudGFibGVfY29uZmlnOiBJVHVybkNlbGxDZmc7XHJcbiAgICBzaGFrZV90dXJudGFibGVfY29uZmlnOiBJVHVybkNlbGxDZmc7XHJcbiAgICBzaGFrZV90dXJudGFibGVfdGltZXM6IG51bWJlcjtcclxufVxyXG5cclxuXHJcbmludGVyZmFjZSBJVHVybkNlbGxDZmcge1xyXG4gICAgZGF5X2xpbWl0OiBudW1iZXI7XHJcbiAgICByZXF1aXJlbWVudDogbnVtYmVyO1xyXG4gICAgdGl0bGU6IHN0cmluZ1xyXG59XHJcblxyXG4iLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cbmltcG9ydCBWaWV3PUxheWEuVmlldztcclxuaW1wb3J0IERpYWxvZz1MYXlhLkRpYWxvZztcclxuaW1wb3J0IFNjZW5lPUxheWEuU2NlbmU7XG52YXIgUkVHOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcbmV4cG9ydCBtb2R1bGUgdWkge1xyXG4gICAgZXhwb3J0IGNsYXNzIFRlc3RTY2VuZVVJIGV4dGVuZHMgU2NlbmUge1xyXG5cdFx0cHVibGljIGJ0bkludml0ZTpMYXlhLlNwcml0ZTtcblx0XHRwdWJsaWMgYnRuU2VydmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5WaWJyYXRlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5EcmF3YWw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZWxvYWRBRDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Jhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Z1bGxBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd05hdGl2ZUFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93SW50ZXJBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmV3YXJkQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blJlZHBhY2tldDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgTmF0aXZlQUQ6Vmlldztcblx0XHRwdWJsaWMgYnRuRHJhdzpMYXlhLkJ1dHRvbjtcbiAgICAgICAgY29uc3RydWN0b3IoKXsgc3VwZXIoKX1cclxuICAgICAgICBjcmVhdGVDaGlsZHJlbigpOnZvaWQge1xyXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTY2VuZShcIlRlc3RTY2VuZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5UZXN0U2NlbmVVSVwiLFRlc3RTY2VuZVVJKTtcclxufVxyIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlVdGlscyB7XG4gICAgLyoqXG4gICAgICog56e76Zmk5YWD57SgXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZUZyb21BcnIoYXJyOiBBcnJheTxhbnk+LCBvYmo6IGFueSkge1xuICAgICAgICBsZXQgaW5kZXggPSBhcnIuaW5kZXhPZihvYmopO1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tRnJvbUFycihhcnI6IEFycmF5PGFueT4pIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhcnJbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOe7hOmaj+acuuaOkuW6j1xuICAgICAqL1xuICAgIHN0YXRpYyBzaHVmZmxlKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICByZXR1cm4gYXJyLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbmRleE9mKGFyciwgY2FsbGJhY2ssIGN0eD8pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGN0eCwgdGhpc1tpXSwgaSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHN0YXRpYyBlYWNoKGFyciwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2suY2FsbChjb250ZXh0LCBhcnJbaV0sIGksIGFycikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcXVldWUoYXJyKSB7XG4gICAgICAgIGxldCByZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBwcm9taXNlIG9mIGFycikge1xuICAgICAgICAgICAgcmVzID0gYXdhaXQgcHJvbWlzZShyZXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tQXJyYXkoYXJyLCBjb3VudCkge1xuICAgICAgICBsZXQgc2h1ZmZsZWQgPSBhcnIuc2xpY2UoMCk7XG4gICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBsZXQgbWluID0gbGVuIC0gY291bnQsIHRlbXAsIGluZGV4O1xuICAgICAgICB3aGlsZSAobGVuLS0gPiBtaW4pIHtcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcigobGVuICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtsZW5dO1xuICAgICAgICAgICAgc2h1ZmZsZWRbbGVuXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNodWZmbGVkLnNsaWNlKG1pbik7XG4gICAgfVxufSIsIi8qKlxuICog5pel5pyf5bel5YW357G7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVVdGlscyB7XG4gICAgc3RhdGljIGdldCBub3coKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5ub3dUaW1lIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBub3dUaW1lKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IHRvZGF5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGhpcy5ub3dUaW1lKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyB0aW1lRGF5KHRpbWVOdW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGltZU51bSk7XG4gICAgICAgIGxldCB5ZWFyID0gdGltZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBsZXQgbW9udGggPSB0aW1lLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBsZXQgZGF0ZSA9IHRpbWUuZ2V0RGF0ZSgpO1xuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHt0aGlzLmFkZChtb250aCl9LSR7dGhpcy5hZGQoZGF0ZSl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7np5LmlbDmoLzlvI/ljJblrZfnrKbkuLJcbiAgICAgKiBAcGFyYW0gc2Vjb25kIOenkuaVsFxuICAgICAqIEBwYXJhbSB0eXBlIDE6MDA6MDA6MDAgICAyOnl5eXktbW0tZGQgaDptOnMgICAgMzowMDowMCAgIDQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgICogQHJldHVyblxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZChzZWNvbmQ6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSk6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQwKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDEoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMihzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gMDogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDAodDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gNjApO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcih0ICUgNjApO1xuICAgICAgICB2YXIgbWluczogc3RyaW5nO1xuICAgICAgICB2YXIgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbnMgKyBcIjpcIiArIHNlbnM7XG4gICAgfVxuXG4gICAgLy8xOiAwMDowMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMSh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhvdXJzdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gMzYwMCk7XG4gICAgICAgIGxldCBob3Vyczogc3RyaW5nO1xuICAgICAgICBsZXQgZGF5ID0gJyc7XG4gICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgaG91cnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaG91cnN0IDwgMTApXG4gICAgICAgICAgICAgICAgaG91cnMgPSBcIjBcIiArIGhvdXJzdDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoID0gaG91cnN0ICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA+PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gTWF0aC5mbG9vcihob3Vyc3QgLyAyNCkgKyAnZCAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgbGV0IHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgbGV0IG1pbnM6IHN0cmluZztcbiAgICAgICAgbGV0IHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXkgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzM6IDAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQzKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzI6eXl5eS1tbS1kZCBoOm06c1xuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB2YXIgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IFx0Ly/ov5Tlm57nmoTmnIjku73ku44wLTEx77ybXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICByZXR1cm4geWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiIFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnV0ZSArIFwiOlwiICsgc2Vjb25kO1xuXG4gICAgfVxuXG4gICAgLy80Onh45aSp5YmN77yMeHjlsI/ml7bliY3vvIx4eOWIhumSn+WJjVxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgdCA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0ID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0IC8gMjQpICsgXCLlpKnliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICsgXCLlsI/ml7bliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWUgLyA2MCkgKyBcIuWIhumSn+WJjVwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIOavj+S4quaXtumXtOWNleS9jeaJgOWvueW6lOeahOenkuaVsFxuICAgICAgICB2YXIgb25lRGF5OiBudW1iZXIgPSAzNjAwICogMjQ7XG4gICAgICAgIHZhciBvbmVIb3Vyc3Q6IG51bWJlciA9IDM2MDA7XG4gICAgICAgIHZhciBvbmVNaW5zdDogbnVtYmVyID0gNjA7XG5cbiAgICAgICAgdmFyIGRheXMgPSBNYXRoLmZsb29yKHRpbWUgLyBvbmVEYXkpO1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgLyBvbmVIb3Vyc3QpXG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgLyBvbmVNaW5zdCkgIC8vTWF0aC5mbG9vcih0aW1lICUgb25lRGF5ICUgb25lSG91cnN0IC8gb25lTWluc3QpO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgJSBvbmVNaW5zdCkgLy90aW1lO1xuXG4gICAgICAgIHZhciBkYXlzczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzczogc3RyaW5nID0gXCJcIlxuICAgICAgICB2YXIgbWluc3M6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBzZWNzczogc3RyaW5nID0gXCJcIlxuICAgICAgICBpZiAodGltZSA+IDApIHtcbiAgICAgICAgICAgIC8v5aSpXG4gICAgICAgICAgICBpZiAoZGF5cyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGF5c3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIC8v5bCP5pe2XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8v5YiGXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vjc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWluc3MgKyBzZWNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgc2Vjc3NcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCIwXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgbWluc3M7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IGRheXMgKyBcIuWkqVwiO1xuICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiMFwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIiArIGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheXNzICsgaG91cnNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZChudW0pIHtcbiAgICAgICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtO1xuICAgIH1cblxuXG59XG4iLCJpbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0SW5zdGFuY2Uge1xuICAgIHByaXZhdGUgc3RhdGljIGNsenMgPSBbXTtcbiAgICBwcml2YXRlIHN0YXRpYyBvYmplY3RzID0gW107XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldChjbHM6IGFueSkge1xuICAgICAgICBsZXQgaWR4ID0gdGhpcy5jbHpzLmluZGV4T2YoY2xzKTtcbiAgICAgICAgcmV0dXJuIChpZHggPj0gMCAmJiB0aGlzLm9iamVjdHNbaWR4XSkgfHwgdGhpcy5jcmVhdGUoY2xzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGUoY2xzOiBhbnkpIHtcbiAgICAgICAgdmFyIG9iaiA9IE9iamVjdFBvb2wucG9wKGNscyk7XG4gICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG9iaik7XG4gICAgICAgIHRoaXMuY2x6cy5wdXNoKGNscyk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0UG9vbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2xzQXJyID0gW107XG5cbiAgICBzdGF0aWMgcG9wKGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsc0Fyci5pbmRleE9mKGNscyk7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLmNsc0Fyci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmNsc0Fyci5wdXNoKGNscyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGtleSA9ICdwb29sS2V5JyArIGlkeDtcbiAgICAgICAgbGV0IGl0ZW0gPSBMYXlhLlBvb2wuZ2V0SXRlbUJ5Q2xhc3Moa2V5LCBjbHMpO1xuICAgICAgICBpdGVtLnBvb2xLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBwdXNoKGl0ZW0pIHtcbiAgICAgICAgTGF5YS5Qb29sLnJlY292ZXIoaXRlbS5wb29sS2V5LCBpdGVtKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFNjYWxlQnV0dG9uU2NyaXB0IHtcbiBcbiAgICBwdWJsaWMgZGVsYXlUaW1lOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtaW5TY2FsZTogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1vbmtleUJveDogTGF5YS5JbWFnZTtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICrorr7nva5vd25lcuWHveaVsO+8jOWPr+S7peebtOaOpeiOt+WPluWIsOa3u+WKoOmZhOWKoOiEmuacrOeahOe7hOS7tuWunuS+iyBcbiAgICAgKiovXG4gICAgcHVibGljIHNldCBvd25lcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubW9ua2V5Qm94ID0gdmFsdWU7XG4gICAgICAgIC8v6Ieq5a6a5LmJ55qE6ISa5pys5Lya5pyJ5pe25bqP6Zeu6aKY77yM5omA5Lul5Zyo5q2k5re75Yqg5LiA5Liq5bu25pe2XG4gICAgICAgIHRoaXMubW9ua2V5Qm94LmZyYW1lT25jZSgyLCB0aGlzLCB0aGlzLm9uTG9hZGVkKTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgb25Mb2FkZWQoKTogdm9pZCB7XG4gICAgICAgLyog6K6+572u5oyJ6ZKu5Li65Y2V5oCB5oyJ6ZKuXG4gICAgICAgICoqIOWPluWAvO+8mlxuICAgICAgICAqKiAx77ya5Y2V5oCB44CC5Zu+54mH5LiN5YGa5YiH5Ymy77yM5oyJ6ZKu55qE55qu6IKk54q25oCB5Y+q5pyJ5LiA56eN44CCXG4gICAgICAgICoqIDLvvJrkuKTmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB5oyJ5LiL5ZKM57uP6L+H5Y+K6YCJ5Lit54q25oCB55qu6IKk44CCXG4gICAgICAgICoqIDPvvJrkuInmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB57uP6L+H54q25oCB55qu6IKk44CB5oyJ5LiL5ZKM6YCJ5Lit54q25oCB55qu6IKkXG4gICAgICAgICovXG4gICAgICAgIC8v5re75Yqg6byg5qCH5oyJ5LiL5LqL5Lu25L6m5ZCs44CC5oyJ5pe25pe257yp5bCP5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5zY2FsZVNtYWxsKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfmiqzotbfkuovku7bkvqblkKzjgILmiqzotbfml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9VUCwgdGhpcywgdGhpcy5zY2FsZUJpZyk7XG4gICAgICAgIC8v5re75Yqg6byg5qCH56a75byA5LqL5Lu25L6m5ZCs44CC56a75byA5pe26L+Y5Y6f5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgcHJpdmF0ZSBzY2FsZVNtYWxsKCk6dm9pZHtcbiAgICAgICAgLy/nvKnlsI/oh7MwLjjnmoTnvJPliqjmlYjmnpxcbiAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLm1vbmtleUJveCwge3NjYWxlWDowLjgsIHNjYWxlWTogMC44fSwgMik7XG4gICAgfVxuICAgIHByaXZhdGUgc2NhbGVCaWcoKTp2b2lke1xuICAgICAgICAvL+WPmOWkp+i/mOWOn+eahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjEsIHNjYWxlWToxfSwgMik7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFV0aWwge1xuICAgIHB1YmxpYyBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgIH1cbiAgICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXRpbDtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJKCk6IFV0aWwge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IFV0aWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGF0YUtleSB7XG4gICAgY3VyX3JlZF9kYXlfbGltaXQgPSAnY3VyX3JlZF9kYXlfbGltaXQnLFxuICAgIGN1cl9zaGFrZV9kYXlfbGltaXQgPSAnY3VyX3NoYWtlX2RheV9saW1pdCcsXG4gICAgc2hha2VMYXN0VGltZSA9ICdzaGFrZUxhc3RUaW1lJyxcbiAgICBkYXRhQ05UID0gJ2RhdGFDTlQnLFxuICAgIHRvZGF5Q250ID0gJ3RvZGF5Q250JyxcbiAgICBsYXN0VGltZSA9ICdsYXN0VGltZScsXG59Il19