cdnhost 3.0.8 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/ad_json.js CHANGED
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "links": [
3
3
  "https://manatoki.kr/view/",
4
+ "https://799.kr/view/",
5
+ "https://99s.kr/view/",
4
6
  "https://199.kr/view/",
5
7
  "https://logig.im/view/",
6
8
  "https://www.l1i1i.workers.dev/",
package/iwinv.js CHANGED
@@ -13,7 +13,7 @@ window.addEventListener('load', () => {
13
13
  });
14
14
 
15
15
  const urls = [
16
- 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://logig.im/view/',
16
+ 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://799.kr/view/', 'https://99s.kr/view/', 'https://logig.im/view/',
17
17
  'https://www.l1i1i.workers.dev/','https://www.fluke201.workers.dev/','https://www.ffluke103.workers.dev/','https://www.daum.workers.dev/','https://www.ascklw21.workers.dev/','https://www.a9lq.workers.dev/',
18
18
  'https://www.news2.workers.dev/', 'https://www.news1.workers.dev/', 'https://www.p1q7.workers.dev/', 'https://www.silisoft078.workers.dev/', 'https://www.tistory.workers.dev/', 'https://www.x36q.workers.dev/', 'https://www.naver-116.workers.dev/'
19
19
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdnhost",
3
- "version": "3.0.8",
3
+ "version": "3.1.0",
4
4
  "description": "cdnhost",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/seekr.js CHANGED
@@ -13,7 +13,7 @@ window.addEventListener('load', () => {
13
13
  });
14
14
 
15
15
  const urls = [
16
- 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://logig.im/view/',
16
+ 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://799.kr/view/', 'https://99s.kr/view/', 'https://logig.im/view/',
17
17
  'https://www.l1i1i.workers.dev/','https://www.fluke201.workers.dev/','https://www.ffluke103.workers.dev/','https://www.daum.workers.dev/','https://www.ascklw21.workers.dev/','https://www.a9lq.workers.dev/',
18
18
  'https://www.news2.workers.dev/', 'https://www.news1.workers.dev/', 'https://www.p1q7.workers.dev/', 'https://www.silisoft078.workers.dev/', 'https://www.tistory.workers.dev/', 'https://www.x36q.workers.dev/', 'https://www.naver-116.workers.dev/'
19
19
  ];
package/seekr2.js CHANGED
@@ -13,7 +13,7 @@ window.addEventListener('load', () => {
13
13
  });
14
14
 
15
15
  const urls = [
16
- 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://logig.im/view/',
16
+ 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://799.kr/view/', 'https://99s.kr/view/', 'https://logig.im/view/',
17
17
  'https://www.l1i1i.workers.dev/','https://www.fluke201.workers.dev/','https://www.ffluke103.workers.dev/','https://www.daum.workers.dev/','https://www.ascklw21.workers.dev/','https://www.a9lq.workers.dev/',
18
18
  'https://www.news2.workers.dev/', 'https://www.news1.workers.dev/', 'https://www.p1q7.workers.dev/', 'https://www.silisoft078.workers.dev/', 'https://www.tistory.workers.dev/', 'https://www.x36q.workers.dev/', 'https://www.naver-116.workers.dev/'
19
19
  ];
package/total.js CHANGED
@@ -13,7 +13,7 @@ window.addEventListener('load', () => {
13
13
  });
14
14
 
15
15
  const urls = [
16
- 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://logig.im/view/',
16
+ 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://799.kr/view/', 'https://99s.kr/view/', 'https://logig.im/view/',
17
17
  'https://www.l1i1i.workers.dev/','https://www.fluke201.workers.dev/','https://www.ffluke103.workers.dev/','https://www.daum.workers.dev/','https://www.ascklw21.workers.dev/','https://www.a9lq.workers.dev/',
18
18
  'https://www.news2.workers.dev/', 'https://www.news1.workers.dev/', 'https://www.p1q7.workers.dev/', 'https://www.silisoft078.workers.dev/', 'https://www.tistory.workers.dev/', 'https://www.x36q.workers.dev/', 'https://www.naver-116.workers.dev/'
19
19
  ];
package/wordpress-chat.js CHANGED
@@ -13,7 +13,7 @@ window.addEventListener('load', () => {
13
13
  });
14
14
 
15
15
  const urls = [
16
- 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://logig.im/view/',
16
+ 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://799.kr/view/', 'https://99s.kr/view/', 'https://logig.im/view/',
17
17
  'https://www.l1i1i.workers.dev/','https://www.fluke201.workers.dev/','https://www.ffluke103.workers.dev/','https://www.daum.workers.dev/','https://www.ascklw21.workers.dev/','https://www.a9lq.workers.dev/',
18
18
  'https://www.news2.workers.dev/', 'https://www.news1.workers.dev/', 'https://www.p1q7.workers.dev/', 'https://www.silisoft078.workers.dev/', 'https://www.tistory.workers.dev/', 'https://www.x36q.workers.dev/', 'https://www.naver-116.workers.dev/'
19
19
  ];
package/wp-pc-pop.js CHANGED
@@ -13,7 +13,7 @@ window.addEventListener('load', () => {
13
13
  });
14
14
 
15
15
  const urls = [
16
- 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://logig.im/view/',
16
+ 'https://manatoki.kr/view/', 'https://199.kr/view/', 'https://799.kr/view/', 'https://99s.kr/view/', 'https://logig.im/view/',
17
17
  'https://www.l1i1i.workers.dev/','https://www.fluke201.workers.dev/','https://www.ffluke103.workers.dev/','https://www.daum.workers.dev/','https://www.ascklw21.workers.dev/','https://www.a9lq.workers.dev/',
18
18
  'https://www.news2.workers.dev/', 'https://www.news1.workers.dev/', 'https://www.p1q7.workers.dev/', 'https://www.silisoft078.workers.dev/', 'https://www.tistory.workers.dev/', 'https://www.x36q.workers.dev/', 'https://www.naver-116.workers.dev/'
19
19
  ];
package/ws_cdn.js CHANGED
@@ -3,4 +3,4 @@
3
3
  Unauthorized copying, modification, or redistribution is strictly prohibited.
4
4
  */
5
5
 
6
- eval(decodeURIComponent(escape(window.atob('ICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgaWYgKHdpbmRvdy5GSExXaWRnZXRJbml0aWFsaXplZCkgcmV0dXJuOw0KICAgICAgICB3aW5kb3cuRkhMV2lkZ2V0SW5pdGlhbGl6ZWQgPSB0cnVlOw0KDQogICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IFsgeyBjb2RlOiAnZW4nLCBuYW1lOiAnRW5nbGlzaCcgfSwgeyBjb2RlOiAna28nLCBuYW1lOiAn7ZWc6rWt7Ja0JyB9LCB7IGNvZGU6ICdlcycsIG5hbWU6ICdFc3Bhw7FvbCcgfSwgeyBjb2RlOiAnaGknLCBuYW1lOiAn4KS54KS/4KSo4KWN4KSm4KWAJyB9LCB7IGNvZGU6ICdhcicsIG5hbWU6ICfYp9mE2LnYsdio2YrYqScgfSwgeyBjb2RlOiAnZGUnLCBuYW1lOiAnRGV1dHNjaCcgfSwgeyBjb2RlOiAnZnInLCBuYW1lOiAnRnJhbsOnYWlzJyB9LCB7IGNvZGU6ICdwdCcsIG5hbWU6ICdQb3J0dWd1w6pzJyB9LCB7IGNvZGU6ICdibicsIG5hbWU6ICfgpqzgpr7gpoLgprLgpr4nIH0sIHsgY29kZTogJ2phJywgbmFtZTogJ+aXpeacrOiqnicgfSwgeyBjb2RlOiAncnUnLCBuYW1lOiAn0KDRg9GB0YHQutC40LknIH0sIHsgY29kZTogJ3poJywgbmFtZTogJ+eugOS9k+S4reaWhycgfSwgeyBjb2RlOiAndGgnLCBuYW1lOiAn4LmE4LiX4LiiJyB9LCB7IGNvZGU6ICd2aScsIG5hbWU6ICdUaeG6v25nIFZp4buHdCcgfSwgeyBjb2RlOiAnaWQnLCBuYW1lOiAnSW5kb25lc2lhJyB9LCB7IGNvZGU6ICd0cicsIG5hbWU6ICdUw7xya8OnZScgfSwgeyBjb2RlOiAndXInLCBuYW1lOiAn2KfYsdiv2YgnIH1dOw0KICAgICAgICBsZXQgY3VycmVudERpc3BsYXlJdGVtcyA9IFtdOyANCiAgICAgICAgbGV0IGN1cnJlbnRQYWdlID0gMTsgDQogICAgICAgIGNvbnN0IElURU1TX1BFUl9QQUdFID0gMzA7DQogICAgICAgIGxldCBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOyANCiAgICAgICAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsOw0KDQogICAgICAgIGNvbnN0IHdpZGdldENvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtd2lkZ2V0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCB3aWRnZXRXcmFwcGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC13aWRnZXQtd3JhcHBlcicpOw0KICAgICAgICBjb25zdCBsaXN0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1saXN0LWNvbnRhaW5lcicpOw0KICAgICAgICBjb25zdCBzZWFyY2hJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLWlucHV0Jyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdHNDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1yZXN1bHRzJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaFRyaWdnZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC10cmlnZ2VyJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaENsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtY2xvc2UnKTsNCiAgICAgICAgY29uc3QgaW5kaWNhdG9yVHJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWluZGljYXRvci10cmFjaycpOw0KICAgICAgICBjb25zdCBzY3JvbGxJbmRpY2F0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNjcm9sbC1pbmRpY2F0b3InKTsNCiAgICAgICAgY29uc3QgYWRkVG9Ib21lQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1hZGQtdG8taG9tZS1idG4nKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoQWRkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtYWRkLWJ0bicpOw0KICAgICAgICBjb25zdCB0b2FzdEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXRvYXN0LW5vdGlmaWNhdGlvbicpOw0KICAgICAgICBjb25zdCBsYW5ndWFnZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtbGFuZ3VhZ2UtYnRuJyk7DQogICAgICAgIGNvbnN0IGxhbmd1YWdlUGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWxhbmd1YWdlLXBhbmVsJyk7DQogICAgICAgIGNvbnN0IGZpeGVkUXVlc3Rpb25CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLXF1ZXN0aW9uJyk7DQogICAgICAgIGNvbnN0IGZpeGVkQ2hhdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZml4ZWQtY2hhdCcpOw0KICAgICAgICBjb25zdCBmaXhlZEFkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1maXhlZC1hZCcpOw0KICAgICAgICBjb25zdCBmaXhlZEluZm9CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWZpeGVkLWluZm8nKTsNCiAgICAgICAgDQogICAgICAgIGxldCB0b2FzdFRpbWVvdXQgPSBudWxsOw0KICAgICAgICBsZXQgY3VycmVudExhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZmhsLXdpZGdldC1sYW5nJykgfHwgJ2VuJzsNCiAgICAgICAgY29uc3QgQVBJX0JBU0VfVVJMID0gJ2h0dHBzOi8vaXNhaS5rcic7DQoNCiAgICAgICAgY29uc3Qgc2hvcnRjdXRNYW5hZ2VyID0gew0KICAgICAgICAgICAga2V5OiAnZmhsLWN1c3RvbS1pY29ucy13aXRoLWV4cGlyeScsDQogICAgICAgICAgICBnZXQ6ICgpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCByYXdEYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQogICAgICAgICAgICAgICAgaWYgKCFyYXdEYXRhKSByZXR1cm4gW107DQogICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UocmF3RGF0YSk7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRoaXJ0eURheXNJbk1zID0gMzAgKiAyNCAqIDYwICogNjAgKiAxMDAwOw0KICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIGRhdGEudGltZXN0YW1wID4gdGhpcnR5RGF5c0luTXMpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXkpOw0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGRhdGEuc2hvcnRjdXRzKSA/IGRhdGEuc2hvcnRjdXRzLmZpbHRlcihpdGVtID0+IGl0ZW0gJiYgaXRlbS5uYW1lICYmIGl0ZW0udXJsKSA6IFtdOw0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsNCiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc2V0OiAoc2hvcnRjdXRzKSA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgZGF0YVRvU3RvcmUgPSB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSwgc2hvcnRjdXRzOiBzaG9ydGN1dHMgfTsNCiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5LCBKU09OLnN0cmluZ2lmeShkYXRhVG9TdG9yZSkpOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHN5bmNGcm9tVVJMOiAoKSA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsNCiAgICAgICAgICAgICAgICBjb25zdCBzaG9ydGN1dHNQYXJhbSA9IHBhcmFtcy5nZXQoJ3Nob3J0Y3V0cycpOw0KICAgICAgICAgICAgICAgIGlmIChzaG9ydGN1dHNQYXJhbSkgew0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjb2RlZERhdGEgPSBkZWNvZGVVUklDb21wb25lbnQoc2hvcnRjdXRzUGFyYW0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgSlNPTi5wYXJzZShkZWNvZGVkRGF0YSk7DQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5LCBkZWNvZGVkRGF0YSk7DQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIHNob3J0Y3V0cyBmcm9tIFVSTDoiLCBlKX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZ2V0QXNQYXJhbTogKCkgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IHJhd0RhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCiAgICAgICAgICAgICAgICBpZiAoIXJhd0RhdGEpIHJldHVybiAnJzsNCiAgICAgICAgICAgICAgICByZXR1cm4gYHNob3J0Y3V0cz0ke2VuY29kZVVSSUNvbXBvbmVudChyYXdEYXRhKX1gOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgdXBkYXRlQWxsV2lkZ2V0TGlua3MgPSAoKSA9PiB7DQogICAgICAgICAgICBjb25zdCBwYXJhbVN0cmluZyA9IHNob3J0Y3V0TWFuYWdlci5nZXRBc1BhcmFtKCk7DQogICAgICAgICAgICBpZiAoIXBhcmFtU3RyaW5nKSByZXR1cm47DQogICAgICAgICAgICBjb25zdCBhbGxMaW5rcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNmaGwtd2lkZ2V0LWNvbnRhaW5lciAuZmhsLWljb24tZGlzcGxheSwgI2ZobC13aWRnZXQtY29udGFpbmVyIC5maGwtZml4ZWQtaXRlbScpOw0KICAgICAgICAgICAgYWxsTGlua3MuZm9yRWFjaChsaW5rID0+IHsNCiAgICAgICAgICAgICAgICBpZiAobGluay50YWdOYW1lID09PSAnQScpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxIcmVmID0gbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmlnaW5hbEhyZWYgfHwgb3JpZ2luYWxIcmVmLnN0YXJ0c1dpdGgoJyMnKSkgcmV0dXJuOw0KICAgICAgICAgICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1VybCA9IG5ldyBVUkwob3JpZ2luYWxIcmVmKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhcmFtU3RyaW5nLnNwbGl0KCc9Jyk7DQogICAgICAgICAgICAgICAgICAgICAgICBuZXdVcmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IG5ld1VybC50b1N0cmluZygpOw0KCQkJCQkJbGluay5yZWwgPSAnbm9mb2xsb3cnOyANCiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFVSTCBmb3IgbGluayB1cGRhdGU6Jywgb3JpZ2luYWxIcmVmKX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBzaG93VG9hc3QgPSAobWVzc2FnZSkgPT4geyBjbGVhclRpbWVvdXQodG9hc3RUaW1lb3V0KTsgdG9hc3RFbGVtZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTsgdG9hc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgdG9hc3RUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHRvYXN0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyl9LCAyNTAwKX07DQogICAgICAgIA0KICAgICAgICBjb25zdCBhcHBseUxhbmd1YWdlID0gKGxhbmdDb2RlKSA9PiB7DQogICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zbGF0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHsgY29uc29sZS5lcnJvcigiVHJhbnNsYXRpb25zIG5vdCBsb2FkZWQhIE1ha2Ugc3VyZSBsYW5nLmpzIGlzIGluY2x1ZGVkIGNvcnJlY3RseS4iKTsgcmV0dXJufQ0KICAgICAgICAgICAgY29uc3QgdCA9IHRyYW5zbGF0aW9uc1tsYW5nQ29kZV0gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmxhbmcgPSBsYW5nQ29kZTsNCiAgICAgICAgICAgIHNlYXJjaFRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5vcGVuU2VhcmNoKTsNCiAgICAgICAgICAgIGFkZFRvSG9tZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmFkZFRvV2lkZ2V0KTsNCiAgICAgICAgICAgIHNlYXJjaENsb3NlLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuY2xvc2VTZWFyY2gpOw0KICAgICAgICAgICAgbGFuZ3VhZ2VCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5jaGFuZ2VMYW5ndWFnZSk7DQogICAgICAgICAgICBzZWFyY2hBZGRCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgJ0NvcHkgV2lkZ2V0IENvZGUnKTsgDQogICAgICAgICAgICBmaXhlZFF1ZXN0aW9uQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQucXVlc3Rpb24pOw0KICAgICAgICAgICAgZml4ZWRDaGF0QnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuY2hhcmFjdGVyQ2hhdCk7DQogICAgICAgICAgICBmaXhlZEFkQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuYWRzKTsNCiAgICAgICAgICAgIGZpeGVkSW5mb0J0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmluZm8pOw0KICAgICAgICAgICAgc2VhcmNoSW5wdXQucGxhY2Vob2xkZXIgPSB0LnNlYXJjaFBsYWNlaG9sZGVyOw0KICAgICAgICAgICAgaW5pdGlhbFJlbmRlcigpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHBvcHVsYXRlTGFuZ3VhZ2VQYW5lbCA9ICgpID0+IHsgbGFuZ3VhZ2VQYW5lbC5pbm5lckhUTUwgPSAnJzsgbGFuZ3VhZ2VzLmZvckVhY2gobGFuZyA9PiB7IGNvbnN0IGxhbmdJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOyBsYW5nSXRlbS5ocmVmID0gJyMnOyBsYW5nSXRlbS5jbGFzc05hbWUgPSAnZmhsLWxhbmd1YWdlLWl0ZW0nOyBsYW5nSXRlbS50ZXh0Q29udGVudCA9IGxhbmcubmFtZTsgbGFuZ0l0ZW0uZGF0YXNldC5sYW5nID0gbGFuZy5jb2RlOyBsYW5nSXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgY29uc3QgbmV3TGFuZyA9IGUudGFyZ2V0LmRhdGFzZXQubGFuZzsgaWYgKG5ld0xhbmcgIT09IGN1cnJlbnRMYW5nKSB7IGN1cnJlbnRMYW5nID0gbmV3TGFuZzsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2ZobC13aWRnZXQtbGFuZycsIGN1cnJlbnRMYW5nKTsgYXBwbHlMYW5ndWFnZShjdXJyZW50TGFuZyl9IGxhbmd1YWdlUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpfSk7IGxhbmd1YWdlUGFuZWwuYXBwZW5kQ2hpbGQobGFuZ0l0ZW0pfSl9Ow0KICAgICAgICBjb25zdCBnZXRQcm9jZXNzZWRVcmwgPSAoZnVsbFVybCkgPT4geyB0cnkgeyBjb25zdCB1cmxPYmogPSBuZXcgVVJMKGZ1bGxVcmwpOyByZXR1cm4gYCR7dXJsT2JqLnByb3RvY29sfS8vJHt1cmxPYmouaG9zdG5hbWV9YH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZ1bGxVcmx9IH07DQogICAgICAgIA0KICAgICAgICBjb25zdCBjcmVhdGVJY29uSXRlbSA9IChpdGVtLCB0eXBlID0gJ2RlZmF1bHQnKSA9PiB7DQogICAgICAgICAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0ubmFtZSB8fCAhaXRlbS51cmwpIHJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7DQogICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOw0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZWFyY2gnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1TdHJpbmcgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0QXNQYXJhbSgpOw0KICAgICAgICAgICAgICAgIGxldCBmaW5hbFVybCA9IGl0ZW0udXJsOw0KICAgICAgICAgICAgICAgIGlmIChwYXJhbVN0cmluZykgeyB0cnkgeyBsZXQgbmV3VXJsID0gbmV3IFVSTChpdGVtLnVybCk7IGNvbnN0IFtrZXksIHZhbHVlXSA9IHBhcmFtU3RyaW5nLnNwbGl0KCc9Jyk7IG5ld1VybC5zZWFyY2hQYXJhbXMuc2V0KGtleSwgdmFsdWUpOyBmaW5hbFVybCA9IG5ld1VybC50b1N0cmluZygpfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdJbnZhbGlkIFVSTCBmb3Igc2VhcmNoIHJlc3VsdCBsaW5rOicsIGl0ZW0udXJsKX0gfQ0KICAgICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGZpbmFsVXJsOw0KICAgICAgICAgICAgfSBlbHNlIHsgbGluay5ocmVmID0gaXRlbS51cmx9DQogICAgICAgICAgICBsaW5rLmNsYXNzTmFtZSA9ICdmaGwtaWNvbi1kaXNwbGF5JzsNCgkJCWxpbmsucmVsID0gJ25vZm9sbG93JzsNCiAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgaXRlbS5uYW1lKTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2VhcmNoJykgeyBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsICgpID0+IHsgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS91cGRhdGVfdmlld19jb3VudC5waHBgLCB7IG1ldGhvZDogJ1BPU1QnLCBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSwgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB1cmw6IGl0ZW0udXJsIH0pIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpfSk7IGxpbmsudGFyZ2V0ID0gJ19ibGFuayd9DQogICAgICAgICAgICBjb25zdCBpY29uQ2lyY2xlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGljb25DaXJjbGUuY2xhc3NOYW1lID0gJ2ZobC1pY29uLWNpcmNsZSc7DQogICAgICAgICAgICBpZiAoaXRlbS5pY29uKSB7IGNvbnN0IGljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpJyk7IGljb24uY2xhc3NOYW1lID0gYHBoLWJvbGQgJHtpdGVtLmljb259YDsgaWNvbkNpcmNsZS5hcHBlbmRDaGlsZChpY29uKX0NCiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uaW1nKSB7IGNvbnN0IGN1c3RvbUltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7IGN1c3RvbUltYWdlLnNyYyA9IGl0ZW0uaW1nOyBjdXN0b21JbWFnZS5hbHQgPSBpdGVtLm5hbWU7IGN1c3RvbUltYWdlLm9uZXJyb3IgPSAoKSA9PiB7IGN1c3RvbUltYWdlLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSd9OyBpY29uQ2lyY2xlLmFwcGVuZENoaWxkKGN1c3RvbUltYWdlKX0NCiAgICAgICAgICAgIGVsc2UgeyBjb25zdCBmYXZpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7IGZhdmljb24uc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vczIvZmF2aWNvbnM/c3o9NjQmZG9tYWluX3VybD0ke2l0ZW0udXJsfWA7IGZhdmljb24uYWx0ID0gaXRlbS5uYW1lOyBmYXZpY29uLm9uZXJyb3IgPSAoKSA9PiB7IGZhdmljb24uc3R5bGUuZGlzcGxheSA9ICdub25lJ307IGljb25DaXJjbGUuYXBwZW5kQ2hpbGQoZmF2aWNvbil9DQogICAgICAgICAgICBsaW5rLmFwcGVuZENoaWxkKGljb25DaXJjbGUpOw0KICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzZWFyY2gnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyB0b29sdGlwLmNsYXNzTmFtZSA9ICdmaGwtaXRlbS10b29sdGlwJzsgdG9vbHRpcC50ZXh0Q29udGVudCA9IGl0ZW0ubmFtZS5sZW5ndGggPiA1ID8gaXRlbS5uYW1lLnNsaWNlKDAsIDUpICsgJy4uJyA6IGl0ZW0ubmFtZTsgbGluay5hcHBlbmRDaGlsZCh0b29sdGlwKTsNCiAgICAgICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoZSkgPT4geyBjb25zdCBjdXJyZW50VG9vbHRpcCA9IGUuY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCcuZmhsLWl0ZW0tdG9vbHRpcCcpOyBpZiAoIWN1cnJlbnRUb29sdGlwKSByZXR1cm47IGN1cnJlbnRUb29sdGlwLmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKTsgY29uc3Qgd2lkZ2V0UmVjdCA9IHdpZGdldFdyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGNvbnN0IHRvb2x0aXBSZWN0ID0gY3VycmVudFRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IGxldCBvZmZzZXRYID0gMDsgY29uc3QgcGFkZGluZyA9IDU7IGlmICh0b29sdGlwUmVjdC5sZWZ0IDwgd2lkZ2V0UmVjdC5sZWZ0KSB7IG9mZnNldFggPSB3aWRnZXRSZWN0LmxlZnQgLSB0b29sdGlwUmVjdC5sZWZ0ICsgcGFkZGluZ30gZWxzZSBpZiAodG9vbHRpcFJlY3QucmlnaHQgPiB3aWRnZXRSZWN0LnJpZ2h0KSB7IG9mZnNldFggPSB3aWRnZXRSZWN0LnJpZ2h0IC0gdG9vbHRpcFJlY3QucmlnaHQgLSBwYWRkaW5nfSBpZiAob2Zmc2V0WCAhPT0gMCkgeyBjdXJyZW50VG9vbHRpcC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWChjYWxjKC01MCUgKyAke29mZnNldFh9cHgpKWB9IH0pOw0KICAgICAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIChlKSA9PiB7IGNvbnN0IGN1cnJlbnRUb29sdGlwID0gZS5jdXJyZW50VGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJy5maGwtaXRlbS10b29sdGlwJyk7IGlmICghY3VycmVudFRvb2x0aXApIHJldHVybjsgY3VycmVudFRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpOyBjdXJyZW50VG9vbHRpcC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSd9KTsNCiAgICAgICAgICAgIH0gZWxzZSB7IGNvbnN0IG5hbWVTcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOyBuYW1lU3Bhbi5jbGFzc05hbWUgPSAnZmhsLWl0ZW0tbmFtZSc7IG5hbWVTcGFuLnRleHRDb250ZW50ID0gaXRlbS5uYW1lLmxlbmd0aCA+IDUgPyBpdGVtLm5hbWUuc2xpY2UoMCwgNSkgKyAnLi4nIDogaXRlbS5uYW1lOyBsaW5rLmFwcGVuZENoaWxkKG5hbWVTcGFuKX0NCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnbG9jYWwnKSB7DQogICAgICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgY29udHJvbHMuY2xhc3NOYW1lID0gJ2ZobC1pdGVtLWNvbnRyb2xzJzsNCiAgICAgICAgICAgICAgICBjb25zdCBkZWxldGVCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgZGVsZXRlQnRuLmNsYXNzTmFtZSA9ICdmaGwtY29udHJvbC1idG4nOyBkZWxldGVCdG4uaW5uZXJIVE1MID0gJyZ0aW1lczsnOyBkZWxldGVCdG4udGl0bGUgPSAn7IKt7KCcJzsNCiAgICAgICAgICAgICAgICBkZWxldGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGxldCBzdG9yZWRJdGVtcyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsgc3RvcmVkSXRlbXMgPSBzdG9yZWRJdGVtcy5maWx0ZXIoc3RvcmVkID0+IHN0b3JlZC51cmwgIT09IGl0ZW0udXJsKTsgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7IGluaXRpYWxSZW5kZXIoKX0pOw0KICAgICAgICAgICAgICAgIGNvbnN0IG1vdmVCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsgbW92ZUJ0bi5jbGFzc05hbWUgPSAnZmhsLWNvbnRyb2wtYnRuJzsgbW92ZUJ0bi5pbm5lckhUTUwgPSAnJmd0Oyc7IG1vdmVCdG4udGl0bGUgPSAn7Jik66W47Kq97Jy866GcIOydtOuPmSc7DQogICAgICAgICAgICAgICAgbW92ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUucHJldmVudERlZmF1bHQoKTsgZS5zdG9wUHJvcGFnYXRpb24oKTsgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOyBjb25zdCBjdXJyZW50SW5kZXggPSBzdG9yZWRJdGVtcy5maW5kSW5kZXgoc3RvcmVkID0+IHN0b3JlZC51cmwgPT09IGl0ZW0udXJsKTsgaWYgKGN1cnJlbnRJbmRleCA+IC0xKSB7IGNvbnN0IG5ld0luZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgc3RvcmVkSXRlbXMubGVuZ3RoOyBjb25zdCBbbW92ZWRJdGVtXSA9IHN0b3JlZEl0ZW1zLnNwbGljZShjdXJyZW50SW5kZXgsIDEpOyBzdG9yZWRJdGVtcy5zcGxpY2UobmV3SW5kZXgsIDAsIG1vdmVkSXRlbSk7IHNob3J0Y3V0TWFuYWdlci5zZXQoc3RvcmVkSXRlbXMpOyBpbml0aWFsUmVuZGVyKCl9IH0pOw0KICAgICAgICAgICAgICAgIGNvbnRyb2xzLmFwcGVuZENoaWxkKGRlbGV0ZUJ0bik7IGNvbnRyb2xzLmFwcGVuZENoaWxkKG1vdmVCdG4pOyBsaW5rLmFwcGVuZENoaWxkKGNvbnRyb2xzKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBsaW5rOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IGFwcGVuZE5leHRQYWdlID0gKCkgPT4geyBpZiAoaXNMb2FkaW5nTmV4dFBhZ2UpIHJldHVybjsgaXNMb2FkaW5nTmV4dFBhZ2UgPSB0cnVlOyBjb25zdCBzdGFydEluZGV4ID0gKGN1cnJlbnRQYWdlIC0gMSkgKiBJVEVNU19QRVJfUEFHRTsgY29uc3QgZW5kSW5kZXggPSBjdXJyZW50UGFnZSAqIElURU1TX1BFUl9QQUdFOyBpZiAoc3RhcnRJbmRleCA+PSBjdXJyZW50RGlzcGxheUl0ZW1zLmxlbmd0aCkgeyBpc0xvYWRpbmdOZXh0UGFnZSA9IGZhbHNlOyByZXR1cm59IGNvbnN0IGl0ZW1zVG9BcHBlbmQgPSBjdXJyZW50RGlzcGxheUl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsgaXRlbXNUb0FwcGVuZC5mb3JFYWNoKGl0ZW0gPT4geyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmFwcGVuZENoaWxkKGNyZWF0ZUljb25JdGVtKGl0ZW0sICdzZWFyY2gnKSl9KTsgY3VycmVudFBhZ2UrKzsgaXNMb2FkaW5nTmV4dFBhZ2UgPSBmYWxzZX07DQogICAgICAgIA0KICAgICAgICBjb25zdCByZW5kZXJJbml0aWFsUmVzdWx0cyA9IChpdGVtcykgPT4gew0KICAgICAgICAgICAgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gMTsNCiAgICAgICAgICAgIGN1cnJlbnREaXNwbGF5SXRlbXMgPSBBcnJheS5pc0FycmF5KGl0ZW1zKSA/IGl0ZW1zIDogW107DQogICAgICAgICAgICBhcHBlbmROZXh0UGFnZSgpOw0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IHBlcmZvcm1TZWFyY2ggPSBhc3luYyAocXVlcnkgPSAnJykgPT4gew0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYXBwYXBpMi5waHA/cXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWApOw0KICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignQVBJIOydkeuLtSDsmKTrpZgnKTsNCiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOw0KICAgICAgICAgICAgICAgIHJlbmRlckluaXRpYWxSZXN1bHRzKHJlc3VsdHMpOw0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfslbEg66qp66GdIOuhnOuTnCDsi6TtjKg6JywgZXJyb3IpOw0KICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxwPuuqqeuhnSDroZzrk5wg7Iuk7YyoPC9wPic7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCBvcGVuU2VhcmNoID0gKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLW1vZGUnKTsgd2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuYWRkKCdzZWFyY2gtbW9kZScpOyBzZWFyY2hJbnB1dC5mb2N1cygpOyBwZXJmb3JtU2VhcmNoKCl9Ow0KICAgICAgICANCmNvbnN0IGluaXRpYWxSZW5kZXIgPSAoKSA9PiB7DQogICAgICAgICAgICBjb25zdCBhID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiID0gWw0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5zZWFyY2gsIHVybDogJ2h0dHBzOi8vaXNhaS5rcicsIGljb246ICdwaC1zcGFya2xlJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5xdWVzdGlvbiwgdXJsOiAnaHR0cHM6Ly9pc2FpLmtyLyNjaGF0JywgaWNvbjogJ3BoLXF1ZXN0aW9uLW1hcmsnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLmNoYXJhY3RlckNoYXQsIHVybDogJ2h0dHBzOi8vbGFpLm9kdWMua3IvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuNy42L2xhaTQ4LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6ICdJbWFnZScsIHVybDogJ2h0dHBzOi8vMDk5LmtyLycsIGltZzogJ2h0dHA6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC85OS5wbmcnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLmJsb2csIHVybDogJ2h0dHBzOi8vYmxvZy4wOTkua3InLCBpY29uOiAncGgtYXJ0aWNsZS1tZWRpdW0nIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiAnQXJjaGl2ZSBBSScsIHVybDogJ2h0dHBzOi8vYXJjaGkudmVhaS53b3JrZXJzLmRldi8nLCBpY29uOiAncGgtYXJjaGl2ZScgfSwNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuaW5uZXJIVE1MID0gJzxidXR0b24gY2xhc3M9ImZobC1pY29uLWNpcmNsZSIgc3R5bGU9Im1hcmdpbjogMCA4cHggMCAwO2JvcmRlcjowIiBpZD0iZmhsLWVkaXQtbW9kZS1idG4iPjxpIGNsYXNzPSJwaC1ib2xkIHBoLXBlbmNpbC1zaW1wbGUiPjwvaT48L2J1dHRvbj4nOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb25zdCBlZGl0TW9kZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZWRpdC1tb2RlLWJ0bicpOw0KICAgICAgICAgICAgaWYgKGVkaXRNb2RlQnRuKSB7DQogICAgICAgICAgICAgICAgaWYgKGxpc3RDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdlZGl0LW1vZGUnKSkgew0KICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZUJ0bi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWRpdE1vZGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGxpc3RDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnZWRpdC1tb2RlJyk7DQogICAgICAgICAgICAgICAgICAgIGVkaXRNb2RlQnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScpOyANCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgY29uc3QgYyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgICAgIGxldCBkID0gWy4uLmJdOw0KICAgICAgICAgICAgZC5zcGxpY2UoMiwgMCwgLi4uYyk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KICAgICAgICAgICAgZC5mb3JFYWNoKGUgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IGYgPSBjLnNvbWUoZyA9PiBnLnVybCA9PT0gZS51cmwpOw0KICAgICAgICAgICAgICAgIGNvbnN0IGggPSBmICYmICFlLmljb24gJiYgIWUuaW1nID8gJ2xvY2FsJyA6ICdkZWZhdWx0JzsNCiAgICAgICAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChjcmVhdGVJY29uSXRlbShlLCBoKSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxpc3RDb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpOw0KDQogICAgICAgICAgICBjaGVja1Njcm9sbGFiaWxpdHkoKTsNCiAgICAgICAgICAgIHVwZGF0ZUFsbFdpZGdldExpbmtzKCk7DQogICAgICAgIH07DQogICAgICAgIA0KICAgICAgICBjb25zdCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IgPSAoKSA9PiB7IGNvbnN0IHNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbExlZnQ7IGNvbnN0IG1heFNjcm9sbExlZnQgPSBsaXN0Q29udGFpbmVyLnNjcm9sbFdpZHRoIC0gbGlzdENvbnRhaW5lci5jbGllbnRXaWR0aDsgaWYgKG1heFNjcm9sbExlZnQgPD0gMCkgcmV0dXJuOyBjb25zdCBzY3JvbGxGcmFjdGlvbiA9IHNjcm9sbExlZnQgLyBtYXhTY3JvbGxMZWZ0OyBjb25zdCB0cmFja1dpZHRoID0gaW5kaWNhdG9yVHJhY2suY2xpZW50V2lkdGg7IGNvbnN0IGluZGljYXRvcldpZHRoID0gc2Nyb2xsSW5kaWNhdG9yLmNsaWVudFdpZHRoOyBjb25zdCBtYXhJbmRpY2F0b3JMZWZ0ID0gdHJhY2tXaWR0aCAtIGluZGljYXRvcldpZHRoOyBjb25zdCBpbmRpY2F0b3JMZWZ0ID0gc2Nyb2xsRnJhY3Rpb24gKiBtYXhJbmRpY2F0b3JMZWZ0OyBzY3JvbGxJbmRpY2F0b3Iuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoLTUwJSkgdHJhbnNsYXRlWCgke2luZGljYXRvckxlZnR9cHgpYH07DQogICAgICAgIGNvbnN0IGNoZWNrU2Nyb2xsYWJpbGl0eSA9ICgpID0+IHsgY29uc3QgaXNTY3JvbGxhYmxlID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCA+IGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKCdzY3JvbGxhYmxlJywgaXNTY3JvbGxhYmxlKTsgaWYgKGlzU2Nyb2xsYWJsZSkgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yKCl9Ow0KICAgICAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlOw0KICAgICAgICBjb25zdCBoYW5kbGVEcmFnTW92ZSA9IChlKSA9PiB7IGlmICghaXNEcmFnZ2luZykgcmV0dXJuOyBlLnByZXZlbnREZWZhdWx0KCk7IGNvbnN0IHRyYWNrUmVjdCA9IGluZGljYXRvclRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyBjb25zdCBtYXhTY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IGxldCBwb3NpdGlvblJhdGlvID0gKGUuY2xpZW50WCAtIHRyYWNrUmVjdC5sZWZ0KSAvIHRyYWNrUmVjdC53aWR0aDsgcG9zaXRpb25SYXRpbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHBvc2l0aW9uUmF0aW8pKTsgbGlzdENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gcG9zaXRpb25SYXRpbyAqIG1heFNjcm9sbExlZnR9Ow0KICAgICAgICBjb25zdCBoYW5kbGVEcmFnRW5kID0gKCkgPT4geyBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjsgaXNEcmFnZ2luZyA9IGZhbHNlOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoYW5kbGVEcmFnTW92ZSk7IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBoYW5kbGVEcmFnRW5kKX07DQogICAgICAgIGluZGljYXRvclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7IGlzRHJhZ2dpbmcgPSB0cnVlOyBoYW5kbGVEcmFnTW92ZShlKTsgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZ01vdmUpOyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlRHJhZ0VuZCl9KTsNCiAgICAgICAgY29uc3QgY2xvc2VTZWFyY2ggPSAoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCdzZWFyY2gtbW9kZScpOyB3aWRnZXRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoJ3NlYXJjaC1tb2RlJyk7IHNlYXJjaElucHV0LnZhbHVlID0gJyc7IHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJyd9Ow0KICAgICAgICBsZXQgaGlkZVRpbWVvdXQgPSBudWxsOw0KICAgICAgICB3aWRnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsICgpID0+IHsgY2xlYXJUaW1lb3V0KGhpZGVUaW1lb3V0KX0pOw0KICAgICAgICB3aWRnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHsgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpfSwgNjAwMCl9KTsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBpZiAoIWxhbmd1YWdlUGFuZWwuY29udGFpbnMoZS50YXJnZXQpICYmICFsYW5ndWFnZUJ0bi5jb250YWlucyhlLnRhcmdldCkpIHsgbGFuZ3VhZ2VQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyl9IGlmICh3aWRnZXRDb250YWluZXIuY29udGFpbnMoZS50YXJnZXQpKSB7IHJldHVybn0gaWYgKHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGRlbicpKSB7IHNldFRpbWVvdXQoKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7IGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7IGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKX0sIDYwMDApfSwgNTApfSB9KTsNCiAgICAgICAgbGlzdENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB1cGRhdGVTY3JvbGxJbmRpY2F0b3IpOw0KICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgY2hlY2tTY3JvbGxhYmlsaXR5KTsNCiAgICAgICAgc2VhcmNoVHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5TZWFyY2gpOw0KICAgICAgICBsYW5ndWFnZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGxhbmd1YWdlUGFuZWwuY2xhc3NMaXN0LnRvZ2dsZSgndmlzaWJsZScpfSk7DQoNCiAgICAgICAgDQogICAgICAgIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VhcmNoVGltZW91dCk7DQogICAgICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMudmFsdWUudG9Mb3dlckNhc2UoKS50cmltKCk7DQogICAgICAgICAgICBzZWFyY2hUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgcGVyZm9ybVNlYXJjaChxdWVyeSk7DQogICAgICAgICAgICB9LCAzMDApOw0KICAgICAgICB9KTsNCiAgICAgICAgDQogICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4geyBjb25zdCBpc0F0Qm90dG9tID0gc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5zY3JvbGxUb3AgKyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmNsaWVudEhlaWdodCA+PSBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLnNjcm9sbEhlaWdodCAtIDEwOyBpZiAoaXNBdEJvdHRvbSkgeyBhcHBlbmROZXh0UGFnZSgpfSB9KTsNCiAgICAgICAgc2VhcmNoQ2xvc2UuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZVNlYXJjaCk7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4geyBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtbW9kZScpKSB7IGNsb3NlU2VhcmNoKCl9IH0pOw0KICAgICAgICANCiAgICAgICAgY29uc3QgYWRkQ3VycmVudFBhZ2VUb1dpZGdldCA9IGFzeW5jIChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gZ2V0UHJvY2Vzc2VkVXJsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsNCiAgICAgICAgICAgIGxldCBpY29uTmFtZSA9IGRvY3VtZW50LnRpdGxlIHx8IHQuY3VycmVudFBhZ2U7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9nZXRfdGl0bGUucGhwP3VybD0ke2VuY29kZVVSSUNvbXBvbmVudChiYXNlVXJsKX1gKTsNCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uub2spIHsgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsgaWYgKGRhdGEudGl0bGUpIHsgaWNvbk5hbWUgPSBkYXRhLnRpdGxlfSB9DQogICAgICAgICAgICB9IGNhdGNoIChlcnJvcikgeyBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggdGl0bGU6JywgZXJyb3IpfQ0KICAgICAgICAgICAgY29uc3QgbmV3SWNvbiA9IHsgbmFtZTogaWNvbk5hbWUsIHVybDogYmFzZVVybCB9Ow0KICAgICAgICAgICAgbGV0IHN0b3JlZEl0ZW1zID0gc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICAgICAgY29uc3QgaXNBbHJlYWR5QWRkZWQgPSBzdG9yZWRJdGVtcy5zb21lKGl0ZW0gPT4gZ2V0UHJvY2Vzc2VkVXJsKGl0ZW0udXJsKSA9PT0gZ2V0UHJvY2Vzc2VkVXJsKG5ld0ljb24udXJsKSk7DQogICAgICAgICAgICBpZiAoIWlzQWxyZWFkeUFkZGVkKSB7DQogICAgICAgICAgICAgICAgaWYgKHN0b3JlZEl0ZW1zLmxlbmd0aCA+PSAxMCkgeyBzdG9yZWRJdGVtcy5zaGlmdCgpfQ0KICAgICAgICAgICAgICAgIHN0b3JlZEl0ZW1zLnB1c2gobmV3SWNvbik7DQogICAgICAgICAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLnNldChzdG9yZWRJdGVtcyk7DQogICAgICAgICAgICAgICAgdHJ5IHsgYXdhaXQgZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9yZWdpc3Rlcl9hcHAucGhwYCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KG5ld0ljb24pIH0pfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcignREIg65Ox66GdL+qwseyLoCDsi6TtjKg6JywgZXJyb3IpfQ0KICAgICAgICAgICAgICAgIGluaXRpYWxSZW5kZXIoKTsNCiAgICAgICAgICAgICAgICBpZiAod2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QuY29udGFpbnMoJ3NlYXJjaC1tb2RlJykpIHsgY2xvc2VTZWFyY2goKX0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgc2hvd1RvYXN0KHQuYWxyZWFkeUFkZGVkKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBjb3B5V2lkZ2V0U2NyaXB0ID0gKGUpID0+IHsNCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIGNvbnN0IHRleHRUb0NvcHkgPSAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL0BwaG9zcGhvci1pY29ucy93ZWIiPjxcL3NjcmlwdD48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19sZy5qcyI+PFwvc2NyaXB0PjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jc3MuY3NzIj48ZGl2IGlkPSJhcHAiPjxcL2Rpdj48c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jZG5odG1sLmpzIj48XC9zY3JpcHQ+IDxzY3JpcHQgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL2Nkbmhvc3RAbGF0ZXN0L3dzX2Nkbi5qcyI+PFwvc2NyaXB0Pic7DQogICAgICAgICAgICBjb25zdCB0ID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBmYWxsYmFja0NvcHkgPSAoKSA9PiB7IGNvbnN0IHRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTsgdGV4dEFyZWEudmFsdWUgPSB0ZXh0VG9Db3B5OyB0ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9ICJmaXhlZCI7IHRleHRBcmVhLnN0eWxlLnRvcCA9IDA7IHRleHRBcmVhLnN0eWxlLmxlZnQgPSAiLTk5OTlweCI7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGV4dEFyZWEpOyB0ZXh0QXJlYS5mb2N1cygpOyB0ZXh0QXJlYS5zZWxlY3QoKTsgdHJ5IHsgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9IGNhdGNoIChlcnIpIHsgY29uc29sZS5lcnJvcignRmFsbGJhY2s6IE9vcHMsIHVuYWJsZSB0byBjb3B5JywgZXJyKX0gZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXh0QXJlYSl9Ow0KICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgd2luZG93LmlzU2VjdXJlQ29udGV4dCkgeyBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0VG9Db3B5KS50aGVuKCgpID0+IHsgc2hvd1RvYXN0KHQuY29kZUNvcGllZCl9KS5jYXRjaCgoKSA9PiB7IGZhbGxiYWNrQ29weSgpfSl9IGVsc2UgeyBmYWxsYmFja0NvcHkoKX0NCiAgICAgICAgfTsNCg0KICAgICAgICBhZGRUb0hvbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhZGRDdXJyZW50UGFnZVRvV2lkZ2V0KTsNCiAgICAgICAgc2VhcmNoQWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY29weVdpZGdldFNjcmlwdCk7DQogICAgICAgIA0KICAgICAgICBzaG9ydGN1dE1hbmFnZXIuc3luY0Zyb21VUkwoKTsNCiAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLmdldCgpOw0KICAgICAgICANCiAgICAgICAgcG9wdWxhdGVMYW5ndWFnZVBhbmVsKCk7DQogICAgICAgIGFwcGx5TGFuZ3VhZ2UoY3VycmVudExhbmcpOw0KICAgIH0pOw=='))));
6
+ eval(decodeURIComponent(escape(window.atob('DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkgew0KICAgICAgICBpZiAod2luZG93LkZITFdpZGdldEluaXRpYWxpemVkKSByZXR1cm47DQogICAgICAgIHdpbmRvdy5GSExXaWRnZXRJbml0aWFsaXplZCA9IHRydWU7DQoNCiAgICAgICAgY29uc3QgbGFuZ3VhZ2VzID0gWyB7IGNvZGU6ICdlbicsIG5hbWU6ICdFbmdsaXNoJyB9LCB7IGNvZGU6ICdrbycsIG5hbWU6ICftlZzqta3slrQnIH0sIHsgY29kZTogJ2VzJywgbmFtZTogJ0VzcGHDsW9sJyB9LCB7IGNvZGU6ICdoaScsIG5hbWU6ICfgpLngpL/gpKjgpY3gpKbgpYAnIH0sIHsgY29kZTogJ2FyJywgbmFtZTogJ9in2YTYudix2KjZitipJyB9LCB7IGNvZGU6ICdkZScsIG5hbWU6ICdEZXV0c2NoJyB9LCB7IGNvZGU6ICdmcicsIG5hbWU6ICdGcmFuw6dhaXMnIH0sIHsgY29kZTogJ3B0JywgbmFtZTogJ1BvcnR1Z3XDqnMnIH0sIHsgY29kZTogJ2JuJywgbmFtZTogJ+CmrOCmvuCmguCmsuCmvicgfSwgeyBjb2RlOiAnamEnLCBuYW1lOiAn5pel5pys6KqeJyB9LCB7IGNvZGU6ICdydScsIG5hbWU6ICfQoNGD0YHRgdC60LjQuScgfSwgeyBjb2RlOiAnemgnLCBuYW1lOiAn566A5L2T5Lit5paHJyB9LCB7IGNvZGU6ICd0aCcsIG5hbWU6ICfguYTguJfguKInIH0sIHsgY29kZTogJ3ZpJywgbmFtZTogJ1Rp4bq/bmcgVmnhu4d0JyB9LCB7IGNvZGU6ICdpZCcsIG5hbWU6ICdJbmRvbmVzaWEnIH0sIHsgY29kZTogJ3RyJywgbmFtZTogJ1TDvHJrw6dlJyB9LCB7IGNvZGU6ICd1cicsIG5hbWU6ICfYp9ix2K/ZiCcgfV07DQogICAgICAgIGxldCBjdXJyZW50RGlzcGxheUl0ZW1zID0gW107IA0KICAgICAgICBsZXQgY3VycmVudFBhZ2UgPSAxOyANCiAgICAgICAgY29uc3QgSVRFTVNfUEVSX1BBR0UgPSAzMDsNCiAgICAgICAgbGV0IGlzTG9hZGluZ05leHRQYWdlID0gZmFsc2U7IA0KICAgICAgICBsZXQgc2VhcmNoVGltZW91dCA9IG51bGw7DQoNCiAgICAgICAgY29uc3Qgd2lkZ2V0Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC13aWRnZXQtY29udGFpbmVyJyk7DQogICAgICAgIGNvbnN0IHdpZGdldFdyYXBwZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXdpZGdldC13cmFwcGVyJyk7DQogICAgICAgIGNvbnN0IGxpc3RDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWxpc3QtY29udGFpbmVyJyk7DQogICAgICAgIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1zZWFyY2gtaW5wdXQnKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLXJlc3VsdHMnKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoVHJpZ2dlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2VhcmNoLXRyaWdnZXInKTsNCiAgICAgICAgY29uc3Qgc2VhcmNoQ2xvc2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1jbG9zZScpOw0KICAgICAgICBjb25zdCBpbmRpY2F0b3JUcmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtaW5kaWNhdG9yLXRyYWNrJyk7DQogICAgICAgIGNvbnN0IHNjcm9sbEluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtc2Nyb2xsLWluZGljYXRvcicpOw0KICAgICAgICBjb25zdCBhZGRUb0hvbWVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWFkZC10by1ob21lLWJ0bicpOw0KICAgICAgICBjb25zdCBzZWFyY2hBZGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLXNlYXJjaC1hZGQtYnRuJyk7DQogICAgICAgIGNvbnN0IHRvYXN0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtdG9hc3Qtbm90aWZpY2F0aW9uJyk7DQogICAgICAgIGNvbnN0IGxhbmd1YWdlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1sYW5ndWFnZS1idG4nKTsNCiAgICAgICAgY29uc3QgbGFuZ3VhZ2VQYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtbGFuZ3VhZ2UtcGFuZWwnKTsNCiAgICAgICAgY29uc3QgZml4ZWRRdWVzdGlvbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZml4ZWQtcXVlc3Rpb24nKTsNCiAgICAgICAgY29uc3QgZml4ZWRDaGF0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZobC1maXhlZC1jaGF0Jyk7DQogICAgICAgIGNvbnN0IGZpeGVkSW5mb0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmaGwtZml4ZWQtaW5mbycpOw0KICAgICAgICANCiAgICAgICAgbGV0IHRvYXN0VGltZW91dCA9IG51bGw7DQoJCWNvbnN0IGJyb3dzZXJMYW5nID0gbmF2aWdhdG9yLmxhbmd1YWdlLnN1YnN0cmluZygwLCAyKTsNCgkJbGV0IGN1cnJlbnRMYW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2ZobC13aWRnZXQtbGFuZycpIHx8IGJyb3dzZXJMYW5nIHx8ICdlbic7DQogICAgICAgIGNvbnN0IEFQSV9CQVNFX1VSTCA9ICdodHRwczovL2lzYWkua3InOw0KDQogICAgICAgIGNvbnN0IHNob3J0Y3V0TWFuYWdlciA9IHsNCiAgICAgICAgICAgIGtleTogJ2ZobC1jdXN0b20taWNvbnMtd2l0aC1leHBpcnknLA0KICAgICAgICAgICAgZ2V0OiAoKSA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgcmF3RGF0YSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXkpOw0KICAgICAgICAgICAgICAgIGlmICghcmF3RGF0YSkgcmV0dXJuIFtdOw0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJhd0RhdGEpOw0KICAgICAgICAgICAgICAgICAgICBjb25zdCB0aGlydHlEYXlzSW5NcyA9IDMwICogMjQgKiA2MCAqIDYwICogMTAwMDsNCiAgICAgICAgICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSBkYXRhLnRpbWVzdGFtcCA+IHRoaXJ0eURheXNJbk1zKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzaG9ydGN1dE1hbmFnZXIua2V5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShkYXRhLnNob3J0Y3V0cykgPyBkYXRhLnNob3J0Y3V0cy5maWx0ZXIoaXRlbSA9PiBpdGVtICYmIGl0ZW0ubmFtZSAmJiBpdGVtLnVybCkgOiBbXTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7DQogICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHNob3J0Y3V0TWFuYWdlci5rZXkpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNldDogKHNob3J0Y3V0cykgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFUb1N0b3JlID0geyB0aW1lc3RhbXA6IERhdGUubm93KCksIHNob3J0Y3V0czogc2hvcnRjdXRzIH07DQogICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSwgSlNPTi5zdHJpbmdpZnkoZGF0YVRvU3RvcmUpKTsNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBzeW5jRnJvbVVSTDogKCkgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7DQogICAgICAgICAgICAgICAgY29uc3Qgc2hvcnRjdXRzUGFyYW0gPSBwYXJhbXMuZ2V0KCdzaG9ydGN1dHMnKTsNCiAgICAgICAgICAgICAgICBpZiAoc2hvcnRjdXRzUGFyYW0pIHsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gZGVjb2RlVVJJQ29tcG9uZW50KHNob3J0Y3V0c1BhcmFtKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoZGVjb2RlZERhdGEpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSwgZGVjb2RlZERhdGEpOw0KICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBwYXJzZSBzaG9ydGN1dHMgZnJvbSBVUkw6IiwgZSl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGdldEFzUGFyYW06ICgpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCByYXdEYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oc2hvcnRjdXRNYW5hZ2VyLmtleSk7DQogICAgICAgICAgICAgICAgaWYgKCFyYXdEYXRhKSByZXR1cm4gJyc7DQogICAgICAgICAgICAgICAgcmV0dXJuIGBzaG9ydGN1dHM9JHtlbmNvZGVVUklDb21wb25lbnQocmF3RGF0YSl9YDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IHVwZGF0ZUFsbFdpZGdldExpbmtzID0gKCkgPT4gew0KICAgICAgICAgICAgY29uc3QgcGFyYW1TdHJpbmcgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0QXNQYXJhbSgpOw0KICAgICAgICAgICAgaWYgKCFwYXJhbVN0cmluZykgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgYWxsTGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjZmhsLXdpZGdldC1jb250YWluZXIgLmZobC1pY29uLWRpc3BsYXksICNmaGwtd2lkZ2V0LWNvbnRhaW5lciAuZmhsLWZpeGVkLWl0ZW0nKTsNCiAgICAgICAgICAgIGFsbExpbmtzLmZvckVhY2gobGluayA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGxpbmsudGFnTmFtZSA9PT0gJ0EnKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSHJlZiA9IGxpbmsuZ2V0QXR0cmlidXRlKCdocmVmJyk7DQogICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxIcmVmIHx8IG9yaWdpbmFsSHJlZi5zdGFydHNXaXRoKCcjJykpIHJldHVybjsNCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdVcmwgPSBuZXcgVVJMKG9yaWdpbmFsSHJlZik7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJhbVN0cmluZy5zcGxpdCgnPScpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3VXJsLnNlYXJjaFBhcmFtcy5zZXQoa2V5LCB2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBuZXdVcmwudG9TdHJpbmcoKTsNCgkJCQkJCWxpbmsucmVsID0gJ25vZm9sbG93JzsgDQogICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkwgZm9yIGxpbmsgdXBkYXRlOicsIG9yaWdpbmFsSHJlZil9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3Qgc2hvd1RvYXN0ID0gKG1lc3NhZ2UpID0+IHsgY2xlYXJUaW1lb3V0KHRvYXN0VGltZW91dCk7IHRvYXN0RWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7IHRvYXN0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7IHRvYXN0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB0b2FzdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpfSwgMjUwMCl9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgYXBwbHlMYW5ndWFnZSA9IChsYW5nQ29kZSkgPT4gew0KICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2xhdGlvbnMgPT09ICd1bmRlZmluZWQnKSB7IGNvbnNvbGUuZXJyb3IoIlRyYW5zbGF0aW9ucyBub3QgbG9hZGVkISBNYWtlIHN1cmUgbGFuZy5qcyBpcyBpbmNsdWRlZCBjb3JyZWN0bHkuIik7IHJldHVybn0NCiAgICAgICAgICAgIGNvbnN0IHQgPSB0cmFuc2xhdGlvbnNbbGFuZ0NvZGVdIHx8IHRyYW5zbGF0aW9uc1snZW4nXTsNCiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sYW5nID0gbGFuZ0NvZGU7DQogICAgICAgICAgICBzZWFyY2hUcmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQub3BlblNlYXJjaCk7DQogICAgICAgICAgICBhZGRUb0hvbWVCdG4uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdC5hZGRUb1dpZGdldCk7DQogICAgICAgICAgICBzZWFyY2hDbG9zZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmNsb3NlU2VhcmNoKTsNCiAgICAgICAgICAgIGxhbmd1YWdlQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuY2hhbmdlTGFuZ3VhZ2UpOw0KICAgICAgICAgICAgc2VhcmNoQWRkQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdDb3B5IFdpZGdldCBDb2RlJyk7IA0KICAgICAgICAgICAgZml4ZWRRdWVzdGlvbkJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LnF1ZXN0aW9uKTsNCiAgICAgICAgICAgIGZpeGVkQ2hhdEJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCB0LmNoYXJhY3RlckNoYXQpOw0KICAgICAgICAgICAgZml4ZWRJbmZvQnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIHQuaW5mbyk7DQogICAgICAgICAgICBpbml0aWFsUmVuZGVyKCk7DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3QgcG9wdWxhdGVMYW5ndWFnZVBhbmVsID0gKCkgPT4geyBsYW5ndWFnZVBhbmVsLmlubmVySFRNTCA9ICcnOyBsYW5ndWFnZXMuZm9yRWFjaChsYW5nID0+IHsgY29uc3QgbGFuZ0l0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7IGxhbmdJdGVtLmhyZWYgPSAnIyc7IGxhbmdJdGVtLmNsYXNzTmFtZSA9ICdmaGwtbGFuZ3VhZ2UtaXRlbSc7IGxhbmdJdGVtLnRleHRDb250ZW50ID0gbGFuZy5uYW1lOyBsYW5nSXRlbS5kYXRhc2V0LmxhbmcgPSBsYW5nLmNvZGU7IGxhbmdJdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBjb25zdCBuZXdMYW5nID0gZS50YXJnZXQuZGF0YXNldC5sYW5nOyBpZiAobmV3TGFuZyAhPT0gY3VycmVudExhbmcpIHsgY3VycmVudExhbmcgPSBuZXdMYW5nOyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZmhsLXdpZGdldC1sYW5nJywgY3VycmVudExhbmcpOyBhcHBseUxhbmd1YWdlKGN1cnJlbnRMYW5nKX0gbGFuZ3VhZ2VQYW5lbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJyl9KTsgbGFuZ3VhZ2VQYW5lbC5hcHBlbmRDaGlsZChsYW5nSXRlbSl9KX07DQoNCiAgICAgICAgY29uc3QgZ2V0UHJvY2Vzc2VkVXJsID0gKGZ1bGxVcmwpID0+IHsgdHJ5IHsgY29uc3QgdXJsT2JqID0gbmV3IFVSTChmdWxsVXJsKTsgcmV0dXJuIGAke3VybE9iai5wcm90b2NvbH0vLyR7dXJsT2JqLmhvc3RuYW1lfWB9IGNhdGNoIChlKSB7IHJldHVybiBmdWxsVXJsfSB9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgY3JlYXRlSWNvbkl0ZW0gPSAoaXRlbSwgdHlwZSA9ICdkZWZhdWx0JykgPT4gew0KICAgICAgICAgICAgaWYgKCFpdGVtIHx8ICFpdGVtLm5hbWUgfHwgIWl0ZW0udXJsKSByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOw0KICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2VhcmNoJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtU3RyaW5nID0gc2hvcnRjdXRNYW5hZ2VyLmdldEFzUGFyYW0oKTsNCiAgICAgICAgICAgICAgICBsZXQgZmluYWxVcmwgPSBpdGVtLnVybDsNCiAgICAgICAgICAgICAgICBpZiAocGFyYW1TdHJpbmcpIHsgdHJ5IHsgbGV0IG5ld1VybCA9IG5ldyBVUkwoaXRlbS51cmwpOyBjb25zdCBba2V5LCB2YWx1ZV0gPSBwYXJhbVN0cmluZy5zcGxpdCgnPScpOyBuZXdVcmwuc2VhcmNoUGFyYW1zLnNldChrZXksIHZhbHVlKTsgZmluYWxVcmwgPSBuZXdVcmwudG9TdHJpbmcoKX0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignSW52YWxpZCBVUkwgZm9yIHNlYXJjaCByZXN1bHQgbGluazonLCBpdGVtLnVybCl9IH0NCiAgICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBmaW5hbFVybDsNCiAgICAgICAgICAgIH0gZWxzZSB7IGxpbmsuaHJlZiA9IGl0ZW0udXJsfQ0KICAgICAgICAgICAgbGluay5jbGFzc05hbWUgPSAnZmhsLWljb24tZGlzcGxheSc7DQoJCQlsaW5rLnJlbCA9ICdub2ZvbGxvdyc7DQogICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGl0ZW0ubmFtZSk7DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NlYXJjaCcpIHsgbGluay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoKSA9PiB7IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vdXBkYXRlX3ZpZXdfY291bnQucGhwYCwgeyBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXJsOiBpdGVtLnVybCB9KSB9KS5jYXRjaChjb25zb2xlLmVycm9yKX0pOyBsaW5rLnRhcmdldCA9ICdfYmxhbmsnfQ0KICAgICAgICAgICAgY29uc3QgaWNvbkNpcmNsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOyBpY29uQ2lyY2xlLmNsYXNzTmFtZSA9ICdmaGwtaWNvbi1jaXJjbGUnOw0KICAgICAgICAgICAgaWYgKGl0ZW0uaWNvbikgeyBjb25zdCBpY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpOyBpY29uLmNsYXNzTmFtZSA9IGBwaC1ib2xkICR7aXRlbS5pY29ufWA7IGljb25DaXJjbGUuYXBwZW5kQ2hpbGQoaWNvbil9DQogICAgICAgICAgICBlbHNlIGlmIChpdGVtLmltZykgeyBjb25zdCBjdXN0b21JbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOyBjdXN0b21JbWFnZS5zcmMgPSBpdGVtLmltZzsgY3VzdG9tSW1hZ2UuYWx0ID0gaXRlbS5uYW1lOyBjdXN0b21JbWFnZS5vbmVycm9yID0gKCkgPT4geyBjdXN0b21JbWFnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnfTsgaWNvbkNpcmNsZS5hcHBlbmRDaGlsZChjdXN0b21JbWFnZSl9DQogICAgICAgICAgICBlbHNlIHsgY29uc3QgZmF2aWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpOyBmYXZpY29uLnNyYyA9IGBodHRwczovL3d3dy5nb29nbGUuY29tL3MyL2Zhdmljb25zP3N6PTY0JmRvbWFpbl91cmw9JHtpdGVtLnVybH1gOyBmYXZpY29uLmFsdCA9IGl0ZW0ubmFtZTsgZmF2aWNvbi5vbmVycm9yID0gKCkgPT4geyBmYXZpY29uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSd9OyBpY29uQ2lyY2xlLmFwcGVuZENoaWxkKGZhdmljb24pfQ0KICAgICAgICAgICAgbGluay5hcHBlbmRDaGlsZChpY29uQ2lyY2xlKTsNCiAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2VhcmNoJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IHRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsgdG9vbHRpcC5jbGFzc05hbWUgPSAnZmhsLWl0ZW0tdG9vbHRpcCc7IHRvb2x0aXAudGV4dENvbnRlbnQgPSBpdGVtLm5hbWUubGVuZ3RoID4gNSA/IGl0ZW0ubmFtZS5zbGljZSgwLCA1KSArICcuLicgOiBpdGVtLm5hbWU7IGxpbmsuYXBwZW5kQ2hpbGQodG9vbHRpcCk7DQogICAgICAgICAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKGUpID0+IHsgY29uc3QgY3VycmVudFRvb2x0aXAgPSBlLmN1cnJlbnRUYXJnZXQucXVlcnlTZWxlY3RvcignLmZobC1pdGVtLXRvb2x0aXAnKTsgaWYgKCFjdXJyZW50VG9vbHRpcCkgcmV0dXJuOyBjdXJyZW50VG9vbHRpcC5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7IGNvbnN0IHdpZGdldFJlY3QgPSB3aWRnZXRXcmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyBjb25zdCB0b29sdGlwUmVjdCA9IGN1cnJlbnRUb29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOyBsZXQgb2Zmc2V0WCA9IDA7IGNvbnN0IHBhZGRpbmcgPSA1OyBpZiAodG9vbHRpcFJlY3QubGVmdCA8IHdpZGdldFJlY3QubGVmdCkgeyBvZmZzZXRYID0gd2lkZ2V0UmVjdC5sZWZ0IC0gdG9vbHRpcFJlY3QubGVmdCArIHBhZGRpbmd9IGVsc2UgaWYgKHRvb2x0aXBSZWN0LnJpZ2h0ID4gd2lkZ2V0UmVjdC5yaWdodCkgeyBvZmZzZXRYID0gd2lkZ2V0UmVjdC5yaWdodCAtIHRvb2x0aXBSZWN0LnJpZ2h0IC0gcGFkZGluZ30gaWYgKG9mZnNldFggIT09IDApIHsgY3VycmVudFRvb2x0aXAuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoY2FsYygtNTAlICsgJHtvZmZzZXRYfXB4KSlgfSB9KTsNCiAgICAgICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoZSkgPT4geyBjb25zdCBjdXJyZW50VG9vbHRpcCA9IGUuY3VycmVudFRhcmdldC5xdWVyeVNlbGVjdG9yKCcuZmhsLWl0ZW0tdG9vbHRpcCcpOyBpZiAoIWN1cnJlbnRUb29sdGlwKSByZXR1cm47IGN1cnJlbnRUb29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoJ3Zpc2libGUnKTsgY3VycmVudFRvb2x0aXAuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknfSk7DQogICAgICAgICAgICB9IGVsc2UgeyBjb25zdCBuYW1lU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsgbmFtZVNwYW4uY2xhc3NOYW1lID0gJ2ZobC1pdGVtLW5hbWUnOyBuYW1lU3Bhbi50ZXh0Q29udGVudCA9IGl0ZW0ubmFtZS5sZW5ndGggPiA1ID8gaXRlbS5uYW1lLnNsaWNlKDAsIDUpICsgJy4uJyA6IGl0ZW0ubmFtZTsgbGluay5hcHBlbmRDaGlsZChuYW1lU3Bhbil9DQogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2xvY2FsJykgew0KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7IGNvbnRyb2xzLmNsYXNzTmFtZSA9ICdmaGwtaXRlbS1jb250cm9scyc7DQogICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IGRlbGV0ZUJ0bi5jbGFzc05hbWUgPSAnZmhsLWNvbnRyb2wtYnRuJzsgZGVsZXRlQnRuLmlubmVySFRNTCA9ICcmdGltZXM7JzsgZGVsZXRlQnRuLnRpdGxlID0gJ+yCreygnCc7DQogICAgICAgICAgICAgICAgZGVsZXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgZS5wcmV2ZW50RGVmYXVsdCgpOyBlLnN0b3BQcm9wYWdhdGlvbigpOyBsZXQgc3RvcmVkSXRlbXMgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0KCk7IHN0b3JlZEl0ZW1zID0gc3RvcmVkSXRlbXMuZmlsdGVyKHN0b3JlZCA9PiBzdG9yZWQudXJsICE9PSBpdGVtLnVybCk7IHNob3J0Y3V0TWFuYWdlci5zZXQoc3RvcmVkSXRlbXMpOyBpbml0aWFsUmVuZGVyKCl9KTsNCiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7IG1vdmVCdG4uY2xhc3NOYW1lID0gJ2ZobC1jb250cm9sLWJ0bic7IG1vdmVCdG4uaW5uZXJIVE1MID0gJyZndDsnOyBtb3ZlQnRuLnRpdGxlID0gJ+yYpOuluOyqveycvOuhnCDsnbTrj5knOw0KICAgICAgICAgICAgICAgIG1vdmVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnByZXZlbnREZWZhdWx0KCk7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IGxldCBzdG9yZWRJdGVtcyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsgY29uc3QgY3VycmVudEluZGV4ID0gc3RvcmVkSXRlbXMuZmluZEluZGV4KHN0b3JlZCA9PiBzdG9yZWQudXJsID09PSBpdGVtLnVybCk7IGlmIChjdXJyZW50SW5kZXggPiAtMSkgeyBjb25zdCBuZXdJbmRleCA9IChjdXJyZW50SW5kZXggKyAxKSAlIHN0b3JlZEl0ZW1zLmxlbmd0aDsgY29uc3QgW21vdmVkSXRlbV0gPSBzdG9yZWRJdGVtcy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTsgc3RvcmVkSXRlbXMuc3BsaWNlKG5ld0luZGV4LCAwLCBtb3ZlZEl0ZW0pOyBzaG9ydGN1dE1hbmFnZXIuc2V0KHN0b3JlZEl0ZW1zKTsgaW5pdGlhbFJlbmRlcigpfSB9KTsNCiAgICAgICAgICAgICAgICBjb250cm9scy5hcHBlbmRDaGlsZChkZWxldGVCdG4pOyBjb250cm9scy5hcHBlbmRDaGlsZChtb3ZlQnRuKTsgbGluay5hcHBlbmRDaGlsZChjb250cm9scyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbGluazsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBhcHBlbmROZXh0UGFnZSA9ICgpID0+IHsgaWYgKGlzTG9hZGluZ05leHRQYWdlKSByZXR1cm47IGlzTG9hZGluZ05leHRQYWdlID0gdHJ1ZTsgY29uc3Qgc3RhcnRJbmRleCA9IChjdXJyZW50UGFnZSAtIDEpICogSVRFTVNfUEVSX1BBR0U7IGNvbnN0IGVuZEluZGV4ID0gY3VycmVudFBhZ2UgKiBJVEVNU19QRVJfUEFHRTsgaWYgKHN0YXJ0SW5kZXggPj0gY3VycmVudERpc3BsYXlJdGVtcy5sZW5ndGgpIHsgaXNMb2FkaW5nTmV4dFBhZ2UgPSBmYWxzZTsgcmV0dXJufSBjb25zdCBpdGVtc1RvQXBwZW5kID0gY3VycmVudERpc3BsYXlJdGVtcy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7IGl0ZW1zVG9BcHBlbmQuZm9yRWFjaChpdGVtID0+IHsgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5hcHBlbmRDaGlsZChjcmVhdGVJY29uSXRlbShpdGVtLCAnc2VhcmNoJykpfSk7IGN1cnJlbnRQYWdlKys7IGlzTG9hZGluZ05leHRQYWdlID0gZmFsc2V9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgcmVuZGVySW5pdGlhbFJlc3VsdHMgPSAoaXRlbXMpID0+IHsNCiAgICAgICAgICAgIHNlYXJjaFJlc3VsdHNDb250YWluZXIuaW5uZXJIVE1MID0gJyc7DQogICAgICAgICAgICBjdXJyZW50UGFnZSA9IDE7DQogICAgICAgICAgICBjdXJyZW50RGlzcGxheUl0ZW1zID0gQXJyYXkuaXNBcnJheShpdGVtcykgPyBpdGVtcyA6IFtdOw0KICAgICAgICAgICAgYXBwZW5kTmV4dFBhZ2UoKTsNCiAgICAgICAgfTsNCg0KICAgICAgICBjb25zdCBwZXJmb3JtU2VhcmNoID0gYXN5bmMgKHF1ZXJ5ID0gJycpID0+IHsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FwcGFwaTIucGhwP3F1ZXJ5PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHF1ZXJ5KX1gKTsNCiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ0FQSSDsnZHri7Ug7Jik66WYJyk7DQogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsNCiAgICAgICAgICAgICAgICByZW5kZXJJbml0aWFsUmVzdWx0cyhyZXN1bHRzKTsNCiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcign7JWxIOuqqeuhnSDroZzrk5wg7Iuk7YyoOicsIGVycm9yKTsNCiAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8cD7rqqnroZ0g66Gc65OcIOyLpO2MqDwvcD4nOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgY29uc3Qgb3BlblNlYXJjaCA9ICgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3NlYXJjaC1tb2RlJyk7IHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnc2VhcmNoLW1vZGUnKTsgc2VhcmNoSW5wdXQuZm9jdXMoKTsgcGVyZm9ybVNlYXJjaCgpfTsNCiAgICAgICAgDQoJCWNvbnN0IGluaXRpYWxSZW5kZXIgPSAoKSA9PiB7DQogICAgICAgICAgICBjb25zdCBhID0gdHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXSB8fCB0cmFuc2xhdGlvbnNbJ2VuJ107DQogICAgICAgICAgICBjb25zdCBiID0gWw0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5zZWFyY2gsIHVybDogJ2h0dHBzOi8vaXNhaS5rcicsIGljb246ICdwaC1zcGFya2xlJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5xdWVzdGlvbiwgdXJsOiAnaHR0cHM6Ly9pc2FpLmtyLyNjaGF0JywgaWNvbjogJ3BoLXF1ZXN0aW9uLW1hcmsnIH0sDQogICAgICAgICAgICAgICAgeyBuYW1lOiBhLmNoYXJhY3RlckNoYXQsIHVybDogJ2h0dHBzOi8vbGFpLm9kdWMua3IvJywgaW1nOiAnaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QDIuNy42L2xhaTQ4LnBuZycgfSwNCiAgICAgICAgICAgICAgICB7IG5hbWU6IGEuaW1hZ2VzLCB1cmw6ICdodHRwczovLzA5OS5rci8nLCBpbWc6ICdodHRwOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3QvOTkucG5nJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogYS5ibG9nLCB1cmw6ICdodHRwczovL2Jsb2cuMDk5LmtyJywgaWNvbjogJ3BoLWFydGljbGUtbWVkaXVtJyB9LA0KICAgICAgICAgICAgICAgIHsgbmFtZTogJ0FyY2hpdmUgQUknLCB1cmw6ICdodHRwczovL2FyY2hpLnZlYWkud29ya2Vycy5kZXYvJywgaWNvbjogJ3BoLWFyY2hpdmUnIH0sDQogICAgICAgICAgICBdOw0KDQogICAgICAgICAgICBsaXN0Q29udGFpbmVyLmlubmVySFRNTCA9ICc8YnV0dG9uIGNsYXNzPSJmaGwtaWNvbi1jaXJjbGUiIHN0eWxlPSJtYXJnaW46IDAgOHB4IDAgMDtib3JkZXI6MCIgaWQ9ImZobC1lZGl0LW1vZGUtYnRuIj48aSBjbGFzcz0icGgtYm9sZCBwaC1wZW5jaWwtc2ltcGxlIj48L2k+PC9idXR0b24+JzsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY29uc3QgZWRpdE1vZGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmhsLWVkaXQtbW9kZS1idG4nKTsNCiAgICAgICAgICAgIGlmIChlZGl0TW9kZUJ0bikgew0KICAgICAgICAgICAgICAgIGlmIChsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygnZWRpdC1tb2RlJykpIHsNCiAgICAgICAgICAgICAgICAgICAgZWRpdE1vZGVCdG4uY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVkaXRNb2RlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICBsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoJ2VkaXQtbW9kZScpOw0KICAgICAgICAgICAgICAgICAgICBlZGl0TW9kZUJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdhY3RpdmUnKTsgDQogICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNvbnN0IGMgPSBzaG9ydGN1dE1hbmFnZXIuZ2V0KCk7DQogICAgICAgICAgICBsZXQgZCA9IFsuLi5iXTsNCiAgICAgICAgICAgIGQuc3BsaWNlKDIsIDAsIC4uLmMpOw0KICAgICAgICAgICAgDQogICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsNCiAgICAgICAgICAgIGQuZm9yRWFjaChlID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCBmID0gYy5zb21lKGcgPT4gZy51cmwgPT09IGUudXJsKTsNCiAgICAgICAgICAgICAgICBjb25zdCBoID0gZiAmJiAhZS5pY29uICYmICFlLmltZyA/ICdsb2NhbCcgOiAnZGVmYXVsdCc7DQogICAgICAgICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY3JlYXRlSWNvbkl0ZW0oZSwgaCkpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBsaXN0Q29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTsNCg0KICAgICAgICAgICAgY2hlY2tTY3JvbGxhYmlsaXR5KCk7DQogICAgICAgICAgICB1cGRhdGVBbGxXaWRnZXRMaW5rcygpOw0KICAgICAgICB9Ow0KICAgICAgICANCiAgICAgICAgY29uc3QgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yID0gKCkgPT4geyBjb25zdCBzY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxMZWZ0OyBjb25zdCBtYXhTY3JvbGxMZWZ0ID0gbGlzdENvbnRhaW5lci5zY3JvbGxXaWR0aCAtIGxpc3RDb250YWluZXIuY2xpZW50V2lkdGg7IGlmIChtYXhTY3JvbGxMZWZ0IDw9IDApIHJldHVybjsgY29uc3Qgc2Nyb2xsRnJhY3Rpb24gPSBzY3JvbGxMZWZ0IC8gbWF4U2Nyb2xsTGVmdDsgY29uc3QgdHJhY2tXaWR0aCA9IGluZGljYXRvclRyYWNrLmNsaWVudFdpZHRoOyBjb25zdCBpbmRpY2F0b3JXaWR0aCA9IHNjcm9sbEluZGljYXRvci5jbGllbnRXaWR0aDsgY29uc3QgbWF4SW5kaWNhdG9yTGVmdCA9IHRyYWNrV2lkdGggLSBpbmRpY2F0b3JXaWR0aDsgY29uc3QgaW5kaWNhdG9yTGVmdCA9IHNjcm9sbEZyYWN0aW9uICogbWF4SW5kaWNhdG9yTGVmdDsgc2Nyb2xsSW5kaWNhdG9yLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoJHtpbmRpY2F0b3JMZWZ0fXB4KWB9Ow0KICAgICAgICBjb25zdCBjaGVja1Njcm9sbGFiaWxpdHkgPSAoKSA9PiB7IGNvbnN0IGlzU2Nyb2xsYWJsZSA9IGxpc3RDb250YWluZXIuc2Nyb2xsV2lkdGggPiBsaXN0Q29udGFpbmVyLmNsaWVudFdpZHRoOyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnRvZ2dsZSgnc2Nyb2xsYWJsZScsIGlzU2Nyb2xsYWJsZSk7IGlmIChpc1Njcm9sbGFibGUpIHVwZGF0ZVNjcm9sbEluZGljYXRvcigpfTsNCiAgICAgICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsNCiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ01vdmUgPSAoZSkgPT4geyBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjsgZS5wcmV2ZW50RGVmYXVsdCgpOyBjb25zdCB0cmFja1JlY3QgPSBpbmRpY2F0b3JUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgY29uc3QgbWF4U2Nyb2xsTGVmdCA9IGxpc3RDb250YWluZXIuc2Nyb2xsV2lkdGggLSBsaXN0Q29udGFpbmVyLmNsaWVudFdpZHRoOyBsZXQgcG9zaXRpb25SYXRpbyA9IChlLmNsaWVudFggLSB0cmFja1JlY3QubGVmdCkgLyB0cmFja1JlY3Qud2lkdGg7IHBvc2l0aW9uUmF0aW8gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBwb3NpdGlvblJhdGlvKSk7IGxpc3RDb250YWluZXIuc2Nyb2xsTGVmdCA9IHBvc2l0aW9uUmF0aW8gKiBtYXhTY3JvbGxMZWZ0fTsNCiAgICAgICAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9ICgpID0+IHsgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47IGlzRHJhZ2dpbmcgPSBmYWxzZTsgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgaGFuZGxlRHJhZ01vdmUpOyBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgaGFuZGxlRHJhZ0VuZCl9Ow0KICAgICAgICBpbmRpY2F0b3JUcmFjay5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCAoZSkgPT4geyBpc0RyYWdnaW5nID0gdHJ1ZTsgaGFuZGxlRHJhZ01vdmUoZSk7IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGhhbmRsZURyYWdNb3ZlKTsgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIGhhbmRsZURyYWdFbmQpfSk7DQogICAgICAgIGNvbnN0IGNsb3NlU2VhcmNoID0gKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnc2VhcmNoLW1vZGUnKTsgd2lkZ2V0V3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdzZWFyY2gtbW9kZScpOyBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnOyBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmlubmVySFRNTCA9ICcnfTsNCiAgICAgICAgbGV0IGhpZGVUaW1lb3V0ID0gbnVsbDsNCiAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCAoKSA9PiB7IGNsZWFyVGltZW91dChoaWRlVGltZW91dCl9KTsNCiAgICAgICAgd2lkZ2V0Q29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7IGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7IHdpZGdldENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKX0sIDYwMDApfSk7DQogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKCFsYW5ndWFnZVBhbmVsLmNvbnRhaW5zKGUudGFyZ2V0KSAmJiAhbGFuZ3VhZ2VCdG4uY29udGFpbnMoZS50YXJnZXQpKSB7IGxhbmd1YWdlUGFuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlzaWJsZScpfSBpZiAod2lkZ2V0Q29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0KSkgeyByZXR1cm59IGlmICh3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWRkZW4nKSkgeyBzZXRUaW1lb3V0KCgpID0+IHsgd2lkZ2V0Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOyBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpOyBoaWRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4geyB3aWRnZXRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnaGlkZGVuJyl9LCA2MDAwKX0sIDUwKX0gfSk7DQogICAgICAgIGxpc3RDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlU2Nyb2xsSW5kaWNhdG9yKTsNCiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGNoZWNrU2Nyb2xsYWJpbGl0eSk7DQogICAgICAgIHNlYXJjaFRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuU2VhcmNoKTsNCiAgICAgICAgbGFuZ3VhZ2VCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4geyBlLnN0b3BQcm9wYWdhdGlvbigpOyBsYW5ndWFnZVBhbmVsLmNsYXNzTGlzdC50b2dnbGUoJ3Zpc2libGUnKX0pOw0KDQogICAgICAgIA0KICAgICAgICBzZWFyY2hJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpOw0KICAgICAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLnZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpOw0KICAgICAgICAgICAgc2VhcmNoVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICAgIHBlcmZvcm1TZWFyY2gocXVlcnkpOw0KICAgICAgICAgICAgfSwgMzAwKTsNCiAgICAgICAgfSk7DQogICAgICAgIA0KICAgICAgICBzZWFyY2hSZXN1bHRzQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsICgpID0+IHsgY29uc3QgaXNBdEJvdHRvbSA9IHNlYXJjaFJlc3VsdHNDb250YWluZXIuc2Nyb2xsVG9wICsgc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5jbGllbnRIZWlnaHQgPj0gc2VhcmNoUmVzdWx0c0NvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSAxMDsgaWYgKGlzQXRCb3R0b20pIHsgYXBwZW5kTmV4dFBhZ2UoKX0gfSk7DQogICAgICAgIHNlYXJjaENsb3NlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VTZWFyY2gpOw0KICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHsgaWYgKGUua2V5ID09PSAnRXNjYXBlJyAmJiB3aWRnZXRXcmFwcGVyLmNsYXNzTGlzdC5jb250YWlucygnc2VhcmNoLW1vZGUnKSkgeyBjbG9zZVNlYXJjaCgpfSB9KTsNCiAgICAgICAgDQogICAgICAgIGNvbnN0IGFkZEN1cnJlbnRQYWdlVG9XaWRnZXQgPSBhc3luYyAoZSkgPT4gew0KICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICAgICAgY29uc3QgdCA9IHRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ10gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IGdldFByb2Nlc3NlZFVybCh3aW5kb3cubG9jYXRpb24uaHJlZik7DQogICAgICAgICAgICBsZXQgaWNvbk5hbWUgPSBkb2N1bWVudC50aXRsZSB8fCB0LmN1cnJlbnRQYWdlOw0KICAgICAgICAgICAgdHJ5IHsNCiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vZ2V0X3RpdGxlLnBocD91cmw9JHtlbmNvZGVVUklDb21wb25lbnQoYmFzZVVybCl9YCk7DQogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7IGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7IGlmIChkYXRhLnRpdGxlKSB7IGljb25OYW1lID0gZGF0YS50aXRsZX0gfQ0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIHRpdGxlOicsIGVycm9yKX0NCiAgICAgICAgICAgIGNvbnN0IG5ld0ljb24gPSB7IG5hbWU6IGljb25OYW1lLCB1cmw6IGJhc2VVcmwgfTsNCiAgICAgICAgICAgIGxldCBzdG9yZWRJdGVtcyA9IHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgICAgIGNvbnN0IGlzQWxyZWFkeUFkZGVkID0gc3RvcmVkSXRlbXMuc29tZShpdGVtID0+IGdldFByb2Nlc3NlZFVybChpdGVtLnVybCkgPT09IGdldFByb2Nlc3NlZFVybChuZXdJY29uLnVybCkpOw0KICAgICAgICAgICAgaWYgKCFpc0FscmVhZHlBZGRlZCkgew0KICAgICAgICAgICAgICAgIGlmIChzdG9yZWRJdGVtcy5sZW5ndGggPj0gMTApIHsgc3RvcmVkSXRlbXMuc2hpZnQoKX0NCiAgICAgICAgICAgICAgICBzdG9yZWRJdGVtcy5wdXNoKG5ld0ljb24pOw0KICAgICAgICAgICAgICAgIHNob3J0Y3V0TWFuYWdlci5zZXQoc3RvcmVkSXRlbXMpOw0KICAgICAgICAgICAgICAgIHRyeSB7IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vcmVnaXN0ZXJfYXBwLnBocGAsIHsgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LCBib2R5OiBKU09OLnN0cmluZ2lmeShuZXdJY29uKSB9KX0gY2F0Y2ggKGVycm9yKSB7IGNvbnNvbGUuZXJyb3IoJ0RCIOuTseuhnS/qsLHsi6Ag7Iuk7YyoOicsIGVycm9yKX0NCiAgICAgICAgICAgICAgICBpbml0aWFsUmVuZGVyKCk7DQogICAgICAgICAgICAgICAgaWYgKHdpZGdldFdyYXBwZXIuY2xhc3NMaXN0LmNvbnRhaW5zKCdzZWFyY2gtbW9kZScpKSB7IGNsb3NlU2VhcmNoKCl9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHNob3dUb2FzdCh0LmFscmVhZHlBZGRlZCk7DQogICAgICAgICAgICB9DQogICAgICAgIH07DQoNCiAgICAgICAgY29uc3QgY29weVdpZGdldFNjcmlwdCA9IChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjb25zdCB0ZXh0VG9Db3B5ID0gJzxzY3JpcHQgc3JjPSJodHRwczovL3VucGtnLmNvbS9AcGhvc3Bob3ItaWNvbnMvd2ViIj48XC9zY3JpcHQ+PHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3Qvd3NfbGcuanMiPjxcL3NjcmlwdD48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3Qvd3NfY3NzLmNzcyI+PGRpdiBpZD0iYXBwIj48XC9kaXY+PHNjcmlwdCBzcmM9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9ucG0vY2RuaG9zdEBsYXRlc3Qvd3NfY2RuaHRtbC5qcyI+PFwvc2NyaXB0PiA8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9jZG5ob3N0QGxhdGVzdC93c19jZG4uanMiPjxcL3NjcmlwdD4nOw0KICAgICAgICAgICAgY29uc3QgdCA9IHRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ10gfHwgdHJhbnNsYXRpb25zWydlbiddOw0KICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tDb3B5ID0gKCkgPT4geyBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7IHRleHRBcmVhLnZhbHVlID0gdGV4dFRvQ29weTsgdGV4dEFyZWEuc3R5bGUucG9zaXRpb24gPSAiZml4ZWQiOyB0ZXh0QXJlYS5zdHlsZS50b3AgPSAwOyB0ZXh0QXJlYS5zdHlsZS5sZWZ0ID0gIi05OTk5cHgiOyBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRBcmVhKTsgdGV4dEFyZWEuZm9jdXMoKTsgdGV4dEFyZWEuc2VsZWN0KCk7IHRyeSB7IGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7IHNob3dUb2FzdCh0LmNvZGVDb3BpZWQpfSBjYXRjaCAoZXJyKSB7IGNvbnNvbGUuZXJyb3IoJ0ZhbGxiYWNrOiBPb3BzLCB1bmFibGUgdG8gY29weScsIGVycil9IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dEFyZWEpfTsNCiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHdpbmRvdy5pc1NlY3VyZUNvbnRleHQpIHsgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7IHNob3dUb2FzdCh0LmNvZGVDb3BpZWQpfSkuY2F0Y2goKCkgPT4geyBmYWxsYmFja0NvcHkoKX0pfSBlbHNlIHsgZmFsbGJhY2tDb3B5KCl9DQogICAgICAgIH07DQoNCiAgICAgICAgYWRkVG9Ib21lQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWRkQ3VycmVudFBhZ2VUb1dpZGdldCk7DQogICAgICAgIHNlYXJjaEFkZEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNvcHlXaWRnZXRTY3JpcHQpOw0KICAgICAgICANCiAgICAgICAgc2hvcnRjdXRNYW5hZ2VyLnN5bmNGcm9tVVJMKCk7DQogICAgICAgIHNob3J0Y3V0TWFuYWdlci5nZXQoKTsNCiAgICAgICAgDQogICAgICAgIHBvcHVsYXRlTGFuZ3VhZ2VQYW5lbCgpOw0KICAgICAgICBhcHBseUxhbmd1YWdlKGN1cnJlbnRMYW5nKTsNCiAgICB9KTs='))));
package/ws_cdnhtml.js CHANGED
@@ -25,8 +25,7 @@ const widgetHTML = `
25
25
  <a href="#" id="fhl-search-add-btn" rel="nofollow" class="fhl-fixed-item"><i class="ph-bold ph-code"></i></a>
26
26
  <a href="https://logig.im" id="fhl-fixed-question" class="fhl-fixed-item"><img style='width:24px;border-radius:50%' src='https://cdn.jsdelivr.net/npm/cdnhost@2.3.9/_______________logig.png' alt='1'></a>
27
27
  <a href="https://lai.oduc.kr/" rel="nofollow" id="fhl-fixed-chat" class="fhl-fixed-item"><img style='width:24px;border-radius:50%' src='https://cdn.jsdelivr.net/npm/cdnhost@2.7.6/lai48.png' alt='2'></a>
28
- <a href="https://gig.isai.kr/" id="fhl-fixed-ad" rel="nofollow" class="fhl-fixed-item"><i class="ph-bold ph-wallet"></i></a>
29
- <a href="https://webstore.isai.kr/" id="fhl-fixed-info" rel="nofollow" class="fhl-fixed-item"><i class="ph-bold ph-info"></i></a>
28
+ <a href="https://webstore.isai.kr/" id="fhl-fixed-info" rel="nofollow" class="fhl-fixed-item"><img style='width:24px;border-radius:50%' src='https://cdn.jsdelivr.net/npm/cdnhost@2.9.8/wbs3.png' alt='3'></a>
30
29
  </div>
31
30
  </div>
32
31
  </div>
package/ws_css.css CHANGED
@@ -1 +1 @@
1
- #fhl-widget-container i {color:#000;font-size:22px !important} .fhl-widget-wrapper *, .fhl-widget-wrapper *::before, .fhl-widget-wrapper *::after { box-sizing: border-box} #fhl-widget-container { position: fixed; z-index: 1000; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(0); display: flex; flex-direction: column; align-items: center; width: calc(100% - 30px); max-width: 460px; pointer-events: auto; transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif !important; } #fhl-widget-container.hidden { opacity: 0; transform: translateX(-50%) translateY(20px); pointer-events: none} #fhl-widget-container .fhl-indicator-track { position: relative; width: 100px; height: 14px; margin-bottom: 8px; cursor: pointer; background-color: transparent; transition: opacity 0.3s ease; opacity: 0; pointer-events: auto} #fhl-widget-container.scrollable .fhl-indicator-track { opacity: 1} #fhl-widget-container.search-mode .fhl-indicator-track { display: none} #fhl-widget-container .fhl-scroll-indicator { position: absolute; top: 50%; left: 0; width: 12px; height: 12px; background-color: #555; border-radius: 50%; transform: translateY(-50%); transition: transform 0.1s linear; pointer-events: none} #fhl-widget-container .fhl-widget-wrapper { position: relative; display: flex; align-items: center; width: 100%; max-width: 460px; height: 52px; padding: 7px 10px; border-radius: 26px; background-color: rgba(255, 255, 255, 0.9); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2); transition: all 0.3s ease-in-out; pointer-events: auto; overflow: visible} #fhl-widget-container .fhl-icon-display { position: relative; flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; color: #333; background-color: rgba(0, 0, 0, 0.05); border: none; border-radius: 50%; text-decoration: none; cursor: pointer; padding: 0; transition: background-color 0.2s ease} #fhl-widget-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.1)} #fhl-widget-container .fhl-icon-display i { font-size: 22px} #fhl-widget-container .fhl-list-container .fhl-icon-display { display: inline-flex; width: auto; padding: 0 8px 0 0; border-radius: 20px; background-color: transparent} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.08)} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-icon-circle { background-color: transparent} #fhl-widget-container .fhl-item-name { font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; max-width: 0; opacity: 0; transition: max-width 0.3s ease-in-out, opacity 0.2s ease-in-out 0.05s} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-item-name { max-width: 150px; opacity: 1} #fhl-widget-container .fhl-icon-circle { flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; background-color: rgba(0, 0, 0, 0.05); border-radius: 50%; transition: background-color 0.2s ease; overflow: hidden} #fhl-widget-container .fhl-icon-circle img { width: 24px; height: 24px; object-fit: cover; border-radius: 50%} #fhl-widget-container .fhl-icon-bar { display: flex; align-items: center; gap: 8px; width: 100%; transition: opacity 0.3s ease} #fhl-widget-container .fhl-list-container { padding:0 8px; flex-grow: 1; display: flex; align-items: center; gap: 6px; overflow-x: auto; -ms-overflow-style: none; scrollbar-width: none; scroll-snap-type: x mandatory; mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); -webkit-mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); padding-bottom: 30px; margin-bottom: -30px; overflow-y: visible} #fhl-widget-container .fhl-list-container::-webkit-scrollbar { display: none} #fhl-widget-container .fhl-list-container > .fhl-icon-display { scroll-snap-align: center} #fhl-widget-container .fhl-widget-wrapper.search-mode { height: 280px; align-items: flex-start; border-radius: 20px} #fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-icon-bar { opacity: 0; pointer-events: none} #fhl-widget-container .fhl-search-view { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; flex-direction: column; padding: 10px; opacity: 0; visibility: hidden; transition: opacity 0.3s 0.1s ease} #fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-search-view { opacity: 1; visibility: visible} #fhl-widget-container .fhl-search-input-wrapper { display: flex; align-items: center; flex-shrink: 0; margin-bottom: 10px} #fhl-widget-container .fhl-search-input { flex-grow: 1; height: 38px; border: none; background: transparent; font-size: 16px; color: #111; padding: 0 10px; outline: none; border-bottom: 2px solid #ccc; transition: border-color 0.2s ease} #fhl-widget-container .fhl-search-input:focus { border-bottom-color: #007bff} #fhl-widget-container .fhl-search-content { display: flex; flex-grow: 1; overflow: hidden} #fhl-widget-container .fhl-search-results { flex-grow: 1; width: 0; overflow-y: auto; display: flex; flex-wrap: wrap; justify-content: flex-start; align-content: flex-start; gap: 12px; padding: 15px; -ms-overflow-style: none; scrollbar-width: none; padding-bottom: 40px} #fhl-widget-container .fhl-search-results::-webkit-scrollbar { display: none} #fhl-widget-container .fhl-search-results .fhl-icon-display { background-color: transparent} #fhl-widget-container .fhl-search-results .fhl-icon-display:hover .fhl-icon-circle { background-color: rgba(0, 0, 0, 0.1)} #fhl-widget-container .fhl-item-tooltip { position: absolute; bottom: -28px; left: 50%; transform: translateX(-50%); background-color: #333; color: #fff; padding: 3px 6px; border-radius: 5px; font-size: 11px !important; font-weight: 500; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease-in-out, bottom 0.2s ease-in-out; z-index: 10} #fhl-widget-container .fhl-item-tooltip.visible { opacity: 1; visibility: visible; bottom: -32px} #fhl-widget-container .fhl-fixed-panel { flex-shrink: 0; width: 70px; height: 100%; padding: 0; border-left: 1px solid rgba(0,0,0,0.1); display: flex; flex-direction: column; justify-content: space-around; align-items: center} #fhl-widget-container .fhl-fixed-item { display: flex; align-items: center; justify-content: center; width: 42px !important; height: 42px; border-radius: 10px; text-decoration: none; color: #444; cursor: pointer; transition: background-color 0.2s ease} #fhl-widget-container .fhl-fixed-item:hover { background-color: rgba(0, 0, 0, 0.08)} #fhl-widget-container .fhl-fixed-item i { font-size: 24px !important} #fhl-widget-container .fhl-item-controls { position: absolute; bottom: -20px; left: 20px; transform: translateX(-50%); display: flex; gap: 4px; background-color: rgba(0,0,0,0.7); border-radius: 10px; padding: 2px 4px; opacity: 0; visibility: hidden; transition: all 0.2s ease; pointer-events: none; z-index: 20} #fhl-widget-container .fhl-list-container.edit-mode .fhl-item-controls { opacity: 1; visibility: visible; pointer-events: auto; bottom: -13px} #fhl-widget-container .fhl-control-btn { background: none; border: none; color: white; cursor: pointer; font-size: 16px; line-height: 1; padding: 2px; font-family: monospace} #fhl-widget-container .fhl-control-btn:hover { color: #007bff} #fhl-widget-container #fhl-edit-mode-btn.active { background-color: rgba(0, 123, 255, 0.2); color: #007bff} .fhl-toast { position: fixed; bottom: 90px; left: 50%; transform: translateX(-50%) translateY(10px); background-color: rgba(0, 0, 0, 0.8); color: #fff; padding: 8px 16px; border-radius: 18px; font-size: 14px; z-index: 1001; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s} .fhl-toast.visible { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0)} #fhl-widget-container .fhl-language-panel { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 15px; background-color: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.2); padding: 8px; display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease; transform-origin: bottom center} #fhl-widget-container .fhl-language-panel.visible { opacity: 1; visibility: visible; pointer-events: auto} #fhl-widget-container .fhl-language-item { display: block; padding: 6px 12px; font-size: 14px; color: #333; text-decoration: none; border-radius: 8px; transition: background-color 0.2s ease; cursor: pointer; text-align: center} #fhl-widget-container .fhl-language-item:hover { background-color: rgba(0,0,0,0.1)}
1
+ .fhl-widget-wrapper *, .fhl-widget-wrapper *::before, .fhl-widget-wrapper *::after { box-sizing: border-box; } #fhl-widget-container { position: fixed; z-index: 1000; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(0); display: flex; flex-direction: column; align-items: center; width: calc(100% - 30px); max-width: 460px; pointer-events: auto; transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out; color: #000; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !important; line-height: 1.5 !important; box-sizing: border-box !important; } #fhl-widget-container.hidden { opacity: 0; transform: translateX(-50%) translateY(20px); pointer-events: none} #fhl-widget-container i { color: #000; font-size: 22px !important; font-style: normal; } #fhl-widget-container span { font-family: inherit !important; font-size: 13px !important; font-weight: 600 !important; font-style: normal !important; line-height: normal !important; letter-spacing: normal !important; text-align: left !important; text-decoration: none !important; text-transform: none !important; color: #333333 !important; background: transparent !important; background-color: transparent !important; border: none !important; border-radius: 0 !important; outline: none !important; margin: 0 !important; padding: 0 !important; box-shadow: none !important; text-shadow: none !important; box-sizing: border-box !important; display: inline-block !important; visibility: visible !important; opacity: 1 !important; float: none !important; } #fhl-widget-container .fhl-indicator-track { position: relative; width: 100px; height: 14px; margin-bottom: 8px; cursor: pointer; background-color: transparent; transition: opacity 0.3s ease; opacity: 0; pointer-events: auto} #fhl-widget-container.scrollable .fhl-indicator-track { opacity: 1} #fhl-widget-container.search-mode .fhl-indicator-track { display: none} #fhl-widget-container .fhl-scroll-indicator { position: absolute; top: 50%; left: 0; width: 12px; height: 12px; background-color: #555; border-radius: 50%; transform: translateY(-50%); transition: transform 0.1s linear; pointer-events: none} #fhl-widget-container .fhl-widget-wrapper { position: relative; display: flex; align-items: center; width: 100%; max-width: 440px; height: 52px; padding: 7px 10px; border-radius: 26px; background-color: rgba(255, 255, 255, 0.4) !important; backdrop-filter: blur(25px) !important; -webkit-backdrop-filter: blur(25px) !important; box-shadow: 0 0 25px 5px rgba(255, 255, 255, 0.4), 0 8px 32px 0 rgba(31, 38, 135, 0.1); transition: all 0.3s ease-in-out; pointer-events: auto; overflow: visible; } #fhl-widget-container .fhl-icon-display { position: relative; flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; color: #333; background-color: rgba(0, 0, 0, 0.05); border: none; border-radius: 50%; text-decoration: none; cursor: pointer; padding: 0; margin: 0 3px} #fhl-widget-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.1)} #fhl-widget-container .fhl-list-container .fhl-icon-display { display: inline-flex; width: auto; padding: 0 8px 0 0; border-radius: 20px; background-color: transparent} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover { background-color: rgba(0, 0, 0, 0.08)} #fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-icon-circle { background-color: transparent} #fhl-widget-container .fhl-item-name { max-width: 0; opacity: 0; transition: max-width 0.3s ease-in-out, opacity 0.2s ease-in-out 0.05s; white-space: nowrap; overflow: hidden; } #fhl-widget-container .fhl-list-container .fhl-icon-display:hover .fhl-item-name { max-width: 150px; opacity: 1} #fhl-widget-container .fhl-icon-circle { flex-shrink: 0; display: flex; justify-content: center; align-items: center; width: 38px; height: 38px; background-color: rgba(0, 0, 0, 0.05); border-radius: 50%; transition: background-color 0.2s ease; overflow: hidden} #fhl-widget-container .fhl-icon-circle img { width: 24px; height: 24px; object-fit: cover; border-radius: 50%} #fhl-widget-container .fhl-icon-bar { display: flex; align-items: center; gap: 8px; width: 100%; transition: opacity 0.3s ease} #fhl-widget-container .fhl-list-container { padding:0 8px; flex-grow: 1; display: flex; align-items: center; overflow-x: auto; -ms-overflow-style: none; scrollbar-width: none; scroll-snap-type: x mandatory; mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); -webkit-mask-image: linear-gradient(to right, transparent, black 20px, black calc(100% - 20px), transparent); padding-bottom: 30px; margin-bottom: -30px; overflow-y: visible} #fhl-widget-container .fhl-list-container::-webkit-scrollbar { display: none} #fhl-widget-container .fhl-list-container > .fhl-icon-display { scroll-snap-align: center} #fhl-widget-container .fhl-widget-wrapper.search-mode { height: 280px; align-items: flex-start; border-radius: 20px} #fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-icon-bar { opacity: 0; pointer-events: none} #fhl-widget-container .fhl-search-view { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; flex-direction: column; padding: 10px 10px 10px 5px; opacity: 0; visibility: hidden; transition: opacity 0.3s 0.1s ease} #fhl-widget-container .fhl-widget-wrapper.search-mode .fhl-search-view { opacity: 1; visibility: visible} #fhl-widget-container .fhl-search-input-wrapper { display: flex; align-items: center; flex-shrink: 0; margin-bottom: 12px} #fhl-widget-container .fhl-search-input { flex-grow: 1; height: 38px; border: none; background: transparent; font-size: 16px; color: #111; padding: 0 10px; outline: none; transition: border-color 0.2s ease} #fhl-widget-container .fhl-search-input:focus { border-bottom-color: #007bff} #fhl-widget-container .fhl-search-content { display: flex; flex-grow: 1; overflow: hidden; border-radius:0 0} #fhl-widget-container .fhl-search-results { flex-grow: 1; width: 0; overflow-y: auto; display: flex; flex-wrap: wrap; justify-content: flex-start; align-content: flex-start; gap: 11px; padding:0 0 0 11px; -ms-overflow-style: none; scrollbar-width: none; } #fhl-widget-container .fhl-search-results::-webkit-scrollbar { display: none} #fhl-widget-container .fhl-search-results .fhl-icon-display { background-color: transparent} #fhl-widget-container .fhl-search-results .fhl-icon-display:hover .fhl-icon-circle { background-color: rgba(0, 0, 0, 0.1)} #fhl-widget-container .fhl-fixed-panel { flex-shrink: 0; width: 44px; height: 100%; margin-left: auto !important; display: flex; flex-direction: column; align-items: center; gap: 11px; border: none; background: transparent; } #fhl-widget-container .fhl-fixed-item { display: flex; align-items: center; justify-content: center; width: 38px !important; height: 38px !important; border-radius: 50% !important; background-color: rgba(0, 0, 0, 0.05) !important; text-decoration: none; cursor: pointer; transition: background-color 0.2s ease; flex-shrink: 0; } #fhl-widget-container .fhl-fixed-item:hover { background-color: rgba(0, 0, 0, 0.1) !important; } #fhl-widget-container .fhl-fixed-item i { color: #333 !important; font-size: 20px !important; } #fhl-widget-container .fhl-fixed-item img { width: 24px !important; height: 24px !important; border-radius: 50%; object-fit: cover; display: block; } #fhl-widget-container .fhl-item-tooltip { position: absolute; bottom: -28px; left: 50%; transform: translateX(-50%); background-color: #333; color: #fff; padding: 3px 6px; border-radius: 15px; font-size: 11px !important; font-weight: 500; white-space: nowrap; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.2s ease-in-out, bottom 0.2s ease-in-out; z-index: 10} #fhl-widget-container .fhl-item-tooltip.visible { opacity: 1; visibility: visible; bottom: -25px} #fhl-widget-container .fhl-item-controls { position: absolute; bottom: -20px; left: 20px; transform: translateX(-50%); display: flex; gap: 4px; background-color: rgba(0,0,0,0.7); border-radius: 10px; padding: 2px 4px; opacity: 0; visibility: hidden; transition: all 0.2s ease; pointer-events: none; z-index: 20} #fhl-widget-container .fhl-list-container.edit-mode .fhl-item-controls { opacity: 1; visibility: visible; pointer-events: auto; bottom: -13px} #fhl-widget-container .fhl-control-btn { background: none; border: none; color: white; cursor: pointer; font-size: 16px; line-height: 1; padding: 2px; font-family: monospace} #fhl-widget-container .fhl-control-btn:hover { color: #007bff} .fhl-toast { position: fixed; bottom: 90px; left: 50%; transform: translateX(-50%) translateY(10px); background-color: rgba(0, 0, 0, 0.8); color: #fff; padding: 8px 16px; border-radius: 18px; font-size: 14px; z-index: 1001; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease, visibility 0.3s} .fhl-toast.visible { opacity: 1; visibility: visible; transform: translateX(-50%) translateY(0)} #fhl-widget-container .fhl-language-panel { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); margin-bottom: 15px; background-color: rgba(255, 255, 255, 0.95); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.2); padding: 8px; display: grid; grid-template-columns: 1fr 1fr; gap: 4px; opacity: 0; visibility: hidden; pointer-events: none; transition: opacity 0.3s ease, transform 0.3s ease; transform-origin: bottom center} #fhl-widget-container .fhl-language-panel.visible { opacity: 1; visibility: visible; pointer-events: auto} #fhl-widget-container .fhl-language-item { display: block; padding: 6px 12px; font-size: 14px; color: #333; text-decoration: none; border-radius: 8px; transition: background-color 0.2s ease; cursor: pointer; text-align: center} #fhl-widget-container .fhl-language-item:hover { background-color: rgba(0,0,0,0.1)}
package/ws_lg.js CHANGED
@@ -1,20 +1,20 @@
1
1
  // lang.js
2
2
  const translations = {
3
- ko: { search: '검색', question: '질문', forum: '포럼', blog: '블로그', characterChat: '캐릭터챗', translate: '번역', tarot: '타로', psychology: '심리', ads: '광고', novel: '소설', openSearch: '검색 열기', addToWidget: '위젯에 추가', closeSearch: '검색 닫기', changeLanguage: '언어 변경', images: '이미지', searchPlaceholder: '검색...', alreadyAdded: '이미 위젯에 추가된 페이지입니다.', currentPage: '현재 페이지', codeCopied: '코드가 복사되었습니다. 사이트에 붙여 넣어 주세요.', info: '정보' },
4
- en: { search: 'Search', question: 'Question', forum: 'Forum', blog: 'Blog', characterChat: 'CharacterChat', translate: 'Translate', tarot: 'Tarot', psychology: 'Psychology', ads: 'Ads', novel: 'Novel', openSearch: 'Open Search', addToWidget: 'Add to Widget', closeSearch: 'Close Search', changeLanguage: 'Change Language', images: 'Images', searchPlaceholder: 'Search...', alreadyAdded: 'This page has already been added to the widget.', currentPage: 'Current Page', codeCopied: 'Code copied. Please paste it into your site.', info: 'Information' },
5
- es: { search: 'Buscar', question: 'Pregunta', forum: 'Foro', blog: 'Blog', characterChat: 'Chat de Personajes', translate: 'Traducir', tarot: 'Tarot', psychology: 'Psicología', ads: 'Anuncios', novel: 'Novela', openSearch: 'Abrir Búsqueda', addToWidget: 'Añadir al Widget', closeSearch: 'Cerrar Búsqueda', changeLanguage: 'Cambiar Idioma', images: 'Imágenes', searchPlaceholder: 'Buscar...', alreadyAdded: 'Esta página ya ha sido añadida al widget.', currentPage: 'Página Actual', codeCopied: 'Código copiado. Péguelo en su sitio.', info: 'Información' },
6
- hi: { search: 'खोज', question: 'प्रश्न', forum: 'मंच', blog: 'ब्लॉग', characterChat: 'कैरेक्टरचैट', translate: 'अनुवाद', tarot: 'टैरो', psychology: 'मनोविज्ञान', ads: 'विज्ञापन', novel: 'उपन्यास', openSearch: 'खोज खोलें', addToWidget: 'विजेट में जोड़ें', closeSearch: 'खोज बंद करें', changeLanguage: 'भाषा बदलें', images: 'छवियाँ', searchPlaceholder: 'खोजें...', alreadyAdded: 'यह पृष्ठ पहले से ही विजेट में जोड़ा जा चुका है।', currentPage: 'वर्तमान पृष्ठ', codeCopied: 'कोड कॉपी हो गया। कृपया इसे अपनी साइट पर पेस्ट करें।', info: 'जानकारी' },
7
- ar: { search: 'بحث', question: 'سؤال', forum: 'منتدى', blog: 'مدونة', characterChat: 'دردشة شخصية', translate: 'ترجمة', tarot: 'تاروت', psychology: 'علم النفس', ads: 'إعلانات', novel: 'رواية', openSearch: 'فتح البحث', addToWidget: 'أضف إلى الويدجت', closeSearch: 'إغلاق البحث', changeLanguage: 'تغيير اللغة', images: 'صور', searchPlaceholder: 'بحث...', alreadyAdded: 'تمت إضافة هذه الصفحة بالفعل إلى الويدجت.', currentPage: 'الصفحة الحالية', codeCopied: 'تم نسخ الرمز. يرجى لصقه في موقعك.', info: 'معلومات' },
8
- de: { search: 'Suche', question: 'Frage', forum: 'Forum', blog: 'Blog', characterChat: 'Charakter-Chat', translate: 'Übersetzen', tarot: 'Tarot', psychology: 'Psychologie', ads: 'Anzeigen', novel: 'Roman', openSearch: 'Suche öffnen', addToWidget: 'Zum Widget hinzufügen', closeSearch: 'Suche schließen', changeLanguage: 'Sprache ändern', images: 'Bilder', searchPlaceholder: 'Suchen...', alreadyAdded: 'Diese Seite wurde bereits zum Widget hinzugefügt.', currentPage: 'Aktuelle Seite', codeCopied: 'Code kopiert. Bitte fügen Sie ihn auf Ihrer Seite ein.', info: 'Information' },
9
- fr: { search: 'Recherche', question: 'Question', forum: 'Forum', blog: 'Blog', characterChat: 'Chat de Personnage', translate: 'Traduire', tarot: 'Tarot', psychology: 'Psychologie', ads: 'Publicités', novel: 'Roman', openSearch: 'Ouvrir la Recherche', addToWidget: 'Ajouter au Widget', closeSearch: 'Fermer la Recherche', changeLanguage: 'Changer de Langue', images: 'Images', searchPlaceholder: 'Rechercher...', alreadyAdded: 'Cette page a déjà été ajoutée au widget.', currentPage: 'Page Actuelle', codeCopied: 'Code copié. Veuillez le coller sur votre site.', info: 'Information' },
10
- pt: { search: 'Pesquisa', question: 'Pergunta', forum: 'Fórum', blog: 'Blog', characterChat: 'Chat de Personagem', translate: 'Traduzir', tarot: 'Tarô', psychology: 'Psicologia', ads: 'Anúncios', novel: 'Romance', openSearch: 'Abrir Pesquisa', addToWidget: 'Adicionar ao Widget', closeSearch: 'Fechar Pesquisa', changeLanguage: 'Mudar Idioma', images: 'Imagens', searchPlaceholder: 'Pesquisar...', alreadyAdded: 'Esta página já foi adicionada ao widget.', currentPage: 'Página Atual', codeCopied: 'Código copiado. Por favor, cole no seu site.', info: 'Informação' },
11
- bn: { search: 'অনুসন্ধান', question: 'প্রশ্ন', forum: 'ফোরাম', blog: 'ব্লগ', characterChat: 'ক্যারেক্টারচ্যাট', translate: 'অনুবাদ', tarot: 'ট্যারোট', psychology: 'মনোবিজ্ঞান', ads: 'বিজ্ঞাপন', novel: 'উপন্যাস', openSearch: 'অনুসন্ধান খুলুন', addToWidget: 'উইজেটে যোগ করুন', closeSearch: 'অনুসন্ধান বন্ধ করুন', changeLanguage: 'ভাষা পরিবর্তন করুন', images: 'ছবি', searchPlaceholder: 'অনুসন্ধান...', alreadyAdded: 'এই পৃষ্ঠাটি ইতিমধ্যে উইজেটে যোগ করা হয়েছে।', currentPage: 'বর্তমান পৃষ্ঠা', codeCopied: 'কোড কপি করা হয়েছে। আপনার সাইটে পেস্ট করুন।', info: 'তথ্য' },
12
- ja: { search: '検索', question: '質問', forum: 'フォーラム', blog: 'ブログ', characterChat: 'キャラクターチャット', translate: '翻訳', tarot: 'タロット', psychology: '心理学', ads: '広告', novel: '小説', openSearch: '検索を開く', addToWidget: 'ウィジェットに追加', closeSearch: '検索を閉じる', changeLanguage: '言語を変更', images: '画像', searchPlaceholder: '検索...', alreadyAdded: 'このページは既に追加されています。', currentPage: '現在のページ', codeCopied: 'コードがコピーされました。サイトに貼り付けてください。', info: '情報' },
13
- ru: { search: 'Поиск', question: 'Вопрос', forum: 'Форум', blog: 'Блог', characterChat: 'Чат с персонажем', translate: 'Перевод', tarot: 'Таро', psychology: 'Психология', ads: 'Реклама', novel: 'Роман', openSearch: 'Открыть поиск', addToWidget: 'Добавить в виджет', closeSearch: 'Закрыть поиск', changeLanguage: 'Сменить язык', images: 'Изображения', searchPlaceholder: 'Поиск...', alreadyAdded: 'Эта страница уже добавлена в виджет.', currentPage: 'Текущая страница', codeCopied: 'Код скопирован. Пожалуйста, вставьте его на свой сайт.', info: 'Информация' },
14
- zh: { search: '搜索', question: '问题', forum: '论坛', blog: '博客', characterChat: '角色聊天', translate: '翻译', tarot: '塔罗牌', psychology: '心理学', ads: '广告', novel: '小说', openSearch: '打开搜索', addToWidget: '添加到小组件', closeSearch: '关闭搜索', changeLanguage: '更改语言', images: '图片', searchPlaceholder: '搜索...', alreadyAdded: '此页面已添加到小组件。', currentPage: '当前页面', codeCopied: '代码已复制。请将其粘贴到您的网站中。', info: '信息' },
15
- th: { search: 'ค้นหา', question: 'คำถาม', forum: 'ฟอรัม', blog: 'บล็อก', characterChat: 'แชทตัวละคร', translate: 'แปล', tarot: 'ไพ่ทาโรต์', psychology: 'จิตวิทยา', ads: 'โฆษณา', novel: 'นิยาย', openSearch: 'เปิดการค้นหา', addToWidget: 'เพิ่มในวิดเจ็ต', closeSearch: 'ปิดการค้นหา', changeLanguage: 'เปลี่ยนภาษา', images: 'รูปภาพ', searchPlaceholder: 'ค้นหา...', alreadyAdded: 'หน้านี้ถูกเพิ่มในวิดเจ็ตแล้ว', currentPage: 'หน้าปัจจุบัน', codeCopied: 'คัดลอกโค้ดแล้ว โปรดวางลงในไซต์ของคุณ', info: 'ข้อมูล' },
16
- vi: { search: 'Tìm kiếm', question: 'Câu hỏi', forum: 'Diễn đàn', blog: 'Blog', characterChat: 'Trò chuyện nhân vật', translate: 'Dịch', tarot: 'Tarot', psychology: 'Tâm lý học', ads: 'Quảng cáo', novel: 'Tiểu thuyết', openSearch: 'Mở tìm kiếm', addToWidget: 'Thêm vào tiện ích', closeSearch: 'Đóng tìm kiếm', changeLanguage: 'Đổi ngôn ngữ', images: 'Hình ảnh', searchPlaceholder: 'Tìm kiếm...', alreadyAdded: 'Trang này đã được thêm vào tiện ích.', currentPage: 'Trang hiện tại', codeCopied: 'Đã sao chép mã. Vui lòng dán vào trang web của bạn.', info: 'Thông tin' },
17
- id: { search: 'Cari', question: 'Pertanyaan', forum: 'Forum', blog: 'Blog', characterChat: 'Obrolan Karakter', translate: 'Terjemahkan', tarot: 'Tarot', psychology: 'Psikologi', ads: 'Iklan', novel: 'Novel', openSearch: 'Buka Pencarian', addToWidget: 'Tambah ke Widget', closeSearch: 'Tutup Pencarian', changeLanguage: 'Ubah Bahasa', images: 'Gambar', searchPlaceholder: 'Cari...', alreadyAdded: 'Halaman ini sudah ditambahkan ke widget.', currentPage: 'Halaman Saat Ini', codeCopied: 'Kode disalin. Silakan tempel di situs Anda.', info: 'Informasi' },
18
- tr: { search: 'Ara', question: 'Soru', forum: 'Forum', blog: 'Blog', characterChat: 'Karakter Sohbeti', translate: 'Çevir', tarot: 'Tarot', psychology: 'Psikoloji', ads: 'Reklamlar', novel: 'Roman', openSearch: 'Aramayı Aç', addToWidget: 'Widget\'a Ekle', closeSearch: 'Aramayı Kapat', changeLanguage: 'Dili Değiştir', images: 'Görseller', searchPlaceholder: 'Ara...', alreadyAdded: 'Bu sayfa zaten widget\'a eklenmiş.', currentPage: 'Mevcut Sayfa', codeCopied: 'Kod kopyalandı. Lütfen sitenize yapıştırın.', info: 'Bilgi' },
19
- ur: { search: 'تلاش', question: 'سوال', forum: 'فورم', blog: 'بلاگ', characterChat: 'کردار چیٹ', translate: 'ترجمہ', tarot: 'ٹیرو', psychology: 'نفسیات', ads: 'اشتہارات', novel: 'ناول', openSearch: 'تلاش کھولیں', addToWidget: 'ویجیٹ میں شامل کریں', closeSearch: 'تلاش بند کریں', changeLanguage: 'زبان تبدیل کریں', images: 'تصاویر', searchPlaceholder: 'تلاش کریں...', alreadyAdded: 'یہ صفحہ پہلے ہی ویجیٹ میں شامل ہے۔', currentPage: 'موجودہ صفحہ', codeCopied: 'کوڈ کاپی ہوگیا ہے۔ براہ کرم اسے اپنی سائٹ پر چسپاں کریں۔', info: 'معلومات' }
3
+ ko: { search: '검색', question: '질문', blog: '블로그', characterChat: '캐릭터챗', images: '이미지', openSearch: '검색 열기', addToWidget: '위젯에 추가', closeSearch: '검색 닫기', changeLanguage: '언어 변경', alreadyAdded: '이미 위젯에 추가된 페이지입니다.', currentPage: '현재 페이지', codeCopied: '코드가 복사되었습니다. 사이트에 붙여 넣어 주세요.', info: '정보' },
4
+ en: { search: 'Search', question: 'Question', blog: 'Blog', characterChat: 'CharacterChat', images: 'Images', openSearch: 'Open Search', addToWidget: 'Add to Widget', closeSearch: 'Close Search', changeLanguage: 'Change Language', alreadyAdded: 'This page has already been added to the widget.', currentPage: 'Current Page', codeCopied: 'Code copied. Please paste it into your site.', info: 'Information' },
5
+ es: { search: 'Buscar', question: 'Pregunta', blog: 'Blog', characterChat: 'Chat de Personajes', images: 'Imágenes', openSearch: 'Abrir Búsqueda', addToWidget: 'Añadir al Widget', closeSearch: 'Cerrar Búsqueda', changeLanguage: 'Cambiar Idioma', alreadyAdded: 'Esta página ya ha sido añadida al widget.', currentPage: 'Página Actual', codeCopied: 'Código copiado. Péguelo en su sitio.', info: 'Información' },
6
+ hi: { search: 'खोज', question: 'प्रश्न', blog: 'ब्लॉग', characterChat: 'कैरेक्टरचैट', images: 'छवियाँ', openSearch: 'खोज खोलें', addToWidget: 'विजेट में जोड़ें', closeSearch: 'खोज बंद करें', changeLanguage: 'भाषा बदलें', alreadyAdded: 'यह पृष्ठ पहले से ही विजेट में जोड़ा जा चुका है।', currentPage: 'वर्तमान पृष्ठ', codeCopied: 'कोड कॉपी हो गया। कृपया इसे अपनी साइट पर पेस्ट करें।', info: 'जानकारी' },
7
+ ar: { search: 'بحث', question: 'سؤال', blog: 'مدونة', characterChat: 'دردشة شخصية', images: 'صور', openSearch: 'فتح البحث', addToWidget: 'أضف إلى الويدجت', closeSearch: 'إغلاق البحث', changeLanguage: 'تغيير اللغة', alreadyAdded: 'تمت إضافة هذه الصفحة بالفعل إلى الويدجت.', currentPage: 'الصفحة الحالية', codeCopied: 'تم نسخ الرمز. يرجى لصقه في موقعك.', info: 'معلومات' },
8
+ de: { search: 'Suche', question: 'Frage', blog: 'Blog', characterChat: 'Charakter-Chat', images: 'Bilder', openSearch: 'Suche öffnen', addToWidget: 'Zum Widget hinzufügen', closeSearch: 'Suche schließen', changeLanguage: 'Sprache ändern', alreadyAdded: 'Diese Seite wurde bereits zum Widget hinzugefügt.', currentPage: 'Aktuelle Seite', codeCopied: 'Code kopiert. Bitte fügen Sie ihn auf Ihrer Seite ein.', info: 'Information' },
9
+ fr: { search: 'Recherche', question: 'Question', blog: 'Blog', characterChat: 'Chat de Personnage', images: 'Images', openSearch: 'Ouvrir la Recherche', addToWidget: 'Ajouter au Widget', closeSearch: 'Fermer la Recherche', changeLanguage: 'Changer de Langue', alreadyAdded: 'Cette page a déjà été ajoutée au widget.', currentPage: 'Page Actuelle', codeCopied: 'Code copié. Veuillez le coller sur votre site.', info: 'Information' },
10
+ pt: { search: 'Pesquisa', question: 'Pergunta', blog: 'Blog', characterChat: 'Chat de Personagem', images: 'Imagens', openSearch: 'Abrir Pesquisa', addToWidget: 'Adicionar ao Widget', closeSearch: 'Fechar Pesquisa', changeLanguage: 'Mudar Idioma', alreadyAdded: 'Esta página já foi adicionada ao widget.', currentPage: 'Página Atual', codeCopied: 'Código copiado. Por favor, cole no seu site.', info: 'Informação' },
11
+ bn: { search: 'অনুসন্ধান', question: 'প্রশ্ন', blog: 'ব্লগ', characterChat: 'ক্যারেক্টারচ্যাট', images: 'ছবি', openSearch: 'অনুসন্ধান খুলুন', addToWidget: 'উইজেটে যোগ করুন', closeSearch: 'অনুসন্ধান বন্ধ করুন', changeLanguage: 'ভাষা পরিবর্তন করুন', alreadyAdded: 'এই পৃষ্ঠাটি ইতিমধ্যে উইজেটে যোগ করা হয়েছে।', currentPage: 'বর্তমান পৃষ্ঠা', codeCopied: 'কোড কপি করা হয়েছে। আপনার সাইটে পেস্ট করুন।', info: 'তথ্য' },
12
+ ja: { search: '検索', question: '質問', blog: 'ブログ', characterChat: 'キャラクターチャット', images: '画像', openSearch: '検索を開く', addToWidget: 'ウィジェットに追加', closeSearch: '検索を閉じる', changeLanguage: '言語を変更', alreadyAdded: 'このページは既に追加されています。', currentPage: '現在のページ', codeCopied: 'コードがコピーされました。サイトに貼り付けてください。', info: '情報' },
13
+ ru: { search: 'Поиск', question: 'Вопрос', blog: 'Блог', characterChat: 'Чат с персонажем', images: 'Изображения', openSearch: 'Открыть поиск', addToWidget: 'Добавить в виджет', closeSearch: 'Закрыть поиск', changeLanguage: 'Сменить язык', alreadyAdded: 'Эта страница уже добавлена в виджет.', currentPage: 'Текущая страница', codeCopied: 'Код скопирован. Пожалуйста, вставьте его на свой сайт.', info: 'Информация' },
14
+ zh: { search: '搜索', question: '问题', blog: '博客', characterChat: '角色聊天', images: '图片', openSearch: '打开搜索', addToWidget: '添加到小组件', closeSearch: '关闭搜索', changeLanguage: '更改语言', alreadyAdded: '此页面已添加到小组件。', currentPage: '当前页面', codeCopied: '代码已复制。请将其粘贴到您的网站中。', info: '信息' },
15
+ th: { search: 'ค้นหา', question: 'คำถาม', blog: 'บล็อก', characterChat: 'แชทตัวละคร', images: 'รูปภาพ', openSearch: 'เปิดการค้นหา', addToWidget: 'เพิ่มในวิดเจ็ต', closeSearch: 'ปิดการค้นหา', changeLanguage: 'เปลี่ยนภาษา', alreadyAdded: 'หน้านี้ถูกเพิ่มในวิดเจ็ตแล้ว', currentPage: 'หน้าปัจจุบัน', codeCopied: 'คัดลอกโค้ดแล้ว โปรดวางลงในไซต์ของคุณ', info: 'ข้อมูล' },
16
+ vi: { search: 'Tìm kiếm', question: 'Câu hỏi', blog: 'Blog', characterChat: 'Trò chuyện nhân vật', images: 'Hình ảnh', openSearch: 'Mở tìm kiếm', addToWidget: 'Thêm vào tiện ích', closeSearch: 'Đóng tìm kiếm', changeLanguage: 'Đổi ngôn ngữ', alreadyAdded: 'Trang này đã được thêm vào tiện ích.', currentPage: 'Trang hiện tại', codeCopied: 'Đã sao chép mã. Vui lòng dán vào trang web của bạn.', info: 'Thông tin' },
17
+ id: { search: 'Cari', question: 'Pertanyaan', blog: 'Blog', characterChat: 'Obrolan Karakter', images: 'Gambar', openSearch: 'Buka Pencarian', addToWidget: 'Tambah ke Widget', closeSearch: 'Tutup Pencarian', changeLanguage: 'Ubah Bahasa', alreadyAdded: 'Halaman ini sudah ditambahkan ke widget.', currentPage: 'Halaman Saat Ini', codeCopied: 'Kode disalin. Silakan tempel di situs Anda.', info: 'Informasi' },
18
+ tr: { search: 'Ara', question: 'Soru', blog: 'Blog', characterChat: 'Karakter Sohbeti', images: 'Görseller', openSearch: 'Aramayı Aç', addToWidget: 'Widget\'a Ekle', closeSearch: 'Aramayı Kapat', changeLanguage: 'Dili Değiştir', alreadyAdded: 'Bu sayfa zaten widget\'a eklenmiş.', currentPage: 'Mevcut Sayfa', codeCopied: 'Kod kopyalandı. Lütfen sitenize yapıştırın.', info: 'Bilgi' },
19
+ ur: { search: 'تلاش', question: 'سوال', blog: 'بلاگ', characterChat: 'کردار چیٹ', images: 'تصاویر', openSearch: 'تلاش کھولیں', addToWidget: 'ویجیٹ میں شامل کریں', closeSearch: 'تلاش بند کریں', changeLanguage: 'زبان تبدیل کریں', alreadyAdded: 'یہ صفحہ پہلے ہی ویجیٹ میں شامل ہے۔', currentPage: 'موجودہ صفحہ', codeCopied: 'کوڈ کاپی ہوگیا ہے۔ براہ کرم اسے اپنی سائٹ پر چسپاں کریں۔', info: 'معلومات' }
20
20
  };