@jumio/websdk 0.1.1 → 0.1.3
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/{ar-w5gviYqa.js → ar-r_DoysMW.js} +131 -110
- package/assets/da_object-En8q-z2F.js +2 -0
- package/assets/da_system_worker-x3TQoc4z.js +2 -0
- package/{bg-pS4fM7wz.js → bg-K3UMs6MV.js} +148 -127
- package/{cs-CX1W0ItD.js → cs-oGImcAou.js} +108 -87
- package/{da-6eglnNWd.js → da-uc4Vru3M.js} +96 -75
- package/dac-PjLlwi1Y.js +5 -0
- package/dac-vj2mao-O.js +5 -0
- package/dac_simd-PjLlwi1Y.js +5 -0
- package/dac_simd-pr5isM2g.js +5 -0
- package/{de-iOsDBSJ5.js → de-cQD0d0A0.js} +108 -87
- package/{el-69TqgEiT.js → el-leBfjUfs.js} +128 -107
- package/{en-3PE5EKe2.js → en-jbHv4mAO.js} +114 -93
- package/{en_GB-kCek_FfB.js → en_GB-n6QtnSZN.js} +114 -93
- package/{es-iuvzixFW.js → es-aNYmSPki.js} +132 -111
- package/{es_MX-f-BtGQQe.js → es_MX-r36U_Jqq.js} +108 -87
- package/{et-IK8RSI80.js → et-9fpmHCkv.js} +114 -93
- package/{fi-fGCLuc23.js → fi-fT9A2Vh5.js} +132 -111
- package/{fr-jHEJonyq.js → fr-OKZdZJEt.js} +126 -105
- package/{he-g1SVSAjw.js → he-uO8_5V1g.js} +122 -101
- package/{hr-_XLF1ZwG.js → hr-KcV9q2Xx.js} +120 -99
- package/{hu-KqLoeFS3.js → hu-iM2u6OaD.js} +120 -99
- package/{hy-sLyRHKyP.js → hy-zybQB3Tm.js} +117 -96
- package/{id-NONg2a4q.js → id-xHr32v_R.js} +115 -94
- package/index-56DMrk_v.js +41440 -0
- package/index-N72VyPoM.js +1126 -0
- package/index.html +1 -1
- package/index.js +378 -39204
- package/{it-rOW5DSsW.js → it-zm7gbFz3.js} +126 -105
- package/{ja-VRM6w3sZ.js → ja-Bd_CADVD.js} +129 -108
- package/{ka_GE-99HJuZu7.js → ka_GE-_y6zr4EZ.js} +147 -126
- package/{km_KH-x0MIUOyk.js → km_KH-mwP5WeAa.js} +134 -113
- package/{ko-SudAZFCg.js → ko--JSSGq__.js} +117 -96
- package/{lt-KI7Ei0Ro.js → lt-_UnGIkKt.js} +126 -105
- package/{ms-if2b3Dyx.js → ms-78aI09ta.js} +121 -100
- package/{nl-WLiTB6Z5.js → nl-4esHvruC.js} +114 -93
- package/{no-lwFRiShq.js → no-oP5LAaE-.js} +126 -105
- package/package.json +1 -3
- package/{pl-nGp03TTa.js → pl-5JCiR8ab.js} +126 -105
- package/{pt-8txaUU5k.js → pt-TifT68ls.js} +126 -105
- package/{pt_BR-gqcdIUXJ.js → pt_BR-WPIjpqul.js} +114 -93
- package/{ro-BAAC6d0f.js → ro-Gg-G4ybY.js} +102 -81
- package/{ru-bJTL0Kzz.js → ru-c7W5B2L3.js} +130 -109
- package/{sk-kDo0jTul.js → sk-W0z_fs8T.js} +102 -81
- package/{sr_Cyrl-qiw6cA7i.js → sr_Cyrl-IOWbdVLW.js} +129 -108
- package/{sr_Latn-6znGB7n_.js → sr_Latn-TIZaWQxn.js} +121 -100
- package/{sv-DpSn2qyk.js → sv-bud0Rfop.js} +114 -93
- package/{sw-qp7sb4UB.js → sw-bNz6x2em.js} +128 -107
- package/{th-vyiWi761.js → th-_DeBSBsT.js} +136 -115
- package/third-party-licenses.txt +1358 -128
- package/{tr-YgEDxCpH.js → tr-fCyFs10x.js} +109 -88
- package/{uk-3woEuVNu.js → uk-L1MBDENH.js} +163 -142
- package/{vi-Gy_Ajv4v.js → vi-UJfY1Plg.js} +132 -111
- package/{zh_CN-yeSQgG9R.js → zh_CN-h9kBmIpr.js} +126 -105
- package/{zh_HK-fyQTcaC9.js → zh_HK-d3DRFqpo.js} +129 -108
- package/ar-8Z_JkSBP.cjs +0 -17
- package/bg-ym9eSYwF.cjs +0 -13
- package/cs-e4DqA192.cjs +0 -19
- package/da-3wpmo6dQ.cjs +0 -14
- package/de--3LVIcGo.cjs +0 -15
- package/el-a4MgoJj1.cjs +0 -13
- package/en-KnZK-j0K.cjs +0 -16
- package/en_GB-VBr-YqLU.cjs +0 -15
- package/es-T-az38JA.cjs +0 -15
- package/es_MX-jrzoZchj.cjs +0 -15
- package/et-pCsU7F7s.cjs +0 -14
- package/fi-wX5emSr5.cjs +0 -13
- package/fr-AASOXomt.cjs +0 -15
- package/he-0BNcl_Jn.cjs +0 -18
- package/hr-z2MESh9o.cjs +0 -18
- package/hu-jIAyMG7_.cjs +0 -15
- package/hy--j1yijME.cjs +0 -14
- package/id-WokcKfj_.cjs +0 -13
- package/index.cjs +0 -5073
- package/it-vZ2G9lD2.cjs +0 -15
- package/ja-RtE9sX2Q.cjs +0 -13
- package/ka_GE-67rYmS_D.cjs +0 -15
- package/km_KH-99xVdedp.cjs +0 -12
- package/ko-4XukDqXe.cjs +0 -13
- package/lt-yvI2IifV.cjs +0 -15
- package/ms-20fUIf4Z.cjs +0 -13
- package/nl-U11sIEOs.cjs +0 -15
- package/no-a4qAAPMy.cjs +0 -13
- package/pl-TDuIHbdS.cjs +0 -19
- package/pt-ncfeZXIH.cjs +0 -14
- package/pt_BR-ZDlnCtRt.cjs +0 -15
- package/ro-VBbVeFG0.cjs +0 -15
- package/ru-vJnnetkz.cjs +0 -19
- package/sk-fo1uninG.cjs +0 -14
- package/sr_Cyrl-9R71PQza.cjs +0 -16
- package/sr_Latn-UHzr_TSS.cjs +0 -18
- package/sv-KmpCYw1T.cjs +0 -15
- package/sw-WRG-_i-G.cjs +0 -14
- package/th-zDV_OAtN.cjs +0 -13
- package/tr-2NaTacHH.cjs +0 -13
- package/uk-HvYMcq4r.cjs +0 -16
- package/vi-euL3a9tT.cjs +0 -13
- package/zh_CN-YwVLH0Qu.cjs +0 -13
- package/zh_HK-ul4Xm2Ff.cjs +0 -13
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
const e = "© 2019 Jumio Corp.",
|
|
1
|
+
const e = "Anbring dit ansigt i rammen", t = "© 2019 Jumio Corp.", r = "Switch to next camera", i = "The user has intentionally exited the application", o = "There was an error getting video from the camera", n = "Luk", a = "Fejl", d = "Transaction setup problem", s = "We had a network problem setting up this transaction; please check your device connection and try again.", l = "There was a problem accessing your camera", c = "Your camera is already in use", _ = "Please try closing other applications using the camera and try again.", u = "We encountered an unknown camera error. Please try closing other applications using the camera and try again.", p = "The camera you are using isn't supported", m = "We couldn't request a high enough quality video from your camera.", g = "Permission to access the camera has been denied", k = "Please allow camera access, then reload the page for the settings to take effect.", v = "Device motion permission denied", f = "Permission to access device motion has been denied. Please allow device motion access to use iProov. You may need to reload the page or reopen the tab.", y = "Your device does not seem to fully report device motion", b = "Some devices do not support device motion, please try using another device.", h = "Canceled", j = "Exited full-screen without completing iProov, please try again.", D = "The iProov integration has been unloaded from the page", w = "Your token is invalid", S = "This usually happens when your iProov configuration isn't correct. Please check and try again.", P = "Network error", I = "We couldn't find a camera connected to your device", T = "A camera must be available to use iProov.", B = "No face could be found", F = "Please ensure your camera is front facing and is not covered or blocked.", x = "Enheden understøttes ikke", U = "We can't access your device's sensors to iProov you. Please check your device and settings before trying again.", V = "Server error", G = "Sorry, but there was an error with the service. Please try again.", A = "Your session did not start in time", C = "This normally happens if your session didn't start in time. Please try again.", K = "Please try again later", M = "Sorry, this service is exceptionally busy right now; please try again later.", z = "This transaction has been canceled", N = "Prøv igen", H = "Failed", J = "Hold øjnene åbne", q = "Flyt dit ansigt længere væk fra skærmen", R = "Flyt dit ansigt tættere på skærmen", E = "Hold ansigtet indenfor ovalen", L = "Ensure only one person is visible", O = "Sorry, network problem", Q = "Fjern alt, der dækker ansigtet", Y = "Tag solbrillerne af", W = "Find et mørkere sted", Z = "Find et sted med mere lys", $ = "Stå helt stille", X = "Prøv igen", ee = "Scan face", te = "Ready to iProov", re = "You have iProoved successfully", ie = "Vælg kamera:", oe = "Secured by iProov", ne = "en", ae = "Logo", de = "Passed", se = "Vurderer personlig tilstedeværelse…", le = "Vurderer, om det er en levende person…", ce = "Bekræfter identitet…", _e = "Skaber identitet…", ue = "Finder ansigt…", pe = "Identificerer ansigt…", me = "Indlæser…", ge = "Streaming…", ke = "Hold enheden foran dit ansigt, og kig på skærmen", ve = "Put your face in front of the camera and look forwards", fe = "Tilslutter…", ye = "Flyt ansigtet til ovalen", be = "Gør dig klar…", he = "Grant Device Permissions", je = "Device permissions must be granted to use iProov.", De = "Flyt ansigtet til ovalen", we = "Stå helt stille", Se = "Flyt ansigtet til ovalen", Pe = "Flyt ansigtet til ovalen", Ie = "Scanning afsluttet", Te = "Vent venligst…", Be = "Please rotate your device to portrait", Fe = "Rotate to portrait", xe = "Scanner", Ue = "For tæt på", Ve = "Ryk nærmere", Ge = "Move down", Ae = "Move right", Ce = "Move up", Ke = "Flyt til venstre", Me = "Vi er nødt til at scanne dit ansigt for at kunne bekræfte, at du er et menneske.", ze = "Inden du begynder:", Ne = "Undgå refleksioner og blænding på briller", He = "Se lige ind i kameraet", Je = "Centrer dit ansigt i rammen, og og følg vejledningen på skærmen.", qe = "Bagsiden", Re = "Forside", Ee = "Tag enten et billede af dit dokument, eller upload en PDF-version", Le = "Tag et billede", Oe = "Upload PDF-fil", Qe = "Tag begge billeder igen", Ye = "Tag billede igen", We = "Hold dokumentet roligt, når du tager et billede", Ze = "Sørg for, at alle detaljer i dokumentet er læsbare", $e = "Billederne skal tages igen", Xe = "Prøv igen med et farvebillede", et = "Billedet er sort/hvidt", tt = "Billedet ser ud til at være et farvefoto", rt = "Prøv igen med et andet dokument", it = "Dokumentet ser ud til at være beskadiget", ot = "Tag et billede af dit originaldokument", nt = "Billedet ser ud til at være et foto af en elektronisk skærm", at = "Sørg for at tage et billede af et originaldokument under gode lysforhold", dt = "Dokumentet kan ikke viderebehandles med henblik på verifikation", st = "Undgå at tage billeder i mørke", lt = "Der er reflekser i billedet", ct = "Tag et billede af bagsiden af dokumentet", _t = "Bagsiden af dokumentet mangler", ut = "Tag et billede af forsiden af dokumentet", pt = "Forsiden af dokumentet mangler", mt = "Billedet i dokumentet viser ikke de detaljer, der er nødvendige til verifikation", gt = "Brug gyldig legitimation", kt = "Dæk ikke dit ID med hånden", vt = "Sørg for, at hele dokumentet er med på billedet", ft = "Billedet er ikke en gyldig form for identifikation", yt = "Billedet skal tages igen", bt = "Ved at klikke på “Start” giver jeg samtykke til, at Jumio indsamler, behandler og videregiver mine personoplysninger, der kan omfatte biometriske data, i henhold til deres [({Fortrolighedspolitik})].", ht = "Jeg giver samtykke til, at Jumio indsamler, behandler og videregiver mine personoplysninger, der kan omfatte biometriske data, i henhold til deres [({Fortrolighedspolitik})].", jt = "BAGside taget", Dt = "Centrer din stregkode", wt = "Forstået!", St = "Centrer dit dokument", Pt = "Vend til BAGsiden", It = "FORside taget", Tt = "FRONTEN af dokumentet", Bt = "Hold lige", Ft = "Vend dit ID om", xt = "Placer dit ID i rammen", Ut = "Ryk nærmere", Vt = "Kontrollerer billedet…", Gt = "Tag et billede af dit kørekort", At = "Tag et billede af dit ID-kort", Ct = "Tag et billede af dit opholdstilladelse", Kt = "Tag et billede af dit visum", Mt = "For tæt på", zt = "Zoom ind på din stregkode", Nt = "Tag billedet manuelt", Ht = "Tag en selfie", Jt = "Ansigtsverifikation", qt = "Andet format", Rt = "Plastikkort", Et = "Tag BAGSIDEN igen", Lt = "Tag begge billeder igen", Ot = "Tag selfie igen", Qt = "Tag FRONT side igen", Yt = "Hold enheden i øjenhøjde", Wt = "Ansigt ikke genkendt", Zt = "Scanningen mislykkedes. Prøv igen.", $t = "Forstået!", Xt = "Hold stille…", er = "Se lige ind i kameraet", tr = "OK! Lad os tage et andet billede", rr = "Flyt dit ansigt længere væk fra skærmen", ir = "Ryk tættere på", or = "Uploader", nr = "Du skal være den eneste person på billedet", ar = "Der er fundet flere personer", dr = "Øjnene er lukket", sr = "Ansigtet er sløret", lr = "Ansigtsbekræftelse mislykkedes", cr = "Solbriller er blevet opdaget", _r = "For mørkt", ur = "For meget lys", pr = "For meget bevægelse", mr = "Scanning afsluttet", gr = "Tag en selfie", kr = "Upload gennemført", vr = "Skift sprog", fr = "Søg", yr = "Vælg et sprog", br = "An unknown error occurred", hr = {
|
|
2
|
+
jumio_liveness_prompt_no_target: e,
|
|
2
3
|
"app.camera.flip": "Vend billede",
|
|
3
4
|
"app.camera.switch": "Skift kamera",
|
|
4
5
|
"app.consent.3dl": 'Ved at klikke på "Fortsæt" accepterer du, at Jumio indsamler og videregiver dine biometriske data i henhold til deres <a href="{{link}}">Fortrolighedspolitik</a>.',
|
|
@@ -29,7 +30,7 @@ const e = "© 2019 Jumio Corp.", t = "Switch to next camera", r = "The user has
|
|
|
29
30
|
"button.more": "Se flere",
|
|
30
31
|
"cam.button.take.first": "Tag billede",
|
|
31
32
|
"copy-session-link": "Kopier sessionslinket, og prøv igen i en anden browser",
|
|
32
|
-
copyright:
|
|
33
|
+
copyright: t,
|
|
33
34
|
"country.abw": "Aruba",
|
|
34
35
|
"country.afg": "Afghanistan",
|
|
35
36
|
"country.ago": "Angola",
|
|
@@ -536,22 +537,21 @@ const e = "© 2019 Jumio Corp.", t = "Switch to next camera", r = "The user has
|
|
|
536
537
|
"instant.feedback.button.retake.webcam": "Tag billedet igen med webkameraet",
|
|
537
538
|
"iproov.intro.flash.paragraph": "Centrer dit ansigt i rammen, og hold det stille, mens skærmen blinker.",
|
|
538
539
|
"iproov.intro.la.paragraph": "Centrer dit ansigt i rammen, og og følg vejledningen på skærmen.",
|
|
539
|
-
iproov_camera_next_button_aria:
|
|
540
|
-
iproov_canceled_user:
|
|
541
|
-
iproov_client_camera:
|
|
542
|
-
iproov_close_button_aria:
|
|
543
|
-
iproov_error:
|
|
544
|
-
iproov_error_asset_fetch:
|
|
545
|
-
iproov_error_asset_fetch_message:
|
|
546
|
-
iproov_error_camera:
|
|
547
|
-
iproov_error_camera_in_use:
|
|
548
|
-
iproov_error_camera_in_use_message:
|
|
549
|
-
iproov_error_camera_message:
|
|
550
|
-
iproov_error_camera_not_supported:
|
|
551
|
-
iproov_error_camera_not_supported_message:
|
|
540
|
+
iproov_camera_next_button_aria: r,
|
|
541
|
+
iproov_canceled_user: i,
|
|
542
|
+
iproov_client_camera: o,
|
|
543
|
+
iproov_close_button_aria: n,
|
|
544
|
+
iproov_error: a,
|
|
545
|
+
iproov_error_asset_fetch: d,
|
|
546
|
+
iproov_error_asset_fetch_message: s,
|
|
547
|
+
iproov_error_camera: l,
|
|
548
|
+
iproov_error_camera_in_use: c,
|
|
549
|
+
iproov_error_camera_in_use_message: _,
|
|
550
|
+
iproov_error_camera_message: u,
|
|
551
|
+
iproov_error_camera_not_supported: p,
|
|
552
|
+
iproov_error_camera_not_supported_message: m,
|
|
552
553
|
iproov_error_camera_permission_denied: g,
|
|
553
|
-
iproov_error_camera_permission_denied_message:
|
|
554
|
-
iproov_error_client: k,
|
|
554
|
+
iproov_error_camera_permission_denied_message: k,
|
|
555
555
|
iproov_error_device_motion_denied: v,
|
|
556
556
|
iproov_error_device_motion_denied_message: f,
|
|
557
557
|
iproov_error_device_motion_unsupported: y,
|
|
@@ -603,8 +603,8 @@ const e = "© 2019 Jumio Corp.", t = "Switch to next camera", r = "The user has
|
|
|
603
603
|
iproov_progress_creating_identity: _e,
|
|
604
604
|
iproov_progress_finding_face: ue,
|
|
605
605
|
iproov_progress_identifying_face: pe,
|
|
606
|
-
iproov_progress_loading:
|
|
607
|
-
iproov_progress_streaming:
|
|
606
|
+
iproov_progress_loading: me,
|
|
607
|
+
iproov_progress_streaming: ge,
|
|
608
608
|
iproov_prompt_align_face_accessibility: ke,
|
|
609
609
|
iproov_prompt_align_face_accessibility_desktop: ve,
|
|
610
610
|
iproov_prompt_connecting: fe,
|
|
@@ -657,8 +657,8 @@ const e = "© 2019 Jumio Corp.", t = "Switch to next camera", r = "The user has
|
|
|
657
657
|
jumio_error_instant_feedback_missing_back_title: _t,
|
|
658
658
|
jumio_error_instant_feedback_missing_front_tip_front_side_doc: ut,
|
|
659
659
|
jumio_error_instant_feedback_missing_front_title: pt,
|
|
660
|
-
jumio_error_instant_feedback_missing_part_doc_title:
|
|
661
|
-
jumio_error_instant_feedback_no_doc_tip_gov_id:
|
|
660
|
+
jumio_error_instant_feedback_missing_part_doc_title: mt,
|
|
661
|
+
jumio_error_instant_feedback_no_doc_tip_gov_id: gt,
|
|
662
662
|
jumio_error_instant_feedback_no_doc_tip_hand: kt,
|
|
663
663
|
jumio_error_instant_feedback_no_doc_tip_whole_document: vt,
|
|
664
664
|
jumio_error_instant_feedback_no_doc_title: ft,
|
|
@@ -695,22 +695,28 @@ const e = "© 2019 Jumio Corp.", t = "Switch to next camera", r = "The user has
|
|
|
695
695
|
jumio_iproov_failure_generic_angle: Yt,
|
|
696
696
|
jumio_iproov_failure_generic_title: Wt,
|
|
697
697
|
jumio_liveness_failure_try_again: Zt,
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
698
|
+
jumio_liveness_prompt_got_it: $t,
|
|
699
|
+
jumio_liveness_prompt_hold_still: Xt,
|
|
700
|
+
jumio_liveness_prompt_look_straight_into_the_camera: er,
|
|
701
|
+
jumio_liveness_prompt_success_another_shot: tr,
|
|
702
|
+
jumio_liveness_prompt_too_close: rr,
|
|
703
|
+
jumio_liveness_prompt_too_far: ir,
|
|
704
|
+
jumio_liveness_prompt_uploading: or,
|
|
705
|
+
jumio_liveness_retry_instr_multiple_people_detected: nr,
|
|
706
|
+
jumio_liveness_retry_multiple_people_detected: ar,
|
|
707
|
+
jumio_liveness_retry_title_eyes_closed: dr,
|
|
708
|
+
jumio_liveness_retry_title_face_obscured: sr,
|
|
709
|
+
jumio_liveness_retry_title_generic_error: lr,
|
|
710
|
+
jumio_liveness_retry_title_sunglasses: cr,
|
|
711
|
+
jumio_liveness_retry_title_too_dark: _r,
|
|
712
|
+
jumio_liveness_retry_title_too_much_light: ur,
|
|
713
|
+
jumio_liveness_retry_title_too_much_movement: pr,
|
|
714
|
+
jumio_nfc_header_finish: mr,
|
|
715
|
+
jumio_start_step_identity: gr,
|
|
716
|
+
jumio_uploading_success: kr,
|
|
717
|
+
language_selection_button: vr,
|
|
718
|
+
language_selection_search: fr,
|
|
719
|
+
language_selection_title: yr,
|
|
714
720
|
"not-found.button.back": "Tilbage",
|
|
715
721
|
"not-found.header": "Siden blev ikke fundet",
|
|
716
722
|
"noti.session.timeout.description": "Din session udløber om {{countdown}}. Fortsæt, inden den udløber.",
|
|
@@ -754,6 +760,13 @@ Billedet skal være mindst 300 pixel bredt.`,
|
|
|
754
760
|
"preview.done": "Bekræft",
|
|
755
761
|
"preview.image": "Billedvisning",
|
|
756
762
|
"preview.retry": "Nyt billede",
|
|
763
|
+
"proceed-recommended-tag": "Anbefalet",
|
|
764
|
+
"proceed-smartphones-description": "Smartphones tager tydeligere billeder af dine dokumenter",
|
|
765
|
+
"proceed-this-device-title": "Fortsæt på denne enhed",
|
|
766
|
+
"proceed-title": "Vælg, hvordan du vil fortsætte",
|
|
767
|
+
"proceed-upload-description": "Upload filer i et af følgende formater: JPG, JPEG, PNG fra denne enhed",
|
|
768
|
+
"proceed-upload-title": "Upload fil",
|
|
769
|
+
"proceed-webcam-description": "Brug det indbyggede kamera eller et tilsluttet webcam",
|
|
757
770
|
"prompt.checking": "Kontrollerer billedet…",
|
|
758
771
|
"retry.button.try-again": "Prøv igen",
|
|
759
772
|
"retry.header": "Prøv venligst igen",
|
|
@@ -883,6 +896,7 @@ Du kan nu lukke dette browservindue.`,
|
|
|
883
896
|
"title.logo": "Logo",
|
|
884
897
|
"title.qrcode": "QR-kode",
|
|
885
898
|
"title.success": "Vellykket",
|
|
899
|
+
unknown_error: br,
|
|
886
900
|
"upload-progress.description": "Vent venligst mens vi overfører dine filer.",
|
|
887
901
|
"upload-progress.header": "Vent venligst mens vi overfører dine filer.",
|
|
888
902
|
"upload.back.only": "Upload bagsiden",
|
|
@@ -957,24 +971,23 @@ Hvis du ikke anmodede om denne e-mail, skal du ignorere den.`,
|
|
|
957
971
|
"zoom.intro.webcam.header": "Centrer dit kamera"
|
|
958
972
|
};
|
|
959
973
|
export {
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
974
|
+
t as copyright,
|
|
975
|
+
hr as default,
|
|
976
|
+
r as iproov_camera_next_button_aria,
|
|
977
|
+
i as iproov_canceled_user,
|
|
978
|
+
o as iproov_client_camera,
|
|
979
|
+
n as iproov_close_button_aria,
|
|
980
|
+
a as iproov_error,
|
|
981
|
+
d as iproov_error_asset_fetch,
|
|
982
|
+
s as iproov_error_asset_fetch_message,
|
|
983
|
+
l as iproov_error_camera,
|
|
984
|
+
c as iproov_error_camera_in_use,
|
|
985
|
+
_ as iproov_error_camera_in_use_message,
|
|
986
|
+
u as iproov_error_camera_message,
|
|
987
|
+
p as iproov_error_camera_not_supported,
|
|
988
|
+
m as iproov_error_camera_not_supported_message,
|
|
975
989
|
g as iproov_error_camera_permission_denied,
|
|
976
|
-
|
|
977
|
-
k as iproov_error_client,
|
|
990
|
+
k as iproov_error_camera_permission_denied_message,
|
|
978
991
|
v as iproov_error_device_motion_denied,
|
|
979
992
|
f as iproov_error_device_motion_denied_message,
|
|
980
993
|
y as iproov_error_device_motion_unsupported,
|
|
@@ -1026,8 +1039,8 @@ export {
|
|
|
1026
1039
|
_e as iproov_progress_creating_identity,
|
|
1027
1040
|
ue as iproov_progress_finding_face,
|
|
1028
1041
|
pe as iproov_progress_identifying_face,
|
|
1029
|
-
|
|
1030
|
-
|
|
1042
|
+
me as iproov_progress_loading,
|
|
1043
|
+
ge as iproov_progress_streaming,
|
|
1031
1044
|
ke as iproov_prompt_align_face_accessibility,
|
|
1032
1045
|
ve as iproov_prompt_align_face_accessibility_desktop,
|
|
1033
1046
|
fe as iproov_prompt_connecting,
|
|
@@ -1080,8 +1093,8 @@ export {
|
|
|
1080
1093
|
_t as jumio_error_instant_feedback_missing_back_title,
|
|
1081
1094
|
ut as jumio_error_instant_feedback_missing_front_tip_front_side_doc,
|
|
1082
1095
|
pt as jumio_error_instant_feedback_missing_front_title,
|
|
1083
|
-
|
|
1084
|
-
|
|
1096
|
+
mt as jumio_error_instant_feedback_missing_part_doc_title,
|
|
1097
|
+
gt as jumio_error_instant_feedback_no_doc_tip_gov_id,
|
|
1085
1098
|
kt as jumio_error_instant_feedback_no_doc_tip_hand,
|
|
1086
1099
|
vt as jumio_error_instant_feedback_no_doc_tip_whole_document,
|
|
1087
1100
|
ft as jumio_error_instant_feedback_no_doc_title,
|
|
@@ -1118,21 +1131,29 @@ export {
|
|
|
1118
1131
|
Yt as jumio_iproov_failure_generic_angle,
|
|
1119
1132
|
Wt as jumio_iproov_failure_generic_title,
|
|
1120
1133
|
Zt as jumio_liveness_failure_try_again,
|
|
1121
|
-
$t as
|
|
1122
|
-
Xt as
|
|
1123
|
-
er as
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1134
|
+
$t as jumio_liveness_prompt_got_it,
|
|
1135
|
+
Xt as jumio_liveness_prompt_hold_still,
|
|
1136
|
+
er as jumio_liveness_prompt_look_straight_into_the_camera,
|
|
1137
|
+
e as jumio_liveness_prompt_no_target,
|
|
1138
|
+
tr as jumio_liveness_prompt_success_another_shot,
|
|
1139
|
+
rr as jumio_liveness_prompt_too_close,
|
|
1140
|
+
ir as jumio_liveness_prompt_too_far,
|
|
1141
|
+
or as jumio_liveness_prompt_uploading,
|
|
1142
|
+
nr as jumio_liveness_retry_instr_multiple_people_detected,
|
|
1143
|
+
ar as jumio_liveness_retry_multiple_people_detected,
|
|
1144
|
+
dr as jumio_liveness_retry_title_eyes_closed,
|
|
1145
|
+
sr as jumio_liveness_retry_title_face_obscured,
|
|
1146
|
+
lr as jumio_liveness_retry_title_generic_error,
|
|
1147
|
+
cr as jumio_liveness_retry_title_sunglasses,
|
|
1148
|
+
_r as jumio_liveness_retry_title_too_dark,
|
|
1149
|
+
ur as jumio_liveness_retry_title_too_much_light,
|
|
1150
|
+
pr as jumio_liveness_retry_title_too_much_movement,
|
|
1151
|
+
mr as jumio_nfc_header_finish,
|
|
1152
|
+
gr as jumio_start_step_identity,
|
|
1153
|
+
kr as jumio_uploading_success,
|
|
1154
|
+
vr as language_selection_button,
|
|
1155
|
+
fr as language_selection_search,
|
|
1156
|
+
yr as language_selection_title,
|
|
1157
|
+
br as unknown_error
|
|
1137
1158
|
};
|
|
1138
|
-
//# sourceMappingURL=da-
|
|
1159
|
+
//# sourceMappingURL=da-uc4Vru3M.js.map
|
package/dac-PjLlwi1Y.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const I = "data:application/javascript;base64,dmFyIGxvYWRXQVNNID0gKCgpID0+IHsKICB2YXIgZSA9ICd1bmRlZmluZWQnICE9IHR5cGVvZiBkb2N1bWVudCAmJiBkb2N1bWVudC5jdXJyZW50U2NyaXB0ID8gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmMgOiB2b2lkIDA7CiAgcmV0dXJuIGZ1bmN0aW9uIChyKSB7CiAgICB2YXIgdCwKICAgICAgbiwKICAgICAgbyA9IHIgfHwge30sCiAgICAgIGkgPSB2b2lkIDAgIT09IG8gPyBvIDoge307CiAgICBpLnJlYWR5ID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgKHQgPSBlKSwgKG4gPSByKTsKICAgIH0pOwogICAgdmFyIGEsCiAgICAgIHMsCiAgICAgIHUsCiAgICAgIGwgPSBPYmplY3QuYXNzaWduKHt9LCBpKSwKICAgICAgYyA9IFtdLAogICAgICBkID0gJy4vdGhpcy5wcm9ncmFtJywKICAgICAgZiA9IChlLCByKSA9PiB7CiAgICAgICAgdGhyb3cgcjsKICAgICAgfSwKICAgICAgbSA9ICdvYmplY3QnID09IHR5cGVvZiB3aW5kb3csCiAgICAgIGggPSAnZnVuY3Rpb24nID09IHR5cGVvZiBpbXBvcnRTY3JpcHRzLAogICAgICBwID0gKCdvYmplY3QnID09IHR5cGVvZiBwcm9jZXNzICYmICdvYmplY3QnID09IHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICYmIHByb2Nlc3MudmVyc2lvbnMubm9kZSwgJycpOwogICAgKG0gfHwgaCkgJiYKICAgICAgKGgKICAgICAgICA/IChwID0gc2VsZi5sb2NhdGlvbi5ocmVmKQogICAgICAgIDogJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIGRvY3VtZW50ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQgJiYgKHAgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyYyksCiAgICAgIGUgJiYgKHAgPSBlKSwKICAgICAgKHAgPSAwICE9PSBwLmluZGV4T2YoJ2Jsb2I6JykgPyBwLnN1YnN0cigwLCBwLnJlcGxhY2UoL1s/I10uKi8sICcnKS5sYXN0SW5kZXhPZignLycpICsgMSkgOiAnJyksCiAgICAgIChhID0gKGUpID0+IHsKICAgICAgICB2YXIgciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJldHVybiByLm9wZW4oJ0dFVCcsIGUsICExKSwgci5zZW5kKG51bGwpLCByLnJlc3BvbnNlVGV4dDsKICAgICAgfSksCiAgICAgIGggJiYKICAgICAgICAodSA9IChlKSA9PiB7CiAgICAgICAgICB2YXIgciA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgICAgcmV0dXJuIHIub3BlbignR0VUJywgZSwgITEpLCAoci5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInKSwgci5zZW5kKG51bGwpLCBuZXcgVWludDhBcnJheShyLnJlc3BvbnNlKTsKICAgICAgICB9KSwKICAgICAgKHMgPSAoZSwgciwgdCkgPT4gewogICAgICAgIHZhciBuID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgbi5vcGVuKCdHRVQnLCBlLCAhMCksCiAgICAgICAgICAobi5yZXNwb25zZVR5cGUgPSAnYXJyYXlidWZmZXInKSwKICAgICAgICAgIChuLm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgMjAwID09IG4uc3RhdHVzIHx8ICgwID09IG4uc3RhdHVzICYmIG4ucmVzcG9uc2UpID8gcihuLnJlc3BvbnNlKSA6IHQoKTsKICAgICAgICAgIH0pLAogICAgICAgICAgKG4ub25lcnJvciA9IHQpLAogICAgICAgICAgbi5zZW5kKG51bGwpOwogICAgICB9KSk7CiAgICB2YXIgdyA9IGkucHJpbnQgfHwgY29uc29sZS5sb2cuYmluZChjb25zb2xlKSwKICAgICAgdiA9IGkucHJpbnRFcnIgfHwgY29uc29sZS53YXJuLmJpbmQoY29uc29sZSk7CiAgICBPYmplY3QuYXNzaWduKGksIGwpLAogICAgICAobCA9IG51bGwpLAogICAgICBpLmFyZ3VtZW50cyAmJiAoYyA9IGkuYXJndW1lbnRzKSwKICAgICAgaS50aGlzUHJvZ3JhbSAmJiAoZCA9IGkudGhpc1Byb2dyYW0pLAogICAgICBpLnF1aXQgJiYgKGYgPSBpLnF1aXQpOwogICAgdmFyIF87CiAgICBpLndhc21CaW5hcnkgJiYgKF8gPSBpLndhc21CaW5hcnkpOwogICAgdmFyIHksCiAgICAgIGcgPSBpLm5vRXhpdFJ1bnRpbWUgfHwgITA7CiAgICAnb2JqZWN0JyAhPSB0eXBlb2YgV2ViQXNzZW1ibHkgJiYgVignbm8gbmF0aXZlIHdhc20gc3VwcG9ydCBkZXRlY3RlZCcpOwogICAgdmFyIEUsCiAgICAgIGIgPSAhMTsKICAgIHZhciBrLAogICAgICBELAogICAgICBNLAogICAgICBTLAogICAgICBGLAogICAgICBqID0gJ3VuZGVmaW5lZCcgIT0gdHlwZW9mIFRleHREZWNvZGVyID8gbmV3IFRleHREZWNvZGVyKCd1dGY4JykgOiB2b2lkIDA7CiAgICBmdW5jdGlvbiBBKGUsIHIsIHQpIHsKICAgICAgZm9yICh2YXIgbiA9IHIgKyB0LCBvID0gcjsgZVtvXSAmJiAhKG8gPj0gbik7ICkgKytvOwogICAgICBpZiAobyAtIHIgPiAxNiAmJiBlLmJ1ZmZlciAmJiBqKSByZXR1cm4gai5kZWNvZGUoZS5zdWJhcnJheShyLCBvKSk7CiAgICAgIGZvciAodmFyIGkgPSAnJzsgciA8IG87ICkgewogICAgICAgIHZhciBhID0gZVtyKytdOwogICAgICAgIGlmICgxMjggJiBhKSB7CiAgICAgICAgICB2YXIgcyA9IDYzICYgZVtyKytdOwogICAgICAgICAgaWYgKDE5MiAhPSAoMjI0ICYgYSkpIHsKICAgICAgICAgICAgdmFyIHUgPSA2MyAmIGVbcisrXTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgIChhID0KICAgICAgICAgICAgICAgIDIyNCA9PSAoMjQwICYgYSkKICAgICAgICAgICAgICAgICAgPyAoKDE1ICYgYSkgPDwgMTIpIHwgKHMgPDwgNikgfCB1CiAgICAgICAgICAgICAgICAgIDogKCg3ICYgYSkgPDwgMTgpIHwgKHMgPDwgMTIpIHwgKHUgPDwgNikgfCAoNjMgJiBlW3IrK10pKSA8IDY1NTM2CiAgICAgICAgICAgICkKICAgICAgICAgICAgICBpICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHZhciBsID0gYSAtIDY1NTM2OwogICAgICAgICAgICAgIGkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NiB8IChsID4+IDEwKSwgNTYzMjAgfCAoMTAyMyAmIGwpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKDMxICYgYSkgPDwgNikgfCBzKTsKICAgICAgICB9IGVsc2UgaSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpOwogICAgICB9CiAgICAgIHJldHVybiBpOwogICAgfQogICAgZnVuY3Rpb24gUChlLCByKSB7CiAgICAgIHJldHVybiBlID8gQShELCBlLCByKSA6ICcnOwogICAgfQogICAgZnVuY3Rpb24gUihlLCByLCB0LCBuKSB7CiAgICAgIGlmICghKG4gPiAwKSkgcmV0dXJuIDA7CiAgICAgIGZvciAodmFyIG8gPSB0LCBpID0gdCArIG4gLSAxLCBhID0gMDsgYSA8IGUubGVuZ3RoOyArK2EpIHsKICAgICAgICB2YXIgcyA9IGUuY2hhckNvZGVBdChhKTsKICAgICAgICBpZiAocyA+PSA1NTI5NiAmJiBzIDw9IDU3MzQzKSBzID0gKDY1NTM2ICsgKCgxMDIzICYgcykgPDwgMTApKSB8ICgxMDIzICYgZS5jaGFyQ29kZUF0KCsrYSkpOwogICAgICAgIGlmIChzIDw9IDEyNykgewogICAgICAgICAgaWYgKHQgPj0gaSkgYnJlYWs7CiAgICAgICAgICByW3QrK10gPSBzOwogICAgICAgIH0gZWxzZSBpZiAocyA8PSAyMDQ3KSB7CiAgICAgICAgICBpZiAodCArIDEgPj0gaSkgYnJlYWs7CiAgICAgICAgICAoclt0KytdID0gMTkyIHwgKHMgPj4gNikpLCAoclt0KytdID0gMTI4IHwgKDYzICYgcykpOwogICAgICAgIH0gZWxzZSBpZiAocyA8PSA2NTUzNSkgewogICAgICAgICAgaWYgKHQgKyAyID49IGkpIGJyZWFrOwogICAgICAgICAgKHJbdCsrXSA9IDIyNCB8IChzID4+IDEyKSksIChyW3QrK10gPSAxMjggfCAoKHMgPj4gNikgJiA2MykpLCAoclt0KytdID0gMTI4IHwgKDYzICYgcykpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodCArIDMgPj0gaSkgYnJlYWs7CiAgICAgICAgICAoclt0KytdID0gMjQwIHwgKHMgPj4gMTgpKSwKICAgICAgICAgICAgKHJbdCsrXSA9IDEyOCB8ICgocyA+PiAxMikgJiA2MykpLAogICAgICAgICAgICAoclt0KytdID0gMTI4IHwgKChzID4+IDYpICYgNjMpKSwKICAgICAgICAgICAgKHJbdCsrXSA9IDEyOCB8ICg2MyAmIHMpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIChyW3RdID0gMCksIHQgLSBvOwogICAgfQogICAgZnVuY3Rpb24geChlKSB7CiAgICAgIGZvciAodmFyIHIgPSAwLCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpIHsKICAgICAgICB2YXIgbiA9IGUuY2hhckNvZGVBdCh0KTsKICAgICAgICBuIDw9IDEyNyA/IHIrKyA6IG4gPD0gMjA0NyA/IChyICs9IDIpIDogbiA+PSA1NTI5NiAmJiBuIDw9IDU3MzQzID8gKChyICs9IDQpLCArK3QpIDogKHIgKz0gMyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHI7CiAgICB9CiAgICBmdW5jdGlvbiBDKCkgewogICAgICB2YXIgZSA9IHkuYnVmZmVyOwogICAgICAoaS5IRUFQOCA9IGsgPSBuZXcgSW50OEFycmF5KGUpKSwKICAgICAgICAoaS5IRUFQMTYgPSBNID0gbmV3IEludDE2QXJyYXkoZSkpLAogICAgICAgIChpLkhFQVAzMiA9IFMgPSBuZXcgSW50MzJBcnJheShlKSksCiAgICAgICAgKGkuSEVBUFU4ID0gRCA9IG5ldyBVaW50OEFycmF5KGUpKSwKICAgICAgICAoaS5IRUFQVTE2ID0gbmV3IFVpbnQxNkFycmF5KGUpKSwKICAgICAgICAoaS5IRUFQVTMyID0gRiA9IG5ldyBVaW50MzJBcnJheShlKSksCiAgICAgICAgKGkuSEVBUEYzMiA9IG5ldyBGbG9hdDMyQXJyYXkoZSkpLAogICAgICAgIChpLkhFQVBGNjQgPSBuZXcgRmxvYXQ2NEFycmF5KGUpKTsKICAgIH0KICAgIGkuSU5JVElBTF9NRU1PUlk7CiAgICB2YXIgTyA9IFtdLAogICAgICBUID0gW10sCiAgICAgIE4gPSBbXSwKICAgICAgeiA9IFtdOwogICAgdmFyIEIsCiAgICAgIEksCiAgICAgIEwsCiAgICAgIEgsCiAgICAgIFUgPSAwLAogICAgICBZID0gbnVsbCwKICAgICAgVyA9IG51bGw7CiAgICBmdW5jdGlvbiBxKGUpIHsKICAgICAgcmV0dXJuIGU7CiAgICB9CiAgICBmdW5jdGlvbiBYKGUpIHsKICAgICAgVSsrLCBpLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMgJiYgaS5tb25pdG9yUnVuRGVwZW5kZW5jaWVzKFUpOwogICAgfQogICAgZnVuY3Rpb24gRyhlKSB7CiAgICAgIGlmICgKICAgICAgICAoVS0tLAogICAgICAgIGkubW9uaXRvclJ1bkRlcGVuZGVuY2llcyAmJiBpLm1vbml0b3JSdW5EZXBlbmRlbmNpZXMoVSksCiAgICAgICAgMCA9PSBVICYmIChudWxsICE9PSBZICYmIChjbGVhckludGVydmFsKFkpLCAoWSA9IG51bGwpKSwgVykpCiAgICAgICkgewogICAgICAgIHZhciByID0gVzsKICAgICAgICAoVyA9IG51bGwpLCByKCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIFYoZSkgewogICAgICBpLm9uQWJvcnQgJiYgaS5vbkFib3J0KGUpLAogICAgICAgIHYoKGUgPSAnQWJvcnRlZCgnICsgZSArICcpJykpLAogICAgICAgIChiID0gITApLAogICAgICAgIChFID0gMSksCiAgICAgICAgKGUgKz0gJy4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4nKTsKICAgICAgdmFyIHIgPSBuZXcgV2ViQXNzZW1ibHkuUnVudGltZUVycm9yKGUpOwogICAgICB0aHJvdyAobihyKSwgcik7CiAgICB9CiAgICBmdW5jdGlvbiBLKGUsIHIpIHsKICAgICAgdmFyIHQsIG4sIG87CiAgICAgIHRyeSB7CiAgICAgICAgKG8gPSAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmIChlID09IEIgJiYgXykgcmV0dXJuIG5ldyBVaW50OEFycmF5KF8pOwogICAgICAgICAgICBpZiAodSkgcmV0dXJuIHUoZSk7CiAgICAgICAgICAgIHRocm93ICJzeW5jIGZldGNoaW5nIG9mIHRoZSB3YXNtIGZhaWxlZDogeW91IGNhbiBwcmVsb2FkIGl0IHRvIE1vZHVsZVsnd2FzbUJpbmFyeSddIG1hbnVhbGx5LCBvciBlbWNjLnB5IHdpbGwgZG8gdGhhdCBmb3IgeW91IHdoZW4gZ2VuZXJhdGluZyBIVE1MIChidXQgbm90IEpTKSI7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIFYoZSk7CiAgICAgICAgICB9CiAgICAgICAgfSkoZSkpLAogICAgICAgICAgKG4gPSBuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG8pKSwKICAgICAgICAgICh0ID0gbmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKG4sIHIpKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHZhciBpID0gZS50b1N0cmluZygpOwogICAgICAgIHRocm93ICgKICAgICAgICAgICh2KCdmYWlsZWQgdG8gY29tcGlsZSB3YXNtIG1vZHVsZTogJyArIGkpLAogICAgICAgICAgKGkuaW5jbHVkZXMoJ2ltcG9ydGVkIE1lbW9yeScpIHx8IGkuaW5jbHVkZXMoJ21lbW9yeSBpbXBvcnQnKSkgJiYKICAgICAgICAgICAgdigKICAgICAgICAgICAgICAnTWVtb3J5IHNpemUgaW5jb21wYXRpYmlsaXR5IGlzc3VlcyBtYXkgYmUgZHVlIHRvIGNoYW5naW5nIElOSVRJQUxfTUVNT1JZIGF0IHJ1bnRpbWUgdG8gc29tZXRoaW5nIHRvbyBsYXJnZS4gVXNlIEFMTE9XX01FTU9SWV9HUk9XVEggdG8gYWxsb3cgYW55IHNpemUgbWVtb3J5IChhbmQgYWxzbyBtYWtlIHN1cmUgbm90IHRvIHNldCBJTklUSUFMX01FTU9SWSBhdCBydW50aW1lIHRvIHNvbWV0aGluZyBzbWFsbGVyIHRoYW4gaXQgd2FzIGF0IGNvbXBpbGUgdGltZSkuJwogICAgICAgICAgICApLAogICAgICAgICAgZSkKICAgICAgICApOwogICAgICB9CiAgICAgIHJldHVybiBbdCwgbl07CiAgICB9CiAgICBmdW5jdGlvbiBKKGUpIHsKICAgICAgKHRoaXMubmFtZSA9ICdFeGl0U3RhdHVzJyksICh0aGlzLm1lc3NhZ2UgPSAnUHJvZ3JhbSB0ZXJtaW5hdGVkIHdpdGggZXhpdCgnICsgZSArICcpJyksICh0aGlzLnN0YXR1cyA9IGUpOwogICAgfQogICAgZnVuY3Rpb24gJChlKSB7CiAgICAgIGZvciAoOyBlLmxlbmd0aCA+IDA7ICkgZS5zaGlmdCgpKGkpOwogICAgfQogICAgKEIgPSAnZGFjX3NpbWQud2FzbScpLnN0YXJ0c1dpdGgoJ2RhdGE6YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtO2Jhc2U2NCwnKSB8fAogICAgICAoKEkgPSBCKSwgKEIgPSBpLmxvY2F0ZUZpbGUgPyBpLmxvY2F0ZUZpbGUoSSwgcCkgOiBwICsgSSkpOwogICAgdmFyIFogPSB7CiAgICAgIGlzQWJzOiAoZSkgPT4gJy8nID09PSBlLmNoYXJBdCgwKSwKICAgICAgc3BsaXRQYXRoOiAoZSkgPT4gewogICAgICAgIHJldHVybiAvXihcLz98KShbXHNcU10qPykoKD86XC57MSwyfXxbXlwvXSs/fCkoXC5bXi5cL10qfCkpKD86W1wvXSopJC8uZXhlYyhlKS5zbGljZSgxKTsKICAgICAgfSwKICAgICAgbm9ybWFsaXplQXJyYXk6IChlLCByKSA9PiB7CiAgICAgICAgZm9yICh2YXIgdCA9IDAsIG4gPSBlLmxlbmd0aCAtIDE7IG4gPj0gMDsgbi0tKSB7CiAgICAgICAgICB2YXIgbyA9IGVbbl07CiAgICAgICAgICAnLicgPT09IG8gPyBlLnNwbGljZShuLCAxKSA6ICcuLicgPT09IG8gPyAoZS5zcGxpY2UobiwgMSksIHQrKykgOiB0ICYmIChlLnNwbGljZShuLCAxKSwgdC0tKTsKICAgICAgICB9CiAgICAgICAgaWYgKHIpIGZvciAoOyB0OyB0LS0pIGUudW5zaGlmdCgnLi4nKTsKICAgICAgICByZXR1cm4gZTsKICAgICAgfSwKICAgICAgbm9ybWFsaXplOiAoZSkgPT4gewogICAgICAgIHZhciByID0gWi5pc0FicyhlKSwKICAgICAgICAgIHQgPSAnLycgPT09IGUuc3Vic3RyKC0xKTsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgKGUgPSBaLm5vcm1hbGl6ZUFycmF5KAogICAgICAgICAgICBlLnNwbGl0KCcvJykuZmlsdGVyKChlKSA9PiAhIWUpLAogICAgICAgICAgICAhcgogICAgICAgICAgKS5qb2luKCcvJykpIHx8CiAgICAgICAgICAgIHIgfHwKICAgICAgICAgICAgKGUgPSAnLicpLAogICAgICAgICAgZSAmJiB0ICYmIChlICs9ICcvJyksCiAgICAgICAgICAociA/ICcvJyA6ICcnKSArIGUKICAgICAgICApOwogICAgICB9LAogICAgICBkaXJuYW1lOiAoZSkgPT4gewogICAgICAgIHZhciByID0gWi5zcGxpdFBhdGgoZSksCiAgICAgICAgICB0ID0gclswXSwKICAgICAgICAgIG4gPSByWzFdOwogICAgICAgIHJldHVybiB0IHx8IG4gPyAobiAmJiAobiA9IG4uc3Vic3RyKDAsIG4ubGVuZ3RoIC0gMSkpLCB0ICsgbikgOiAnLic7CiAgICAgIH0sCiAgICAgIGJhc2VuYW1lOiAoZSkgPT4gewogICAgICAgIGlmICgnLycgPT09IGUpIHJldHVybiAnLyc7CiAgICAgICAgdmFyIHIgPSAoZSA9IChlID0gWi5ub3JtYWxpemUoZSkpLnJlcGxhY2UoL1wvJC8sICcnKSkubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICByZXR1cm4gLTEgPT09IHIgPyBlIDogZS5zdWJzdHIociArIDEpOwogICAgICB9LAogICAgICBqb2luOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGUgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICAgIHJldHVybiBaLm5vcm1hbGl6ZShlLmpvaW4oJy8nKSk7CiAgICAgIH0sCiAgICAgIGpvaW4yOiAoZSwgcikgPT4gWi5ub3JtYWxpemUoZSArICcvJyArIHIpCiAgICB9OwogICAgdmFyIFEgPSB7CiAgICAgIHJlc29sdmU6IGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBlID0gJycsIHIgPSAhMSwgdCA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyB0ID49IC0xICYmICFyOyB0LS0pIHsKICAgICAgICAgIHZhciBuID0gdCA+PSAwID8gYXJndW1lbnRzW3RdIDogaWUuY3dkKCk7CiAgICAgICAgICBpZiAoJ3N0cmluZycgIT0gdHlwZW9mIG4pIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7CiAgICAgICAgICBpZiAoIW4pIHJldHVybiAnJzsKICAgICAgICAgIChlID0gbiArICcvJyArIGUpLCAociA9IFouaXNBYnMobikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKAogICAgICAgICAgKHIgPyAnLycgOiAnJykgKwogICAgICAgICAgICAoZSA9IFoubm9ybWFsaXplQXJyYXkoCiAgICAgICAgICAgICAgZS5zcGxpdCgnLycpLmZpbHRlcigoZSkgPT4gISFlKSwKICAgICAgICAgICAgICAhcgogICAgICAgICAgICApLmpvaW4oJy8nKSkgfHwgJy4nCiAgICAgICAgKTsKICAgICAgfSwKICAgICAgcmVsYXRpdmU6IChlLCByKSA9PiB7CiAgICAgICAgZnVuY3Rpb24gdChlKSB7CiAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUubGVuZ3RoICYmICcnID09PSBlW3JdOyByKyspOwogICAgICAgICAgZm9yICh2YXIgdCA9IGUubGVuZ3RoIC0gMTsgdCA+PSAwICYmICcnID09PSBlW3RdOyB0LS0pOwogICAgICAgICAgcmV0dXJuIHIgPiB0ID8gW10gOiBlLnNsaWNlKHIsIHQgLSByICsgMSk7CiAgICAgICAgfQogICAgICAgIChlID0gUS5yZXNvbHZlKGUpLnN1YnN0cigxKSksIChyID0gUS5yZXNvbHZlKHIpLnN1YnN0cigxKSk7CiAgICAgICAgZm9yICh2YXIgbiA9IHQoZS5zcGxpdCgnLycpKSwgbyA9IHQoci5zcGxpdCgnLycpKSwgaSA9IE1hdGgubWluKG4ubGVuZ3RoLCBvLmxlbmd0aCksIGEgPSBpLCBzID0gMDsgcyA8IGk7IHMrKykKICAgICAgICAgIGlmIChuW3NdICE9PSBvW3NdKSB7CiAgICAgICAgICAgIGEgPSBzOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB2YXIgdSA9IFtdOwogICAgICAgIGZvciAocyA9IGE7IHMgPCBuLmxlbmd0aDsgcysrKSB1LnB1c2goJy4uJyk7CiAgICAgICAgcmV0dXJuICh1ID0gdS5jb25jYXQoby5zbGljZShhKSkpLmpvaW4oJy8nKTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGVlKGUsIHIsIHQpIHsKICAgICAgdmFyIG4gPSB0ID4gMCA/IHQgOiB4KGUpICsgMSwKICAgICAgICBvID0gbmV3IEFycmF5KG4pLAogICAgICAgIGkgPSBSKGUsIG8sIDAsIG8ubGVuZ3RoKTsKICAgICAgcmV0dXJuIHIgJiYgKG8ubGVuZ3RoID0gaSksIG87CiAgICB9CiAgICB2YXIgcmUgPSB7CiAgICAgIHR0eXM6IFtdLAogICAgICBpbml0OiBmdW5jdGlvbiAoKSB7fSwKICAgICAgc2h1dGRvd246IGZ1bmN0aW9uICgpIHt9LAogICAgICByZWdpc3RlcjogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAocmUudHR5c1tlXSA9IHsgaW5wdXQ6IFtdLCBvdXRwdXQ6IFtdLCBvcHM6IHIgfSksIGllLnJlZ2lzdGVyRGV2aWNlKGUsIHJlLnN0cmVhbV9vcHMpOwogICAgICB9LAogICAgICBzdHJlYW1fb3BzOiB7CiAgICAgICAgb3BlbjogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHZhciByID0gcmUudHR5c1tlLm5vZGUucmRldl07CiAgICAgICAgICBpZiAoIXIpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQzKTsKICAgICAgICAgIChlLnR0eSA9IHIpLCAoZS5zZWVrYWJsZSA9ICExKTsKICAgICAgICB9LAogICAgICAgIGNsb3NlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgZS50dHkub3BzLmZzeW5jKGUudHR5KTsKICAgICAgICB9LAogICAgICAgIGZzeW5jOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgZS50dHkub3BzLmZzeW5jKGUudHR5KTsKICAgICAgICB9LAogICAgICAgIHJlYWQ6IGZ1bmN0aW9uIChlLCByLCB0LCBuLCBvKSB7CiAgICAgICAgICBpZiAoIWUudHR5IHx8ICFlLnR0eS5vcHMuZ2V0X2NoYXIpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYwKTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBhID0gMDsgYSA8IG47IGErKykgewogICAgICAgICAgICB2YXIgczsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBzID0gZS50dHkub3BzLmdldF9jaGFyKGUudHR5KTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDI5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodm9pZCAwID09PSBzICYmIDAgPT09IGkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYpOwogICAgICAgICAgICBpZiAobnVsbCA9PSBzKSBicmVhazsKICAgICAgICAgICAgaSsrLCAoclt0ICsgYV0gPSBzKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBpICYmIChlLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKSksIGk7CiAgICAgICAgfSwKICAgICAgICB3cml0ZTogZnVuY3Rpb24gKGUsIHIsIHQsIG4sIG8pIHsKICAgICAgICAgIGlmICghZS50dHkgfHwgIWUudHR5Lm9wcy5wdXRfY2hhcikgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNjApOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIGUudHR5Lm9wcy5wdXRfY2hhcihlLnR0eSwgclt0ICsgaV0pOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbiAmJiAoZS5ub2RlLnRpbWVzdGFtcCA9IERhdGUubm93KCkpLCBpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZGVmYXVsdF90dHlfb3BzOiB7CiAgICAgICAgZ2V0X2NoYXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoIWUuaW5wdXQubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciByID0gbnVsbDsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICgndW5kZWZpbmVkJyAhPSB0eXBlb2Ygd2luZG93ICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIHdpbmRvdy5wcm9tcHQKICAgICAgICAgICAgICAgID8gbnVsbCAhPT0gKHIgPSB3aW5kb3cucHJvbXB0KCdJbnB1dDogJykpICYmIChyICs9ICdcbicpCiAgICAgICAgICAgICAgICA6ICdmdW5jdGlvbicgPT0gdHlwZW9mIHJlYWRsaW5lICYmIG51bGwgIT09IChyID0gcmVhZGxpbmUoKSkgJiYgKHIgKz0gJ1xuJyksCiAgICAgICAgICAgICAgIXIpCiAgICAgICAgICAgICkKICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZS5pbnB1dCA9IGVlKHIsICEwKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBlLmlucHV0LnNoaWZ0KCk7CiAgICAgICAgfSwKICAgICAgICBwdXRfY2hhcjogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgIG51bGwgPT09IHIgfHwgMTAgPT09IHIgPyAodyhBKGUub3V0cHV0LCAwKSksIChlLm91dHB1dCA9IFtdKSkgOiAwICE9IHIgJiYgZS5vdXRwdXQucHVzaChyKTsKICAgICAgICB9LAogICAgICAgIGZzeW5jOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgZS5vdXRwdXQgJiYgZS5vdXRwdXQubGVuZ3RoID4gMCAmJiAodyhBKGUub3V0cHV0LCAwKSksIChlLm91dHB1dCA9IFtdKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBkZWZhdWx0X3R0eTFfb3BzOiB7CiAgICAgICAgcHV0X2NoYXI6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICBudWxsID09PSByIHx8IDEwID09PSByID8gKHYoQShlLm91dHB1dCwgMCkpLCAoZS5vdXRwdXQgPSBbXSkpIDogMCAhPSByICYmIGUub3V0cHV0LnB1c2gocik7CiAgICAgICAgfSwKICAgICAgICBmc3luYzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIGUub3V0cHV0ICYmIGUub3V0cHV0Lmxlbmd0aCA+IDAgJiYgKHYoQShlLm91dHB1dCwgMCkpLCAoZS5vdXRwdXQgPSBbXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIHRlKGUpIHsKICAgICAgZSA9IChmdW5jdGlvbiAoZSwgcikgewogICAgICAgIHJldHVybiBNYXRoLmNlaWwoZSAvIHIpICogcjsKICAgICAgfSkoZSwgNjU1MzYpOwogICAgICB2YXIgciA9IE1lKDY1NTM2LCBlKTsKICAgICAgcmV0dXJuIHIKICAgICAgICA/IChmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICByZXR1cm4gRC5maWxsKDAsIGUsIGUgKyByKSwgZTsKICAgICAgICAgIH0pKHIsIGUpCiAgICAgICAgOiAwOwogICAgfQogICAgdmFyIG5lID0gewogICAgICBvcHNfdGFibGU6IG51bGwsCiAgICAgIG1vdW50OiBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiBuZS5jcmVhdGVOb2RlKG51bGwsICcvJywgMTY4OTUsIDApOwogICAgICB9LAogICAgICBjcmVhdGVOb2RlOiBmdW5jdGlvbiAoZSwgciwgdCwgbikgewogICAgICAgIGlmIChpZS5pc0Jsa2Rldih0KSB8fCBpZS5pc0ZJRk8odCkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYzKTsKICAgICAgICBuZS5vcHNfdGFibGUgfHwKICAgICAgICAgIChuZS5vcHNfdGFibGUgPSB7CiAgICAgICAgICAgIGRpcjogewogICAgICAgICAgICAgIG5vZGU6IHsKICAgICAgICAgICAgICAgIGdldGF0dHI6IG5lLm5vZGVfb3BzLmdldGF0dHIsCiAgICAgICAgICAgICAgICBzZXRhdHRyOiBuZS5ub2RlX29wcy5zZXRhdHRyLAogICAgICAgICAgICAgICAgbG9va3VwOiBuZS5ub2RlX29wcy5sb29rdXAsCiAgICAgICAgICAgICAgICBta25vZDogbmUubm9kZV9vcHMubWtub2QsCiAgICAgICAgICAgICAgICByZW5hbWU6IG5lLm5vZGVfb3BzLnJlbmFtZSwKICAgICAgICAgICAgICAgIHVubGluazogbmUubm9kZV9vcHMudW5saW5rLAogICAgICAgICAgICAgICAgcm1kaXI6IG5lLm5vZGVfb3BzLnJtZGlyLAogICAgICAgICAgICAgICAgcmVhZGRpcjogbmUubm9kZV9vcHMucmVhZGRpciwKICAgICAgICAgICAgICAgIHN5bWxpbms6IG5lLm5vZGVfb3BzLnN5bWxpbmsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHN0cmVhbTogeyBsbHNlZWs6IG5lLnN0cmVhbV9vcHMubGxzZWVrIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZmlsZTogewogICAgICAgICAgICAgIG5vZGU6IHsgZ2V0YXR0cjogbmUubm9kZV9vcHMuZ2V0YXR0ciwgc2V0YXR0cjogbmUubm9kZV9vcHMuc2V0YXR0ciB9LAogICAgICAgICAgICAgIHN0cmVhbTogewogICAgICAgICAgICAgICAgbGxzZWVrOiBuZS5zdHJlYW1fb3BzLmxsc2VlaywKICAgICAgICAgICAgICAgIHJlYWQ6IG5lLnN0cmVhbV9vcHMucmVhZCwKICAgICAgICAgICAgICAgIHdyaXRlOiBuZS5zdHJlYW1fb3BzLndyaXRlLAogICAgICAgICAgICAgICAgYWxsb2NhdGU6IG5lLnN0cmVhbV9vcHMuYWxsb2NhdGUsCiAgICAgICAgICAgICAgICBtbWFwOiBuZS5zdHJlYW1fb3BzLm1tYXAsCiAgICAgICAgICAgICAgICBtc3luYzogbmUuc3RyZWFtX29wcy5tc3luYwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgbGluazogewogICAgICAgICAgICAgIG5vZGU6IHsgZ2V0YXR0cjogbmUubm9kZV9vcHMuZ2V0YXR0ciwgc2V0YXR0cjogbmUubm9kZV9vcHMuc2V0YXR0ciwgcmVhZGxpbms6IG5lLm5vZGVfb3BzLnJlYWRsaW5rIH0sCiAgICAgICAgICAgICAgc3RyZWFtOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICBjaHJkZXY6IHsKICAgICAgICAgICAgICBub2RlOiB7IGdldGF0dHI6IG5lLm5vZGVfb3BzLmdldGF0dHIsIHNldGF0dHI6IG5lLm5vZGVfb3BzLnNldGF0dHIgfSwKICAgICAgICAgICAgICBzdHJlYW06IGllLmNocmRldl9zdHJlYW1fb3BzCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIHZhciBvID0gaWUuY3JlYXRlTm9kZShlLCByLCB0LCBuKTsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgaWUuaXNEaXIoby5tb2RlKQogICAgICAgICAgICA/ICgoby5ub2RlX29wcyA9IG5lLm9wc190YWJsZS5kaXIubm9kZSksIChvLnN0cmVhbV9vcHMgPSBuZS5vcHNfdGFibGUuZGlyLnN0cmVhbSksIChvLmNvbnRlbnRzID0ge30pKQogICAgICAgICAgICA6IGllLmlzRmlsZShvLm1vZGUpCiAgICAgICAgICAgICAgPyAoKG8ubm9kZV9vcHMgPSBuZS5vcHNfdGFibGUuZmlsZS5ub2RlKSwKICAgICAgICAgICAgICAgIChvLnN0cmVhbV9vcHMgPSBuZS5vcHNfdGFibGUuZmlsZS5zdHJlYW0pLAogICAgICAgICAgICAgICAgKG8udXNlZEJ5dGVzID0gMCksCiAgICAgICAgICAgICAgICAoby5jb250ZW50cyA9IG51bGwpKQogICAgICAgICAgICAgIDogaWUuaXNMaW5rKG8ubW9kZSkKICAgICAgICAgICAgICAgID8gKChvLm5vZGVfb3BzID0gbmUub3BzX3RhYmxlLmxpbmsubm9kZSksIChvLnN0cmVhbV9vcHMgPSBuZS5vcHNfdGFibGUubGluay5zdHJlYW0pKQogICAgICAgICAgICAgICAgOiBpZS5pc0NocmRldihvLm1vZGUpICYmCiAgICAgICAgICAgICAgICAgICgoby5ub2RlX29wcyA9IG5lLm9wc190YWJsZS5jaHJkZXYubm9kZSksIChvLnN0cmVhbV9vcHMgPSBuZS5vcHNfdGFibGUuY2hyZGV2LnN0cmVhbSkpLAogICAgICAgICAgKG8udGltZXN0YW1wID0gRGF0ZS5ub3coKSksCiAgICAgICAgICBlICYmICgoZS5jb250ZW50c1tyXSA9IG8pLCAoZS50aW1lc3RhbXAgPSBvLnRpbWVzdGFtcCkpLAogICAgICAgICAgbwogICAgICAgICk7CiAgICAgIH0sCiAgICAgIGdldEZpbGVEYXRhQXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoZSkgewogICAgICAgIHJldHVybiBlLmNvbnRlbnRzCiAgICAgICAgICA/IGUuY29udGVudHMuc3ViYXJyYXkKICAgICAgICAgICAgPyBlLmNvbnRlbnRzLnN1YmFycmF5KDAsIGUudXNlZEJ5dGVzKQogICAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KGUuY29udGVudHMpCiAgICAgICAgICA6IG5ldyBVaW50OEFycmF5KDApOwogICAgICB9LAogICAgICBleHBhbmRGaWxlU3RvcmFnZTogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICB2YXIgdCA9IGUuY29udGVudHMgPyBlLmNvbnRlbnRzLmxlbmd0aCA6IDA7CiAgICAgICAgaWYgKCEodCA+PSByKSkgewogICAgICAgICAgKHIgPSBNYXRoLm1heChyLCAodCAqICh0IDwgMTA0ODU3NiA/IDIgOiAxLjEyNSkpID4+PiAwKSksIDAgIT0gdCAmJiAociA9IE1hdGgubWF4KHIsIDI1NikpOwogICAgICAgICAgdmFyIG4gPSBlLmNvbnRlbnRzOwogICAgICAgICAgKGUuY29udGVudHMgPSBuZXcgVWludDhBcnJheShyKSksIGUudXNlZEJ5dGVzID4gMCAmJiBlLmNvbnRlbnRzLnNldChuLnN1YmFycmF5KDAsIGUudXNlZEJ5dGVzKSwgMCk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZXNpemVGaWxlU3RvcmFnZTogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICBpZiAoZS51c2VkQnl0ZXMgIT0gcikKICAgICAgICAgIGlmICgwID09IHIpIChlLmNvbnRlbnRzID0gbnVsbCksIChlLnVzZWRCeXRlcyA9IDApOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHZhciB0ID0gZS5jb250ZW50czsKICAgICAgICAgICAgKGUuY29udGVudHMgPSBuZXcgVWludDhBcnJheShyKSksCiAgICAgICAgICAgICAgdCAmJiBlLmNvbnRlbnRzLnNldCh0LnN1YmFycmF5KDAsIE1hdGgubWluKHIsIGUudXNlZEJ5dGVzKSkpLAogICAgICAgICAgICAgIChlLnVzZWRCeXRlcyA9IHIpOwogICAgICAgICAgfQogICAgICB9LAogICAgICBub2RlX29wczogewogICAgICAgIGdldGF0dHI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICB2YXIgciA9IHt9OwogICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgKHIuZGV2ID0gaWUuaXNDaHJkZXYoZS5tb2RlKSA/IGUuaWQgOiAxKSwKICAgICAgICAgICAgKHIuaW5vID0gZS5pZCksCiAgICAgICAgICAgIChyLm1vZGUgPSBlLm1vZGUpLAogICAgICAgICAgICAoci5ubGluayA9IDEpLAogICAgICAgICAgICAoci51aWQgPSAwKSwKICAgICAgICAgICAgKHIuZ2lkID0gMCksCiAgICAgICAgICAgIChyLnJkZXYgPSBlLnJkZXYpLAogICAgICAgICAgICBpZS5pc0RpcihlLm1vZGUpCiAgICAgICAgICAgICAgPyAoci5zaXplID0gNDA5NikKICAgICAgICAgICAgICA6IGllLmlzRmlsZShlLm1vZGUpCiAgICAgICAgICAgICAgICA/IChyLnNpemUgPSBlLnVzZWRCeXRlcykKICAgICAgICAgICAgICAgIDogaWUuaXNMaW5rKGUubW9kZSkKICAgICAgICAgICAgICAgICAgPyAoci5zaXplID0gZS5saW5rLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgOiAoci5zaXplID0gMCksCiAgICAgICAgICAgIChyLmF0aW1lID0gbmV3IERhdGUoZS50aW1lc3RhbXApKSwKICAgICAgICAgICAgKHIubXRpbWUgPSBuZXcgRGF0ZShlLnRpbWVzdGFtcCkpLAogICAgICAgICAgICAoci5jdGltZSA9IG5ldyBEYXRlKGUudGltZXN0YW1wKSksCiAgICAgICAgICAgIChyLmJsa3NpemUgPSA0MDk2KSwKICAgICAgICAgICAgKHIuYmxvY2tzID0gTWF0aC5jZWlsKHIuc2l6ZSAvIHIuYmxrc2l6ZSkpLAogICAgICAgICAgICByCiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICAgc2V0YXR0cjogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgIHZvaWQgMCAhPT0gci5tb2RlICYmIChlLm1vZGUgPSByLm1vZGUpLAogICAgICAgICAgICB2b2lkIDAgIT09IHIudGltZXN0YW1wICYmIChlLnRpbWVzdGFtcCA9IHIudGltZXN0YW1wKSwKICAgICAgICAgICAgdm9pZCAwICE9PSByLnNpemUgJiYgbmUucmVzaXplRmlsZVN0b3JhZ2UoZSwgci5zaXplKTsKICAgICAgICB9LAogICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgIHRocm93IGllLmdlbmVyaWNFcnJvcnNbNDRdOwogICAgICAgIH0sCiAgICAgICAgbWtub2Q6IGZ1bmN0aW9uIChlLCByLCB0LCBuKSB7CiAgICAgICAgICByZXR1cm4gbmUuY3JlYXRlTm9kZShlLCByLCB0LCBuKTsKICAgICAgICB9LAogICAgICAgIHJlbmFtZTogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIGlmIChpZS5pc0RpcihlLm1vZGUpKSB7CiAgICAgICAgICAgIHZhciBuOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG4gPSBpZS5sb29rdXBOb2RlKHIsIHQpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICBpZiAobikgZm9yICh2YXIgbyBpbiBuLmNvbnRlbnRzKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig1NSk7CiAgICAgICAgICB9CiAgICAgICAgICBkZWxldGUgZS5wYXJlbnQuY29udGVudHNbZS5uYW1lXSwKICAgICAgICAgICAgKGUucGFyZW50LnRpbWVzdGFtcCA9IERhdGUubm93KCkpLAogICAgICAgICAgICAoZS5uYW1lID0gdCksCiAgICAgICAgICAgIChyLmNvbnRlbnRzW3RdID0gZSksCiAgICAgICAgICAgIChyLnRpbWVzdGFtcCA9IGUucGFyZW50LnRpbWVzdGFtcCksCiAgICAgICAgICAgIChlLnBhcmVudCA9IHIpOwogICAgICAgIH0sCiAgICAgICAgdW5saW5rOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgZGVsZXRlIGUuY29udGVudHNbcl0sIChlLnRpbWVzdGFtcCA9IERhdGUubm93KCkpOwogICAgICAgIH0sCiAgICAgICAgcm1kaXI6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICB2YXIgdCA9IGllLmxvb2t1cE5vZGUoZSwgcik7CiAgICAgICAgICBmb3IgKHZhciBuIGluIHQuY29udGVudHMpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDU1KTsKICAgICAgICAgIGRlbGV0ZSBlLmNvbnRlbnRzW3JdLCAoZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpKTsKICAgICAgICB9LAogICAgICAgIHJlYWRkaXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICB2YXIgciA9IFsnLicsICcuLiddOwogICAgICAgICAgZm9yICh2YXIgdCBpbiBlLmNvbnRlbnRzKSBlLmNvbnRlbnRzLmhhc093blByb3BlcnR5KHQpICYmIHIucHVzaCh0KTsKICAgICAgICAgIHJldHVybiByOwogICAgICAgIH0sCiAgICAgICAgc3ltbGluazogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIHZhciBuID0gbmUuY3JlYXRlTm9kZShlLCByLCA0MTQ3MSwgMCk7CiAgICAgICAgICByZXR1cm4gKG4ubGluayA9IHQpLCBuOwogICAgICAgIH0sCiAgICAgICAgcmVhZGxpbms6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBpZiAoIWllLmlzTGluayhlLm1vZGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOCk7CiAgICAgICAgICByZXR1cm4gZS5saW5rOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc3RyZWFtX29wczogewogICAgICAgIHJlYWQ6IGZ1bmN0aW9uIChlLCByLCB0LCBuLCBvKSB7CiAgICAgICAgICB2YXIgaSA9IGUubm9kZS5jb250ZW50czsKICAgICAgICAgIGlmIChvID49IGUubm9kZS51c2VkQnl0ZXMpIHJldHVybiAwOwogICAgICAgICAgdmFyIGEgPSBNYXRoLm1pbihlLm5vZGUudXNlZEJ5dGVzIC0gbywgbik7CiAgICAgICAgICBpZiAoYSA+IDggJiYgaS5zdWJhcnJheSkgci5zZXQoaS5zdWJhcnJheShvLCBvICsgYSksIHQpOwogICAgICAgICAgZWxzZSBmb3IgKHZhciBzID0gMDsgcyA8IGE7IHMrKykgclt0ICsgc10gPSBpW28gKyBzXTsKICAgICAgICAgIHJldHVybiBhOwogICAgICAgIH0sCiAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIChlLCByLCB0LCBuLCBvLCBpKSB7CiAgICAgICAgICBpZiAoKHIuYnVmZmVyID09PSBrLmJ1ZmZlciAmJiAoaSA9ICExKSwgIW4pKSByZXR1cm4gMDsKICAgICAgICAgIHZhciBhID0gZS5ub2RlOwogICAgICAgICAgaWYgKCgoYS50aW1lc3RhbXAgPSBEYXRlLm5vdygpKSwgci5zdWJhcnJheSAmJiAoIWEuY29udGVudHMgfHwgYS5jb250ZW50cy5zdWJhcnJheSkpKSB7CiAgICAgICAgICAgIGlmIChpKSByZXR1cm4gKGEuY29udGVudHMgPSByLnN1YmFycmF5KHQsIHQgKyBuKSksIChhLnVzZWRCeXRlcyA9IG4pLCBuOwogICAgICAgICAgICBpZiAoMCA9PT0gYS51c2VkQnl0ZXMgJiYgMCA9PT0gbykgcmV0dXJuIChhLmNvbnRlbnRzID0gci5zbGljZSh0LCB0ICsgbikpLCAoYS51c2VkQnl0ZXMgPSBuKSwgbjsKICAgICAgICAgICAgaWYgKG8gKyBuIDw9IGEudXNlZEJ5dGVzKSByZXR1cm4gYS5jb250ZW50cy5zZXQoci5zdWJhcnJheSh0LCB0ICsgbiksIG8pLCBuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKChuZS5leHBhbmRGaWxlU3RvcmFnZShhLCBvICsgbiksIGEuY29udGVudHMuc3ViYXJyYXkgJiYgci5zdWJhcnJheSkpCiAgICAgICAgICAgIGEuY29udGVudHMuc2V0KHIuc3ViYXJyYXkodCwgdCArIG4pLCBvKTsKICAgICAgICAgIGVsc2UgZm9yICh2YXIgcyA9IDA7IHMgPCBuOyBzKyspIGEuY29udGVudHNbbyArIHNdID0gclt0ICsgc107CiAgICAgICAgICByZXR1cm4gKGEudXNlZEJ5dGVzID0gTWF0aC5tYXgoYS51c2VkQnl0ZXMsIG8gKyBuKSksIG47CiAgICAgICAgfSwKICAgICAgICBsbHNlZWs6IGZ1bmN0aW9uIChlLCByLCB0KSB7CiAgICAgICAgICB2YXIgbiA9IHI7CiAgICAgICAgICBpZiAoKDEgPT09IHQgPyAobiArPSBlLnBvc2l0aW9uKSA6IDIgPT09IHQgJiYgaWUuaXNGaWxlKGUubm9kZS5tb2RlKSAmJiAobiArPSBlLm5vZGUudXNlZEJ5dGVzKSwgbiA8IDApKQogICAgICAgICAgICB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOCk7CiAgICAgICAgICByZXR1cm4gbjsKICAgICAgICB9LAogICAgICAgIGFsbG9jYXRlOiBmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgbmUuZXhwYW5kRmlsZVN0b3JhZ2UoZS5ub2RlLCByICsgdCksIChlLm5vZGUudXNlZEJ5dGVzID0gTWF0aC5tYXgoZS5ub2RlLnVzZWRCeXRlcywgciArIHQpKTsKICAgICAgICB9LAogICAgICAgIG1tYXA6IGZ1bmN0aW9uIChlLCByLCB0LCBuLCBvKSB7CiAgICAgICAgICBpZiAoIWllLmlzRmlsZShlLm5vZGUubW9kZSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQzKTsKICAgICAgICAgIHZhciBpLAogICAgICAgICAgICBhLAogICAgICAgICAgICBzID0gZS5ub2RlLmNvbnRlbnRzOwogICAgICAgICAgaWYgKDIgJiBvIHx8IHMuYnVmZmVyICE9PSBrLmJ1ZmZlcikgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgKCh0ID4gMCB8fCB0ICsgciA8IHMubGVuZ3RoKSAmJgogICAgICAgICAgICAgICAgKHMgPSBzLnN1YmFycmF5ID8gcy5zdWJhcnJheSh0LCB0ICsgcikgOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzLCB0LCB0ICsgcikpLAogICAgICAgICAgICAgIChhID0gITApLAogICAgICAgICAgICAgICEoaSA9IHRlKHIpKSkKICAgICAgICAgICAgKQogICAgICAgICAgICAgIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ4KTsKICAgICAgICAgICAgay5zZXQocywgaSk7CiAgICAgICAgICB9IGVsc2UgKGEgPSAhMSksIChpID0gcy5ieXRlT2Zmc2V0KTsKICAgICAgICAgIHJldHVybiB7IHB0cjogaSwgYWxsb2NhdGVkOiBhIH07CiAgICAgICAgfSwKICAgICAgICBtc3luYzogZnVuY3Rpb24gKGUsIHIsIHQsIG4sIG8pIHsKICAgICAgICAgIHJldHVybiBuZS5zdHJlYW1fb3BzLndyaXRlKGUsIHIsIDAsIG4sIHQsICExKSwgMDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBvZShlLCByLCB0LCBuKSB7CiAgICAgIHZhciBvID0gbiA/ICcnIDogcSgnYWwgJyArIGUpOwogICAgICBzKAogICAgICAgIGUsCiAgICAgICAgKHQpID0+IHsKICAgICAgICAgICEoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgZSB8fCBWKHIpOwogICAgICAgICAgfSkodCwgJ0xvYWRpbmcgZGF0YSBmaWxlICInICsgZSArICciIGZhaWxlZCAobm8gYXJyYXlCdWZmZXIpLicpLAogICAgICAgICAgICByKG5ldyBVaW50OEFycmF5KHQpKSwKICAgICAgICAgICAgbyAmJiBHKCk7CiAgICAgICAgfSwKICAgICAgICAocikgPT4gewogICAgICAgICAgaWYgKCF0KSB0aHJvdyAnTG9hZGluZyBkYXRhIGZpbGUgIicgKyBlICsgJyIgZmFpbGVkLic7CiAgICAgICAgICB0KCk7CiAgICAgICAgfQogICAgICApLAogICAgICAgIG8gJiYgWCgpOwogICAgfQogICAgdmFyIGllID0gewogICAgICAgIHJvb3Q6IG51bGwsCiAgICAgICAgbW91bnRzOiBbXSwKICAgICAgICBkZXZpY2VzOiB7fSwKICAgICAgICBzdHJlYW1zOiBbXSwKICAgICAgICBuZXh0SW5vZGU6IDEsCiAgICAgICAgbmFtZVRhYmxlOiBudWxsLAogICAgICAgIGN1cnJlbnRQYXRoOiAnLycsCiAgICAgICAgaW5pdGlhbGl6ZWQ6ICExLAogICAgICAgIGlnbm9yZVBlcm1pc3Npb25zOiAhMCwKICAgICAgICBFcnJub0Vycm9yOiBudWxsLAogICAgICAgIGdlbmVyaWNFcnJvcnM6IHt9LAogICAgICAgIGZpbGVzeXN0ZW1zOiBudWxsLAogICAgICAgIHN5bmNGU1JlcXVlc3RzOiAwLAogICAgICAgIGxvb2t1cFBhdGg6IChlLCByID0ge30pID0+IHsKICAgICAgICAgIGlmICghKGUgPSBRLnJlc29sdmUoZSkpKSByZXR1cm4geyBwYXRoOiAnJywgbm9kZTogbnVsbCB9OwogICAgICAgICAgaWYgKChyID0gT2JqZWN0LmFzc2lnbih7IGZvbGxvd19tb3VudDogITAsIHJlY3Vyc2VfY291bnQ6IDAgfSwgcikpLnJlY3Vyc2VfY291bnQgPiA4KQogICAgICAgICAgICB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigzMik7CiAgICAgICAgICBmb3IgKHZhciB0ID0gZS5zcGxpdCgnLycpLmZpbHRlcigoZSkgPT4gISFlKSwgbiA9IGllLnJvb3QsIG8gPSAnLycsIGkgPSAwOyBpIDwgdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgYSA9IGkgPT09IHQubGVuZ3RoIC0gMTsKICAgICAgICAgICAgaWYgKGEgJiYgci5wYXJlbnQpIGJyZWFrOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgKChuID0gaWUubG9va3VwTm9kZShuLCB0W2ldKSksCiAgICAgICAgICAgICAgKG8gPSBaLmpvaW4yKG8sIHRbaV0pKSwKICAgICAgICAgICAgICBpZS5pc01vdW50cG9pbnQobikgJiYgKCFhIHx8IChhICYmIHIuZm9sbG93X21vdW50KSkgJiYgKG4gPSBuLm1vdW50ZWQucm9vdCksCiAgICAgICAgICAgICAgIWEgfHwgci5mb2xsb3cpCiAgICAgICAgICAgICkKICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgaWUuaXNMaW5rKG4ubW9kZSk7ICkgewogICAgICAgICAgICAgICAgdmFyIHUgPSBpZS5yZWFkbGluayhvKTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgKChvID0gUS5yZXNvbHZlKFouZGlybmFtZShvKSwgdSkpLAogICAgICAgICAgICAgICAgICAobiA9IGllLmxvb2t1cFBhdGgobywgeyByZWN1cnNlX2NvdW50OiByLnJlY3Vyc2VfY291bnQgKyAxIH0pLm5vZGUpLAogICAgICAgICAgICAgICAgICBzKysgPiA0MCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMzIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB7IHBhdGg6IG8sIG5vZGU6IG4gfTsKICAgICAgICB9LAogICAgICAgIGdldFBhdGg6IChlKSA9PiB7CiAgICAgICAgICBmb3IgKHZhciByOyA7ICkgewogICAgICAgICAgICBpZiAoaWUuaXNSb290KGUpKSB7CiAgICAgICAgICAgICAgdmFyIHQgPSBlLm1vdW50Lm1vdW50cG9pbnQ7CiAgICAgICAgICAgICAgcmV0dXJuIHIgPyAoJy8nICE9PSB0W3QubGVuZ3RoIC0gMV0gPyB0ICsgJy8nICsgciA6IHQgKyByKSA6IHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKHIgPSByID8gZS5uYW1lICsgJy8nICsgciA6IGUubmFtZSksIChlID0gZS5wYXJlbnQpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgaGFzaE5hbWU6IChlLCByKSA9PiB7CiAgICAgICAgICBmb3IgKHZhciB0ID0gMCwgbiA9IDA7IG4gPCByLmxlbmd0aDsgbisrKSB0ID0gKCh0IDw8IDUpIC0gdCArIHIuY2hhckNvZGVBdChuKSkgfCAwOwogICAgICAgICAgcmV0dXJuICgoZSArIHQpID4+PiAwKSAlIGllLm5hbWVUYWJsZS5sZW5ndGg7CiAgICAgICAgfSwKICAgICAgICBoYXNoQWRkTm9kZTogKGUpID0+IHsKICAgICAgICAgIHZhciByID0gaWUuaGFzaE5hbWUoZS5wYXJlbnQuaWQsIGUubmFtZSk7CiAgICAgICAgICAoZS5uYW1lX25leHQgPSBpZS5uYW1lVGFibGVbcl0pLCAoaWUubmFtZVRhYmxlW3JdID0gZSk7CiAgICAgICAgfSwKICAgICAgICBoYXNoUmVtb3ZlTm9kZTogKGUpID0+IHsKICAgICAgICAgIHZhciByID0gaWUuaGFzaE5hbWUoZS5wYXJlbnQuaWQsIGUubmFtZSk7CiAgICAgICAgICBpZiAoaWUubmFtZVRhYmxlW3JdID09PSBlKSBpZS5uYW1lVGFibGVbcl0gPSBlLm5hbWVfbmV4dDsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgZm9yICh2YXIgdCA9IGllLm5hbWVUYWJsZVtyXTsgdDsgKSB7CiAgICAgICAgICAgICAgaWYgKHQubmFtZV9uZXh0ID09PSBlKSB7CiAgICAgICAgICAgICAgICB0Lm5hbWVfbmV4dCA9IGUubmFtZV9uZXh0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHQgPSB0Lm5hbWVfbmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgbG9va3VwTm9kZTogKGUsIHIpID0+IHsKICAgICAgICAgIHZhciB0ID0gaWUubWF5TG9va3VwKGUpOwogICAgICAgICAgaWYgKHQpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKHQsIGUpOwogICAgICAgICAgZm9yICh2YXIgbiA9IGllLmhhc2hOYW1lKGUuaWQsIHIpLCBvID0gaWUubmFtZVRhYmxlW25dOyBvOyBvID0gby5uYW1lX25leHQpIHsKICAgICAgICAgICAgdmFyIGkgPSBvLm5hbWU7CiAgICAgICAgICAgIGlmIChvLnBhcmVudC5pZCA9PT0gZS5pZCAmJiBpID09PSByKSByZXR1cm4gbzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBpZS5sb29rdXAoZSwgcik7CiAgICAgICAgfSwKICAgICAgICBjcmVhdGVOb2RlOiAoZSwgciwgdCwgbikgPT4gewogICAgICAgICAgdmFyIG8gPSBuZXcgaWUuRlNOb2RlKGUsIHIsIHQsIG4pOwogICAgICAgICAgcmV0dXJuIGllLmhhc2hBZGROb2RlKG8pLCBvOwogICAgICAgIH0sCiAgICAgICAgZGVzdHJveU5vZGU6IChlKSA9PiB7CiAgICAgICAgICBpZS5oYXNoUmVtb3ZlTm9kZShlKTsKICAgICAgICB9LAogICAgICAgIGlzUm9vdDogKGUpID0+IGUgPT09IGUucGFyZW50LAogICAgICAgIGlzTW91bnRwb2ludDogKGUpID0+ICEhZS5tb3VudGVkLAogICAgICAgIGlzRmlsZTogKGUpID0+IDMyNzY4ID09ICg2MTQ0MCAmIGUpLAogICAgICAgIGlzRGlyOiAoZSkgPT4gMTYzODQgPT0gKDYxNDQwICYgZSksCiAgICAgICAgaXNMaW5rOiAoZSkgPT4gNDA5NjAgPT0gKDYxNDQwICYgZSksCiAgICAgICAgaXNDaHJkZXY6IChlKSA9PiA4MTkyID09ICg2MTQ0MCAmIGUpLAogICAgICAgIGlzQmxrZGV2OiAoZSkgPT4gMjQ1NzYgPT0gKDYxNDQwICYgZSksCiAgICAgICAgaXNGSUZPOiAoZSkgPT4gNDA5NiA9PSAoNjE0NDAgJiBlKSwKICAgICAgICBpc1NvY2tldDogKGUpID0+IDQ5MTUyID09ICg0OTE1MiAmIGUpLAogICAgICAgIGZsYWdNb2RlczogeyByOiAwLCAncisnOiAyLCB3OiA1NzcsICd3Kyc6IDU3OCwgYTogMTA4OSwgJ2ErJzogMTA5MCB9LAogICAgICAgIG1vZGVTdHJpbmdUb0ZsYWdzOiAoZSkgPT4gewogICAgICAgICAgdmFyIHIgPSBpZS5mbGFnTW9kZXNbZV07CiAgICAgICAgICBpZiAodm9pZCAwID09PSByKSB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZmlsZSBvcGVuIG1vZGU6ICcgKyBlKTsKICAgICAgICAgIHJldHVybiByOwogICAgICAgIH0sCiAgICAgICAgZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6IChlKSA9PiB7CiAgICAgICAgICB2YXIgciA9IFsncicsICd3JywgJ3J3J11bMyAmIGVdOwogICAgICAgICAgcmV0dXJuIDUxMiAmIGUgJiYgKHIgKz0gJ3cnKSwgcjsKICAgICAgICB9LAogICAgICAgIG5vZGVQZXJtaXNzaW9uczogKGUsIHIpID0+CiAgICAgICAgICBpZS5pZ25vcmVQZXJtaXNzaW9ucwogICAgICAgICAgICA/IDAKICAgICAgICAgICAgOiAoIXIuaW5jbHVkZXMoJ3InKSB8fCAyOTIgJiBlLm1vZGUpICYmCiAgICAgICAgICAgICAgICAoIXIuaW5jbHVkZXMoJ3cnKSB8fCAxNDYgJiBlLm1vZGUpICYmCiAgICAgICAgICAgICAgICAoIXIuaW5jbHVkZXMoJ3gnKSB8fCA3MyAmIGUubW9kZSkKICAgICAgICAgICAgICA/IDAKICAgICAgICAgICAgICA6IDIsCiAgICAgICAgbWF5TG9va3VwOiAoZSkgPT4gewogICAgICAgICAgdmFyIHIgPSBpZS5ub2RlUGVybWlzc2lvbnMoZSwgJ3gnKTsKICAgICAgICAgIHJldHVybiByIHx8IChlLm5vZGVfb3BzLmxvb2t1cCA/IDAgOiAyKTsKICAgICAgICB9LAogICAgICAgIG1heUNyZWF0ZTogKGUsIHIpID0+IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGllLmxvb2t1cE5vZGUoZSwgcik7CiAgICAgICAgICAgIHJldHVybiAyMDsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICByZXR1cm4gaWUubm9kZVBlcm1pc3Npb25zKGUsICd3eCcpOwogICAgICAgIH0sCiAgICAgICAgbWF5RGVsZXRlOiAoZSwgciwgdCkgPT4gewogICAgICAgICAgdmFyIG47CiAgICAgICAgICB0cnkgewogICAgICAgICAgICBuID0gaWUubG9va3VwTm9kZShlLCByKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbyA9IGllLm5vZGVQZXJtaXNzaW9ucyhlLCAnd3gnKTsKICAgICAgICAgIGlmIChvKSByZXR1cm4gbzsKICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIGlmICghaWUuaXNEaXIobi5tb2RlKSkgcmV0dXJuIDU0OwogICAgICAgICAgICBpZiAoaWUuaXNSb290KG4pIHx8IGllLmdldFBhdGgobikgPT09IGllLmN3ZCgpKSByZXR1cm4gMTA7CiAgICAgICAgICB9IGVsc2UgaWYgKGllLmlzRGlyKG4ubW9kZSkpIHJldHVybiAzMTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0sCiAgICAgICAgbWF5T3BlbjogKGUsIHIpID0+CiAgICAgICAgICBlCiAgICAgICAgICAgID8gaWUuaXNMaW5rKGUubW9kZSkKICAgICAgICAgICAgICA/IDMyCiAgICAgICAgICAgICAgOiBpZS5pc0RpcihlLm1vZGUpICYmICgncicgIT09IGllLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKHIpIHx8IDUxMiAmIHIpCiAgICAgICAgICAgICAgICA/IDMxCiAgICAgICAgICAgICAgICA6IGllLm5vZGVQZXJtaXNzaW9ucyhlLCBpZS5mbGFnc1RvUGVybWlzc2lvblN0cmluZyhyKSkKICAgICAgICAgICAgOiA0NCwKICAgICAgICBNQVhfT1BFTl9GRFM6IDQwOTYsCiAgICAgICAgbmV4dGZkOiAoZSA9IDAsIHIgPSBpZS5NQVhfT1BFTl9GRFMpID0+IHsKICAgICAgICAgIGZvciAodmFyIHQgPSBlOyB0IDw9IHI7IHQrKykgaWYgKCFpZS5zdHJlYW1zW3RdKSByZXR1cm4gdDsKICAgICAgICAgIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDMzKTsKICAgICAgICB9LAogICAgICAgIGdldFN0cmVhbTogKGUpID0+IGllLnN0cmVhbXNbZV0sCiAgICAgICAgY3JlYXRlU3RyZWFtOiAoZSwgciwgdCkgPT4gewogICAgICAgICAgaWUuRlNTdHJlYW0gfHwKICAgICAgICAgICAgKChpZS5GU1N0cmVhbSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICB0aGlzLnNoYXJlZCA9IHt9OwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgKGllLkZTU3RyZWFtLnByb3RvdHlwZSA9IHt9KSwKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaWUuRlNTdHJlYW0ucHJvdG90eXBlLCB7CiAgICAgICAgICAgICAgb2JqZWN0OiB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubm9kZTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBpc1JlYWQ6IHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gMSAhPSAoMjA5NzE1NSAmIHRoaXMuZmxhZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgaXNXcml0ZTogewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAwICE9ICgyMDk3MTU1ICYgdGhpcy5mbGFncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBpc0FwcGVuZDogewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiAxMDI0ICYgdGhpcy5mbGFnczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGZsYWdzOiB7CiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVkLmZsYWdzOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5zaGFyZWQuZmxhZ3MgPSBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZWQucG9zaXRpb247CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZC5wb3NpdGlvbiA9IGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSksCiAgICAgICAgICAgIChlID0gT2JqZWN0LmFzc2lnbihuZXcgaWUuRlNTdHJlYW0oKSwgZSkpOwogICAgICAgICAgdmFyIG4gPSBpZS5uZXh0ZmQociwgdCk7CiAgICAgICAgICByZXR1cm4gKGUuZmQgPSBuKSwgKGllLnN0cmVhbXNbbl0gPSBlKSwgZTsKICAgICAgICB9LAogICAgICAgIGNsb3NlU3RyZWFtOiAoZSkgPT4gewogICAgICAgICAgaWUuc3RyZWFtc1tlXSA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICBjaHJkZXZfc3RyZWFtX29wczogewogICAgICAgICAgb3BlbjogKGUpID0+IHsKICAgICAgICAgICAgdmFyIHIgPSBpZS5nZXREZXZpY2UoZS5ub2RlLnJkZXYpOwogICAgICAgICAgICAoZS5zdHJlYW1fb3BzID0gci5zdHJlYW1fb3BzKSwgZS5zdHJlYW1fb3BzLm9wZW4gJiYgZS5zdHJlYW1fb3BzLm9wZW4oZSk7CiAgICAgICAgICB9LAogICAgICAgICAgbGxzZWVrOiAoKSA9PiB7CiAgICAgICAgICAgIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDcwKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG1ham9yOiAoZSkgPT4gZSA+PiA4LAogICAgICAgIG1pbm9yOiAoZSkgPT4gMjU1ICYgZSwKICAgICAgICBtYWtlZGV2OiAoZSwgcikgPT4gKGUgPDwgOCkgfCByLAogICAgICAgIHJlZ2lzdGVyRGV2aWNlOiAoZSwgcikgPT4gewogICAgICAgICAgaWUuZGV2aWNlc1tlXSA9IHsgc3RyZWFtX29wczogciB9OwogICAgICAgIH0sCiAgICAgICAgZ2V0RGV2aWNlOiAoZSkgPT4gaWUuZGV2aWNlc1tlXSwKICAgICAgICBnZXRNb3VudHM6IChlKSA9PiB7CiAgICAgICAgICBmb3IgKHZhciByID0gW10sIHQgPSBbZV07IHQubGVuZ3RoOyApIHsKICAgICAgICAgICAgdmFyIG4gPSB0LnBvcCgpOwogICAgICAgICAgICByLnB1c2gobiksIHQucHVzaC5hcHBseSh0LCBuLm1vdW50cyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcjsKICAgICAgICB9LAogICAgICAgIHN5bmNmczogKGUsIHIpID0+IHsKICAgICAgICAgICdmdW5jdGlvbicgPT0gdHlwZW9mIGUgJiYgKChyID0gZSksIChlID0gITEpKSwKICAgICAgICAgICAgaWUuc3luY0ZTUmVxdWVzdHMrKywKICAgICAgICAgICAgaWUuc3luY0ZTUmVxdWVzdHMgPiAxICYmCiAgICAgICAgICAgICAgdigKICAgICAgICAgICAgICAgICd3YXJuaW5nOiAnICsKICAgICAgICAgICAgICAgICAgaWUuc3luY0ZTUmVxdWVzdHMgKwogICAgICAgICAgICAgICAgICAnIEZTLnN5bmNmcyBvcGVyYXRpb25zIGluIGZsaWdodCBhdCBvbmNlLCBwcm9iYWJseSBqdXN0IGRvaW5nIGV4dHJhIHdvcmsnCiAgICAgICAgICAgICAgKTsKICAgICAgICAgIHZhciB0ID0gaWUuZ2V0TW91bnRzKGllLnJvb3QubW91bnQpLAogICAgICAgICAgICBuID0gMDsKICAgICAgICAgIGZ1bmN0aW9uIG8oZSkgewogICAgICAgICAgICByZXR1cm4gaWUuc3luY0ZTUmVxdWVzdHMtLSwgcihlKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmN0aW9uIGkoZSkgewogICAgICAgICAgICBpZiAoZSkgcmV0dXJuIGkuZXJyb3JlZCA/IHZvaWQgMCA6ICgoaS5lcnJvcmVkID0gITApLCBvKGUpKTsKICAgICAgICAgICAgKytuID49IHQubGVuZ3RoICYmIG8obnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICB0LmZvckVhY2goKHIpID0+IHsKICAgICAgICAgICAgaWYgKCFyLnR5cGUuc3luY2ZzKSByZXR1cm4gaShudWxsKTsKICAgICAgICAgICAgci50eXBlLnN5bmNmcyhyLCBlLCBpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0sCiAgICAgICAgbW91bnQ6IChlLCByLCB0KSA9PiB7CiAgICAgICAgICB2YXIgbiwKICAgICAgICAgICAgbyA9ICcvJyA9PT0gdCwKICAgICAgICAgICAgaSA9ICF0OwogICAgICAgICAgaWYgKG8gJiYgaWUucm9vdCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMTApOwogICAgICAgICAgaWYgKCFvICYmICFpKSB7CiAgICAgICAgICAgIHZhciBhID0gaWUubG9va3VwUGF0aCh0LCB7IGZvbGxvd19tb3VudDogITEgfSk7CiAgICAgICAgICAgIGlmICgoKHQgPSBhLnBhdGgpLCAobiA9IGEubm9kZSksIGllLmlzTW91bnRwb2ludChuKSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDEwKTsKICAgICAgICAgICAgaWYgKCFpZS5pc0RpcihuLm1vZGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig1NCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcyA9IHsgdHlwZTogZSwgb3B0czogciwgbW91bnRwb2ludDogdCwgbW91bnRzOiBbXSB9LAogICAgICAgICAgICB1ID0gZS5tb3VudChzKTsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICh1Lm1vdW50ID0gcyksCiAgICAgICAgICAgIChzLnJvb3QgPSB1KSwKICAgICAgICAgICAgbyA/IChpZS5yb290ID0gdSkgOiBuICYmICgobi5tb3VudGVkID0gcyksIG4ubW91bnQgJiYgbi5tb3VudC5tb3VudHMucHVzaChzKSksCiAgICAgICAgICAgIHUKICAgICAgICAgICk7CiAgICAgICAgfSwKICAgICAgICB1bm1vdW50OiAoZSkgPT4gewogICAgICAgICAgdmFyIHIgPSBpZS5sb29rdXBQYXRoKGUsIHsgZm9sbG93X21vdW50OiAhMSB9KTsKICAgICAgICAgIGlmICghaWUuaXNNb3VudHBvaW50KHIubm9kZSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDI4KTsKICAgICAgICAgIHZhciB0ID0gci5ub2RlLAogICAgICAgICAgICBuID0gdC5tb3VudGVkLAogICAgICAgICAgICBvID0gaWUuZ2V0TW91bnRzKG4pOwogICAgICAgICAgT2JqZWN0LmtleXMoaWUubmFtZVRhYmxlKS5mb3JFYWNoKChlKSA9PiB7CiAgICAgICAgICAgIGZvciAodmFyIHIgPSBpZS5uYW1lVGFibGVbZV07IHI7ICkgewogICAgICAgICAgICAgIHZhciB0ID0gci5uYW1lX25leHQ7CiAgICAgICAgICAgICAgby5pbmNsdWRlcyhyLm1vdW50KSAmJiBpZS5kZXN0cm95Tm9kZShyKSwgKHIgPSB0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSksCiAgICAgICAgICAgICh0Lm1vdW50ZWQgPSBudWxsKTsKICAgICAgICAgIHZhciBpID0gdC5tb3VudC5tb3VudHMuaW5kZXhPZihuKTsKICAgICAgICAgIHQubW91bnQubW91bnRzLnNwbGljZShpLCAxKTsKICAgICAgICB9LAogICAgICAgIGxvb2t1cDogKGUsIHIpID0+IGUubm9kZV9vcHMubG9va3VwKGUsIHIpLAogICAgICAgIG1rbm9kOiAoZSwgciwgdCkgPT4gewogICAgICAgICAgdmFyIG4gPSBpZS5sb29rdXBQYXRoKGUsIHsgcGFyZW50OiAhMCB9KS5ub2RlLAogICAgICAgICAgICBvID0gWi5iYXNlbmFtZShlKTsKICAgICAgICAgIGlmICghbyB8fCAnLicgPT09IG8gfHwgJy4uJyA9PT0gbykgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgdmFyIGkgPSBpZS5tYXlDcmVhdGUobiwgbyk7CiAgICAgICAgICBpZiAoaSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoaSk7CiAgICAgICAgICBpZiAoIW4ubm9kZV9vcHMubWtub2QpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYzKTsKICAgICAgICAgIHJldHVybiBuLm5vZGVfb3BzLm1rbm9kKG4sIG8sIHIsIHQpOwogICAgICAgIH0sCiAgICAgICAgY3JlYXRlOiAoZSwgcikgPT4gKChyID0gdm9pZCAwICE9PSByID8gciA6IDQzOCksIChyICY9IDQwOTUpLCAociB8PSAzMjc2OCksIGllLm1rbm9kKGUsIHIsIDApKSwKICAgICAgICBta2RpcjogKGUsIHIpID0+ICgociA9IHZvaWQgMCAhPT0gciA/IHIgOiA1MTEpLCAociAmPSAxMDIzKSwgKHIgfD0gMTYzODQpLCBpZS5ta25vZChlLCByLCAwKSksCiAgICAgICAgbWtkaXJUcmVlOiAoZSwgcikgPT4gewogICAgICAgICAgZm9yICh2YXIgdCA9IGUuc3BsaXQoJy8nKSwgbiA9ICcnLCBvID0gMDsgbyA8IHQubGVuZ3RoOyArK28pCiAgICAgICAgICAgIGlmICh0W29dKSB7CiAgICAgICAgICAgICAgbiArPSAnLycgKyB0W29dOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZS5ta2RpcihuLCByKTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoMjAgIT0gZS5lcnJubykgdGhyb3cgZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIG1rZGV2OiAoZSwgciwgdCkgPT4gKHZvaWQgMCA9PT0gdCAmJiAoKHQgPSByKSwgKHIgPSA0MzgpKSwgKHIgfD0gODE5MiksIGllLm1rbm9kKGUsIHIsIHQpKSwKICAgICAgICBzeW1saW5rOiAoZSwgcikgPT4gewogICAgICAgICAgaWYgKCFRLnJlc29sdmUoZSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgIHZhciB0ID0gaWUubG9va3VwUGF0aChyLCB7IHBhcmVudDogITAgfSkubm9kZTsKICAgICAgICAgIGlmICghdCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNDQpOwogICAgICAgICAgdmFyIG4gPSBaLmJhc2VuYW1lKHIpLAogICAgICAgICAgICBvID0gaWUubWF5Q3JlYXRlKHQsIG4pOwogICAgICAgICAgaWYgKG8pIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKG8pOwogICAgICAgICAgaWYgKCF0Lm5vZGVfb3BzLnN5bWxpbmspIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYzKTsKICAgICAgICAgIHJldHVybiB0Lm5vZGVfb3BzLnN5bWxpbmsodCwgbiwgZSk7CiAgICAgICAgfSwKICAgICAgICByZW5hbWU6IChlLCByKSA9PiB7CiAgICAgICAgICB2YXIgdCwKICAgICAgICAgICAgbiwKICAgICAgICAgICAgbyA9IFouZGlybmFtZShlKSwKICAgICAgICAgICAgaSA9IFouZGlybmFtZShyKSwKICAgICAgICAgICAgYSA9IFouYmFzZW5hbWUoZSksCiAgICAgICAgICAgIHMgPSBaLmJhc2VuYW1lKHIpOwogICAgICAgICAgaWYgKCgodCA9IGllLmxvb2t1cFBhdGgoZSwgeyBwYXJlbnQ6ICEwIH0pLm5vZGUpLCAobiA9IGllLmxvb2t1cFBhdGgociwgeyBwYXJlbnQ6ICEwIH0pLm5vZGUpLCAhdCB8fCAhbikpCiAgICAgICAgICAgIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgIGlmICh0Lm1vdW50ICE9PSBuLm1vdW50KSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig3NSk7CiAgICAgICAgICB2YXIgdSwKICAgICAgICAgICAgbCA9IGllLmxvb2t1cE5vZGUodCwgYSksCiAgICAgICAgICAgIGMgPSBRLnJlbGF0aXZlKGUsIGkpOwogICAgICAgICAgaWYgKCcuJyAhPT0gYy5jaGFyQXQoMCkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDI4KTsKICAgICAgICAgIGlmICgnLicgIT09IChjID0gUS5yZWxhdGl2ZShyLCBvKSkuY2hhckF0KDApKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig1NSk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB1ID0gaWUubG9va3VwTm9kZShuLCBzKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICBpZiAobCAhPT0gdSkgewogICAgICAgICAgICB2YXIgZCA9IGllLmlzRGlyKGwubW9kZSksCiAgICAgICAgICAgICAgZiA9IGllLm1heURlbGV0ZSh0LCBhLCBkKTsKICAgICAgICAgICAgaWYgKGYpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKGYpOwogICAgICAgICAgICBpZiAoKGYgPSB1ID8gaWUubWF5RGVsZXRlKG4sIHMsIGQpIDogaWUubWF5Q3JlYXRlKG4sIHMpKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoZik7CiAgICAgICAgICAgIGlmICghdC5ub2RlX29wcy5yZW5hbWUpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYzKTsKICAgICAgICAgICAgaWYgKGllLmlzTW91bnRwb2ludChsKSB8fCAodSAmJiBpZS5pc01vdW50cG9pbnQodSkpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigxMCk7CiAgICAgICAgICAgIGlmIChuICE9PSB0ICYmIChmID0gaWUubm9kZVBlcm1pc3Npb25zKHQsICd3JykpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcihmKTsKICAgICAgICAgICAgaWUuaGFzaFJlbW92ZU5vZGUobCk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgdC5ub2RlX29wcy5yZW5hbWUobCwgbiwgcyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIGllLmhhc2hBZGROb2RlKGwpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBybWRpcjogKGUpID0+IHsKICAgICAgICAgIHZhciByID0gaWUubG9va3VwUGF0aChlLCB7IHBhcmVudDogITAgfSkubm9kZSwKICAgICAgICAgICAgdCA9IFouYmFzZW5hbWUoZSksCiAgICAgICAgICAgIG4gPSBpZS5sb29rdXBOb2RlKHIsIHQpLAogICAgICAgICAgICBvID0gaWUubWF5RGVsZXRlKHIsIHQsICEwKTsKICAgICAgICAgIGlmIChvKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcihvKTsKICAgICAgICAgIGlmICghci5ub2RlX29wcy5ybWRpcikgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNjMpOwogICAgICAgICAgaWYgKGllLmlzTW91bnRwb2ludChuKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMTApOwogICAgICAgICAgci5ub2RlX29wcy5ybWRpcihyLCB0KSwgaWUuZGVzdHJveU5vZGUobik7CiAgICAgICAgfSwKICAgICAgICByZWFkZGlyOiAoZSkgPT4gewogICAgICAgICAgdmFyIHIgPSBpZS5sb29rdXBQYXRoKGUsIHsgZm9sbG93OiAhMCB9KS5ub2RlOwogICAgICAgICAgaWYgKCFyLm5vZGVfb3BzLnJlYWRkaXIpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDU0KTsKICAgICAgICAgIHJldHVybiByLm5vZGVfb3BzLnJlYWRkaXIocik7CiAgICAgICAgfSwKICAgICAgICB1bmxpbms6IChlKSA9PiB7CiAgICAgICAgICB2YXIgciA9IGllLmxvb2t1cFBhdGgoZSwgeyBwYXJlbnQ6ICEwIH0pLm5vZGU7CiAgICAgICAgICBpZiAoIXIpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgIHZhciB0ID0gWi5iYXNlbmFtZShlKSwKICAgICAgICAgICAgbiA9IGllLmxvb2t1cE5vZGUociwgdCksCiAgICAgICAgICAgIG8gPSBpZS5tYXlEZWxldGUociwgdCwgITEpOwogICAgICAgICAgaWYgKG8pIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKG8pOwogICAgICAgICAgaWYgKCFyLm5vZGVfb3BzLnVubGluaykgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNjMpOwogICAgICAgICAgaWYgKGllLmlzTW91bnRwb2ludChuKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMTApOwogICAgICAgICAgci5ub2RlX29wcy51bmxpbmsociwgdCksIGllLmRlc3Ryb3lOb2RlKG4pOwogICAgICAgIH0sCiAgICAgICAgcmVhZGxpbms6IChlKSA9PiB7CiAgICAgICAgICB2YXIgciA9IGllLmxvb2t1cFBhdGgoZSkubm9kZTsKICAgICAgICAgIGlmICghcikgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNDQpOwogICAgICAgICAgaWYgKCFyLm5vZGVfb3BzLnJlYWRsaW5rKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOCk7CiAgICAgICAgICByZXR1cm4gUS5yZXNvbHZlKGllLmdldFBhdGgoci5wYXJlbnQpLCByLm5vZGVfb3BzLnJlYWRsaW5rKHIpKTsKICAgICAgICB9LAogICAgICAgIHN0YXQ6IChlLCByKSA9PiB7CiAgICAgICAgICB2YXIgdCA9IGllLmxvb2t1cFBhdGgoZSwgeyBmb2xsb3c6ICFyIH0pLm5vZGU7CiAgICAgICAgICBpZiAoIXQpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgIGlmICghdC5ub2RlX29wcy5nZXRhdHRyKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig2Myk7CiAgICAgICAgICByZXR1cm4gdC5ub2RlX29wcy5nZXRhdHRyKHQpOwogICAgICAgIH0sCiAgICAgICAgbHN0YXQ6IChlKSA9PiBpZS5zdGF0KGUsICEwKSwKICAgICAgICBjaG1vZDogKGUsIHIsIHQpID0+IHsKICAgICAgICAgIHZhciBuOwogICAgICAgICAgJ3N0cmluZycgPT0gdHlwZW9mIGUgPyAobiA9IGllLmxvb2t1cFBhdGgoZSwgeyBmb2xsb3c6ICF0IH0pLm5vZGUpIDogKG4gPSBlKTsKICAgICAgICAgIGlmICghbi5ub2RlX29wcy5zZXRhdHRyKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig2Myk7CiAgICAgICAgICBuLm5vZGVfb3BzLnNldGF0dHIobiwgeyBtb2RlOiAoNDA5NSAmIHIpIHwgKC00MDk2ICYgbi5tb2RlKSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgICAgIH0sCiAgICAgICAgbGNobW9kOiAoZSwgcikgPT4gewogICAgICAgICAgaWUuY2htb2QoZSwgciwgITApOwogICAgICAgIH0sCiAgICAgICAgZmNobW9kOiAoZSwgcikgPT4gewogICAgICAgICAgdmFyIHQgPSBpZS5nZXRTdHJlYW0oZSk7CiAgICAgICAgICBpZiAoIXQpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDgpOwogICAgICAgICAgaWUuY2htb2QodC5ub2RlLCByKTsKICAgICAgICB9LAogICAgICAgIGNob3duOiAoZSwgciwgdCwgbikgPT4gewogICAgICAgICAgdmFyIG87CiAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IChvID0gaWUubG9va3VwUGF0aChlLCB7IGZvbGxvdzogIW4gfSkubm9kZSkgOiAobyA9IGUpOwogICAgICAgICAgaWYgKCFvLm5vZGVfb3BzLnNldGF0dHIpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYzKTsKICAgICAgICAgIG8ubm9kZV9vcHMuc2V0YXR0cihvLCB7IHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9KTsKICAgICAgICB9LAogICAgICAgIGxjaG93bjogKGUsIHIsIHQpID0+IHsKICAgICAgICAgIGllLmNob3duKGUsIHIsIHQsICEwKTsKICAgICAgICB9LAogICAgICAgIGZjaG93bjogKGUsIHIsIHQpID0+IHsKICAgICAgICAgIHZhciBuID0gaWUuZ2V0U3RyZWFtKGUpOwogICAgICAgICAgaWYgKCFuKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig4KTsKICAgICAgICAgIGllLmNob3duKG4ubm9kZSwgciwgdCk7CiAgICAgICAgfSwKICAgICAgICB0cnVuY2F0ZTogKGUsIHIpID0+IHsKICAgICAgICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/ICh0ID0gaWUubG9va3VwUGF0aChlLCB7IGZvbGxvdzogITAgfSkubm9kZSkgOiAodCA9IGUpOwogICAgICAgICAgaWYgKCF0Lm5vZGVfb3BzLnNldGF0dHIpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDYzKTsKICAgICAgICAgIGlmIChpZS5pc0Rpcih0Lm1vZGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigzMSk7CiAgICAgICAgICBpZiAoIWllLmlzRmlsZSh0Lm1vZGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOCk7CiAgICAgICAgICB2YXIgbiA9IGllLm5vZGVQZXJtaXNzaW9ucyh0LCAndycpOwogICAgICAgICAgaWYgKG4pIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKG4pOwogICAgICAgICAgdC5ub2RlX29wcy5zZXRhdHRyKHQsIHsgc2l6ZTogciwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0pOwogICAgICAgIH0sCiAgICAgICAgZnRydW5jYXRlOiAoZSwgcikgPT4gewogICAgICAgICAgdmFyIHQgPSBpZS5nZXRTdHJlYW0oZSk7CiAgICAgICAgICBpZiAoIXQpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDgpOwogICAgICAgICAgaWYgKDAgPT0gKDIwOTcxNTUgJiB0LmZsYWdzKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgaWUudHJ1bmNhdGUodC5ub2RlLCByKTsKICAgICAgICB9LAogICAgICAgIHV0aW1lOiAoZSwgciwgdCkgPT4gewogICAgICAgICAgdmFyIG4gPSBpZS5sb29rdXBQYXRoKGUsIHsgZm9sbG93OiAhMCB9KS5ub2RlOwogICAgICAgICAgbi5ub2RlX29wcy5zZXRhdHRyKG4sIHsgdGltZXN0YW1wOiBNYXRoLm1heChyLCB0KSB9KTsKICAgICAgICB9LAogICAgICAgIG9wZW46IChlLCByLCB0KSA9PiB7CiAgICAgICAgICBpZiAoJycgPT09IGUpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgIHZhciBuOwogICAgICAgICAgaWYgKAogICAgICAgICAgICAoKHQgPSB2b2lkIDAgPT09IHQgPyA0MzggOiB0KSwKICAgICAgICAgICAgKHQgPSA2NCAmIChyID0gJ3N0cmluZycgPT0gdHlwZW9mIHIgPyBpZS5tb2RlU3RyaW5nVG9GbGFncyhyKSA6IHIpID8gKDQwOTUgJiB0KSB8IDMyNzY4IDogMCksCiAgICAgICAgICAgICdvYmplY3QnID09IHR5cGVvZiBlKQogICAgICAgICAgKQogICAgICAgICAgICBuID0gZTsKICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBlID0gWi5ub3JtYWxpemUoZSk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgbiA9IGllLmxvb2t1cFBhdGgoZSwgeyBmb2xsb3c6ICEoMTMxMDcyICYgcikgfSkubm9kZTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgIH0KICAgICAgICAgIHZhciBvID0gITE7CiAgICAgICAgICBpZiAoNjQgJiByKQogICAgICAgICAgICBpZiAobikgewogICAgICAgICAgICAgIGlmICgxMjggJiByKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyMCk7CiAgICAgICAgICAgIH0gZWxzZSAobiA9IGllLm1rbm9kKGUsIHQsIDApKSwgKG8gPSAhMCk7CiAgICAgICAgICBpZiAoIW4pIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgIGlmICgoaWUuaXNDaHJkZXYobi5tb2RlKSAmJiAociAmPSAtNTEzKSwgNjU1MzYgJiByICYmICFpZS5pc0RpcihuLm1vZGUpKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNTQpOwogICAgICAgICAgaWYgKCFvKSB7CiAgICAgICAgICAgIHZhciBhID0gaWUubWF5T3BlbihuLCByKTsKICAgICAgICAgICAgaWYgKGEpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKGEpOwogICAgICAgICAgfQogICAgICAgICAgNTEyICYgciAmJiAhbyAmJiBpZS50cnVuY2F0ZShuLCAwKSwgKHIgJj0gLTEzMTcxMyk7CiAgICAgICAgICB2YXIgcyA9IGllLmNyZWF0ZVN0cmVhbSh7CiAgICAgICAgICAgIG5vZGU6IG4sCiAgICAgICAgICAgIHBhdGg6IGllLmdldFBhdGgobiksCiAgICAgICAgICAgIGZsYWdzOiByLAogICAgICAgICAgICBzZWVrYWJsZTogITAsCiAgICAgICAgICAgIHBvc2l0aW9uOiAwLAogICAgICAgICAgICBzdHJlYW1fb3BzOiBuLnN0cmVhbV9vcHMsCiAgICAgICAgICAgIHVuZ290dGVuOiBbXSwKICAgICAgICAgICAgZXJyb3I6ICExCiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHMuc3RyZWFtX29wcy5vcGVuICYmIHMuc3RyZWFtX29wcy5vcGVuKHMpLAogICAgICAgICAgICAhaS5sb2dSZWFkRmlsZXMgfHwKICAgICAgICAgICAgICAxICYgciB8fAogICAgICAgICAgICAgIChpZS5yZWFkRmlsZXMgfHwgKGllLnJlYWRGaWxlcyA9IHt9KSwgZSBpbiBpZS5yZWFkRmlsZXMgfHwgKGllLnJlYWRGaWxlc1tlXSA9IDEpKSwKICAgICAgICAgICAgcwogICAgICAgICAgKTsKICAgICAgICB9LAogICAgICAgIGNsb3NlOiAoZSkgPT4gewogICAgICAgICAgaWYgKGllLmlzQ2xvc2VkKGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig4KTsKICAgICAgICAgIGUuZ2V0ZGVudHMgJiYgKGUuZ2V0ZGVudHMgPSBudWxsKTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGUuc3RyZWFtX29wcy5jbG9zZSAmJiBlLnN0cmVhbV9vcHMuY2xvc2UoZSk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBpZS5jbG9zZVN0cmVhbShlLmZkKTsKICAgICAgICAgIH0KICAgICAgICAgIGUuZmQgPSBudWxsOwogICAgICAgIH0sCiAgICAgICAgaXNDbG9zZWQ6IChlKSA9PiBudWxsID09PSBlLmZkLAogICAgICAgIGxsc2VlazogKGUsIHIsIHQpID0+IHsKICAgICAgICAgIGlmIChpZS5pc0Nsb3NlZChlKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoOCk7CiAgICAgICAgICBpZiAoIWUuc2Vla2FibGUgfHwgIWUuc3RyZWFtX29wcy5sbHNlZWspIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDcwKTsKICAgICAgICAgIGlmICgwICE9IHQgJiYgMSAhPSB0ICYmIDIgIT0gdCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgcmV0dXJuIChlLnBvc2l0aW9uID0gZS5zdHJlYW1fb3BzLmxsc2VlayhlLCByLCB0KSksIChlLnVuZ290dGVuID0gW10pLCBlLnBvc2l0aW9uOwogICAgICAgIH0sCiAgICAgICAgcmVhZDogKGUsIHIsIHQsIG4sIG8pID0+IHsKICAgICAgICAgIGlmIChuIDwgMCB8fCBvIDwgMCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgaWYgKGllLmlzQ2xvc2VkKGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig4KTsKICAgICAgICAgIGlmICgxID09ICgyMDk3MTU1ICYgZS5mbGFncykpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDgpOwogICAgICAgICAgaWYgKGllLmlzRGlyKGUubm9kZS5tb2RlKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMzEpOwogICAgICAgICAgaWYgKCFlLnN0cmVhbV9vcHMucmVhZCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgdmFyIGkgPSB2b2lkIDAgIT09IG87CiAgICAgICAgICBpZiAoaSkgewogICAgICAgICAgICBpZiAoIWUuc2Vla2FibGUpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDcwKTsKICAgICAgICAgIH0gZWxzZSBvID0gZS5wb3NpdGlvbjsKICAgICAgICAgIHZhciBhID0gZS5zdHJlYW1fb3BzLnJlYWQoZSwgciwgdCwgbiwgbyk7CiAgICAgICAgICByZXR1cm4gaSB8fCAoZS5wb3NpdGlvbiArPSBhKSwgYTsKICAgICAgICB9LAogICAgICAgIHdyaXRlOiAoZSwgciwgdCwgbiwgbywgaSkgPT4gewogICAgICAgICAgaWYgKG4gPCAwIHx8IG8gPCAwKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOCk7CiAgICAgICAgICBpZiAoaWUuaXNDbG9zZWQoZSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDgpOwogICAgICAgICAgaWYgKDAgPT0gKDIwOTcxNTUgJiBlLmZsYWdzKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoOCk7CiAgICAgICAgICBpZiAoaWUuaXNEaXIoZS5ub2RlLm1vZGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigzMSk7CiAgICAgICAgICBpZiAoIWUuc3RyZWFtX29wcy53cml0ZSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjgpOwogICAgICAgICAgZS5zZWVrYWJsZSAmJiAxMDI0ICYgZS5mbGFncyAmJiBpZS5sbHNlZWsoZSwgMCwgMik7CiAgICAgICAgICB2YXIgYSA9IHZvaWQgMCAhPT0gbzsKICAgICAgICAgIGlmIChhKSB7CiAgICAgICAgICAgIGlmICghZS5zZWVrYWJsZSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNzApOwogICAgICAgICAgfSBlbHNlIG8gPSBlLnBvc2l0aW9uOwogICAgICAgICAgdmFyIHMgPSBlLnN0cmVhbV9vcHMud3JpdGUoZSwgciwgdCwgbiwgbywgaSk7CiAgICAgICAgICByZXR1cm4gYSB8fCAoZS5wb3NpdGlvbiArPSBzKSwgczsKICAgICAgICB9LAogICAgICAgIGFsbG9jYXRlOiAoZSwgciwgdCkgPT4gewogICAgICAgICAgaWYgKGllLmlzQ2xvc2VkKGUpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcig4KTsKICAgICAgICAgIGlmIChyIDwgMCB8fCB0IDw9IDApIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDI4KTsKICAgICAgICAgIGlmICgwID09ICgyMDk3MTU1ICYgZS5mbGFncykpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDgpOwogICAgICAgICAgaWYgKCFpZS5pc0ZpbGUoZS5ub2RlLm1vZGUpICYmICFpZS5pc0RpcihlLm5vZGUubW9kZSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQzKTsKICAgICAgICAgIGlmICghZS5zdHJlYW1fb3BzLmFsbG9jYXRlKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigxMzgpOwogICAgICAgICAgZS5zdHJlYW1fb3BzLmFsbG9jYXRlKGUsIHIsIHQpOwogICAgICAgIH0sCiAgICAgICAgbW1hcDogKGUsIHIsIHQsIG4sIG8pID0+IHsKICAgICAgICAgIGlmICgwICE9ICgyICYgbikgJiYgMCA9PSAoMiAmIG8pICYmIDIgIT0gKDIwOTcxNTUgJiBlLmZsYWdzKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMik7CiAgICAgICAgICBpZiAoMSA9PSAoMjA5NzE1NSAmIGUuZmxhZ3MpKSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyKTsKICAgICAgICAgIGlmICghZS5zdHJlYW1fb3BzLm1tYXApIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQzKTsKICAgICAgICAgIHJldHVybiBlLnN0cmVhbV9vcHMubW1hcChlLCByLCB0LCBuLCBvKTsKICAgICAgICB9LAogICAgICAgIG1zeW5jOiAoZSwgciwgdCwgbiwgbykgPT4gKGUuc3RyZWFtX29wcy5tc3luYyA/IGUuc3RyZWFtX29wcy5tc3luYyhlLCByLCB0LCBuLCBvKSA6IDApLAogICAgICAgIG11bm1hcDogKGUpID0+IDAsCiAgICAgICAgaW9jdGw6IChlLCByLCB0KSA9PiB7CiAgICAgICAgICBpZiAoIWUuc3RyZWFtX29wcy5pb2N0bCkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNTkpOwogICAgICAgICAgcmV0dXJuIGUuc3RyZWFtX29wcy5pb2N0bChlLCByLCB0KTsKICAgICAgICB9LAogICAgICAgIHJlYWRGaWxlOiAoZSwgciA9IHt9KSA9PiB7CiAgICAgICAgICBpZiAoCiAgICAgICAgICAgICgoci5mbGFncyA9IHIuZmxhZ3MgfHwgMCksCiAgICAgICAgICAgIChyLmVuY29kaW5nID0gci5lbmNvZGluZyB8fCAnYmluYXJ5JyksCiAgICAgICAgICAgICd1dGY4JyAhPT0gci5lbmNvZGluZyAmJiAnYmluYXJ5JyAhPT0gci5lbmNvZGluZykKICAgICAgICAgICkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVuY29kaW5nIHR5cGUgIicgKyByLmVuY29kaW5nICsgJyInKTsKICAgICAgICAgIHZhciB0LAogICAgICAgICAgICBuID0gaWUub3BlbihlLCByLmZsYWdzKSwKICAgICAgICAgICAgbyA9IGllLnN0YXQoZSkuc2l6ZSwKICAgICAgICAgICAgaSA9IG5ldyBVaW50OEFycmF5KG8pOwogICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgaWUucmVhZChuLCBpLCAwLCBvLCAwKSwKICAgICAgICAgICAgJ3V0ZjgnID09PSByLmVuY29kaW5nID8gKHQgPSBBKGksIDApKSA6ICdiaW5hcnknID09PSByLmVuY29kaW5nICYmICh0ID0gaSksCiAgICAgICAgICAgIGllLmNsb3NlKG4pLAogICAgICAgICAgICB0CiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICAgd3JpdGVGaWxlOiAoZSwgciwgdCA9IHt9KSA9PiB7CiAgICAgICAgICB0LmZsYWdzID0gdC5mbGFncyB8fCA1Nzc7CiAgICAgICAgICB2YXIgbiA9IGllLm9wZW4oZSwgdC5mbGFncywgdC5tb2RlKTsKICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgcikgewogICAgICAgICAgICB2YXIgbyA9IG5ldyBVaW50OEFycmF5KHgocikgKyAxKSwKICAgICAgICAgICAgICBpID0gUihyLCBvLCAwLCBvLmxlbmd0aCk7CiAgICAgICAgICAgIGllLndyaXRlKG4sIG8sIDAsIGksIHZvaWQgMCwgdC5jYW5Pd24pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFBcnJheUJ1ZmZlci5pc1ZpZXcocikpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgZGF0YSB0eXBlJyk7CiAgICAgICAgICAgIGllLndyaXRlKG4sIHIsIDAsIHIuYnl0ZUxlbmd0aCwgdm9pZCAwLCB0LmNhbk93bik7CiAgICAgICAgICB9CiAgICAgICAgICBpZS5jbG9zZShuKTsKICAgICAgICB9LAogICAgICAgIGN3ZDogKCkgPT4gaWUuY3VycmVudFBhdGgsCiAgICAgICAgY2hkaXI6IChlKSA9PiB7CiAgICAgICAgICB2YXIgciA9IGllLmxvb2t1cFBhdGgoZSwgeyBmb2xsb3c6ICEwIH0pOwogICAgICAgICAgaWYgKG51bGwgPT09IHIubm9kZSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNDQpOwogICAgICAgICAgaWYgKCFpZS5pc0RpcihyLm5vZGUubW9kZSkpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDU0KTsKICAgICAgICAgIHZhciB0ID0gaWUubm9kZVBlcm1pc3Npb25zKHIubm9kZSwgJ3gnKTsKICAgICAgICAgIGlmICh0KSB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcih0KTsKICAgICAgICAgIGllLmN1cnJlbnRQYXRoID0gci5wYXRoOwogICAgICAgIH0sCiAgICAgICAgY3JlYXRlRGVmYXVsdERpcmVjdG9yaWVzOiAoKSA9PiB7CiAgICAgICAgICBpZS5ta2RpcignL3RtcCcpLCBpZS5ta2RpcignL2hvbWUnKSwgaWUubWtkaXIoJy9ob21lL3dlYl91c2VyJyk7CiAgICAgICAgfSwKICAgICAgICBjcmVhdGVEZWZhdWx0RGV2aWNlczogKCkgPT4gewogICAgICAgICAgaWUubWtkaXIoJy9kZXYnKSwKICAgICAgICAgICAgaWUucmVnaXN0ZXJEZXZpY2UoaWUubWFrZWRldigxLCAzKSwgeyByZWFkOiAoKSA9PiAwLCB3cml0ZTogKGUsIHIsIHQsIG4sIG8pID0+IG4gfSksCiAgICAgICAgICAgIGllLm1rZGV2KCcvZGV2L251bGwnLCBpZS5tYWtlZGV2KDEsIDMpKSwKICAgICAgICAgICAgcmUucmVnaXN0ZXIoaWUubWFrZWRldig1LCAwKSwgcmUuZGVmYXVsdF90dHlfb3BzKSwKICAgICAgICAgICAgcmUucmVnaXN0ZXIoaWUubWFrZWRldig2LCAwKSwgcmUuZGVmYXVsdF90dHkxX29wcyksCiAgICAgICAgICAgIGllLm1rZGV2KCcvZGV2L3R0eScsIGllLm1ha2VkZXYoNSwgMCkpLAogICAgICAgICAgICBpZS5ta2RldignL2Rldi90dHkxJywgaWUubWFrZWRldig2LCAwKSk7CiAgICAgICAgICB2YXIgZSA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICgnb2JqZWN0JyA9PSB0eXBlb2YgY3J5cHRvICYmICdmdW5jdGlvbicgPT0gdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHsKICAgICAgICAgICAgICB2YXIgZSA9IG5ldyBVaW50OEFycmF5KDEpOwogICAgICAgICAgICAgIHJldHVybiAoKSA9PiAoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhlKSwgZVswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgpID0+IFYoJ3JhbmRvbURldmljZScpOwogICAgICAgICAgfSkoKTsKICAgICAgICAgIGllLmNyZWF0ZURldmljZSgnL2RldicsICdyYW5kb20nLCBlKSwKICAgICAgICAgICAgaWUuY3JlYXRlRGV2aWNlKCcvZGV2JywgJ3VyYW5kb20nLCBlKSwKICAgICAgICAgICAgaWUubWtkaXIoJy9kZXYvc2htJyksCiAgICAgICAgICAgIGllLm1rZGlyKCcvZGV2L3NobS90bXAnKTsKICAgICAgICB9LAogICAgICAgIGNyZWF0ZVNwZWNpYWxEaXJlY3RvcmllczogKCkgPT4gewogICAgICAgICAgaWUubWtkaXIoJy9wcm9jJyk7CiAgICAgICAgICB2YXIgZSA9IGllLm1rZGlyKCcvcHJvYy9zZWxmJyk7CiAgICAgICAgICBpZS5ta2RpcignL3Byb2Mvc2VsZi9mZCcpLAogICAgICAgICAgICBpZS5tb3VudCgKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtb3VudDogKCkgPT4gewogICAgICAgICAgICAgICAgICB2YXIgciA9IGllLmNyZWF0ZU5vZGUoZSwgJ2ZkJywgMTY4OTUsIDczKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgICAgICAoci5ub2RlX29wcyA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cDogKGUsIHIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSArciwKICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gaWUuZ2V0U3RyZWFtKHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW4pIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbyA9IHsgcGFyZW50OiBudWxsLCBtb3VudDogeyBtb3VudHBvaW50OiAnZmFrZScgfSwgbm9kZV9vcHM6IHsgcmVhZGxpbms6ICgpID0+IG4ucGF0aCB9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoby5wYXJlbnQgPSBvKSwgbzsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICByCiAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB7fSwKICAgICAgICAgICAgICAnL3Byb2Mvc2VsZi9mZCcKICAgICAgICAgICAgKTsKICAgICAgICB9LAogICAgICAgIGNyZWF0ZVN0YW5kYXJkU3RyZWFtczogKCkgPT4gewogICAgICAgICAgaS5zdGRpbiA/IGllLmNyZWF0ZURldmljZSgnL2RldicsICdzdGRpbicsIGkuc3RkaW4pIDogaWUuc3ltbGluaygnL2Rldi90dHknLCAnL2Rldi9zdGRpbicpLAogICAgICAgICAgICBpLnN0ZG91dCA/IGllLmNyZWF0ZURldmljZSgnL2RldicsICdzdGRvdXQnLCBudWxsLCBpLnN0ZG91dCkgOiBpZS5zeW1saW5rKCcvZGV2L3R0eScsICcvZGV2L3N0ZG91dCcpLAogICAgICAgICAgICBpLnN0ZGVyciA/IGllLmNyZWF0ZURldmljZSgnL2RldicsICdzdGRlcnInLCBudWxsLCBpLnN0ZGVycikgOiBpZS5zeW1saW5rKCcvZGV2L3R0eTEnLCAnL2Rldi9zdGRlcnInKTsKICAgICAgICAgIGllLm9wZW4oJy9kZXYvc3RkaW4nLCAwKSwgaWUub3BlbignL2Rldi9zdGRvdXQnLCAxKSwgaWUub3BlbignL2Rldi9zdGRlcnInLCAxKTsKICAgICAgICB9LAogICAgICAgIGVuc3VyZUVycm5vRXJyb3I6ICgpID0+IHsKICAgICAgICAgIGllLkVycm5vRXJyb3IgfHwKICAgICAgICAgICAgKChpZS5FcnJub0Vycm9yID0gZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgICAodGhpcy5ub2RlID0gciksCiAgICAgICAgICAgICAgICAodGhpcy5zZXRFcnJubyA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuZXJybm8gPSBlOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICB0aGlzLnNldEVycm5vKGUpLAogICAgICAgICAgICAgICAgKHRoaXMubWVzc2FnZSA9ICdGUyBlcnJvcicpOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgKGllLkVycm5vRXJyb3IucHJvdG90eXBlID0gbmV3IEVycm9yKCkpLAogICAgICAgICAgICAoaWUuRXJybm9FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBpZS5FcnJub0Vycm9yKSwKICAgICAgICAgICAgWzQ0XS5mb3JFYWNoKChlKSA9PiB7CiAgICAgICAgICAgICAgKGllLmdlbmVyaWNFcnJvcnNbZV0gPSBuZXcgaWUuRXJybm9FcnJvcihlKSksIChpZS5nZW5lcmljRXJyb3JzW2VdLnN0YWNrID0gJzxnZW5lcmljIGVycm9yLCBubyBzdGFjaz4nKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0sCiAgICAgICAgc3RhdGljSW5pdDogKCkgPT4gewogICAgICAgICAgaWUuZW5zdXJlRXJybm9FcnJvcigpLAogICAgICAgICAgICAoaWUubmFtZVRhYmxlID0gbmV3IEFycmF5KDQwOTYpKSwKICAgICAgICAgICAgaWUubW91bnQobmUsIHt9LCAnLycpLAogICAgICAgICAgICBpZS5jcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXMoKSwKICAgICAgICAgICAgaWUuY3JlYXRlRGVmYXVsdERldmljZXMoKSwKICAgICAgICAgICAgaWUuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCksCiAgICAgICAgICAgIChpZS5maWxlc3lzdGVtcyA9IHsgTUVNRlM6IG5lIH0pOwogICAgICAgIH0sCiAgICAgICAgaW5pdDogKGUsIHIsIHQpID0+IHsKICAgICAgICAgIChpZS5pbml0LmluaXRpYWxpemVkID0gITApLAogICAgICAgICAgICBpZS5lbnN1cmVFcnJub0Vycm9yKCksCiAgICAgICAgICAgIChpLnN0ZGluID0gZSB8fCBpLnN0ZGluKSwKICAgICAgICAgICAgKGkuc3Rkb3V0ID0gciB8fCBpLnN0ZG91dCksCiAgICAgICAgICAgIChpLnN0ZGVyciA9IHQgfHwgaS5zdGRlcnIpLAogICAgICAgICAgICBpZS5jcmVhdGVTdGFuZGFyZFN0cmVhbXMoKTsKICAgICAgICB9LAogICAgICAgIHF1aXQ6ICgpID0+IHsKICAgICAgICAgIGllLmluaXQuaW5pdGlhbGl6ZWQgPSAhMTsKICAgICAgICAgIGZvciAodmFyIGUgPSAwOyBlIDwgaWUuc3RyZWFtcy5sZW5ndGg7IGUrKykgewogICAgICAgICAgICB2YXIgciA9IGllLnN0cmVhbXNbZV07CiAgICAgICAgICAgIHIgJiYgaWUuY2xvc2Uocik7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBnZXRNb2RlOiAoZSwgcikgPT4gewogICAgICAgICAgdmFyIHQgPSAwOwogICAgICAgICAgcmV0dXJuIGUgJiYgKHQgfD0gMzY1KSwgciAmJiAodCB8PSAxNDYpLCB0OwogICAgICAgIH0sCiAgICAgICAgZmluZE9iamVjdDogKGUsIHIpID0+IHsKICAgICAgICAgIHZhciB0ID0gaWUuYW5hbHl6ZVBhdGgoZSwgcik7CiAgICAgICAgICByZXR1cm4gdC5leGlzdHMgPyB0Lm9iamVjdCA6IG51bGw7CiAgICAgICAgfSwKICAgICAgICBhbmFseXplUGF0aDogKGUsIHIpID0+IHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGUgPSAobiA9IGllLmxvb2t1cFBhdGgoZSwgeyBmb2xsb3c6ICFyIH0pKS5wYXRoOwogICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgIHZhciB0ID0gewogICAgICAgICAgICBpc1Jvb3Q6ICExLAogICAgICAgICAgICBleGlzdHM6ICExLAogICAgICAgICAgICBlcnJvcjogMCwKICAgICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgICAgcGF0aDogbnVsbCwKICAgICAgICAgICAgb2JqZWN0OiBudWxsLAogICAgICAgICAgICBwYXJlbnRFeGlzdHM6ICExLAogICAgICAgICAgICBwYXJlbnRQYXRoOiBudWxsLAogICAgICAgICAgICBwYXJlbnRPYmplY3Q6IG51bGwKICAgICAgICAgIH07CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgbiA9IGllLmxvb2t1cFBhdGgoZSwgeyBwYXJlbnQ6ICEwIH0pOwogICAgICAgICAgICAodC5wYXJlbnRFeGlzdHMgPSAhMCksCiAgICAgICAgICAgICAgKHQucGFyZW50UGF0aCA9IG4ucGF0aCksCiAgICAgICAgICAgICAgKHQucGFyZW50T2JqZWN0ID0gbi5ub2RlKSwKICAgICAgICAgICAgICAodC5uYW1lID0gWi5iYXNlbmFtZShlKSksCiAgICAgICAgICAgICAgKG4gPSBpZS5sb29rdXBQYXRoKGUsIHsgZm9sbG93OiAhciB9KSksCiAgICAgICAgICAgICAgKHQuZXhpc3RzID0gITApLAogICAgICAgICAgICAgICh0LnBhdGggPSBuLnBhdGgpLAogICAgICAgICAgICAgICh0Lm9iamVjdCA9IG4ubm9kZSksCiAgICAgICAgICAgICAgKHQubmFtZSA9IG4ubm9kZS5uYW1lKSwKICAgICAgICAgICAgICAodC5pc1Jvb3QgPSAnLycgPT09IG4ucGF0aCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHQuZXJyb3IgPSBlLmVycm5vOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfSwKICAgICAgICBjcmVhdGVQYXRoOiAoZSwgciwgdCwgbikgPT4gewogICAgICAgICAgZSA9ICdzdHJpbmcnID09IHR5cGVvZiBlID8gZSA6IGllLmdldFBhdGgoZSk7CiAgICAgICAgICBmb3IgKHZhciBvID0gci5zcGxpdCgnLycpLnJldmVyc2UoKTsgby5sZW5ndGg7ICkgewogICAgICAgICAgICB2YXIgaSA9IG8ucG9wKCk7CiAgICAgICAgICAgIGlmIChpKSB7CiAgICAgICAgICAgICAgdmFyIGEgPSBaLmpvaW4yKGUsIGkpOwogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZS5ta2RpcihhKTsKICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgICAgIGUgPSBhOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYTsKICAgICAgICB9LAogICAgICAgIGNyZWF0ZUZpbGU6IChlLCByLCB0LCBuLCBvKSA9PiB7CiAgICAgICAgICB2YXIgaSA9IFouam9pbjIoJ3N0cmluZycgPT0gdHlwZW9mIGUgPyBlIDogaWUuZ2V0UGF0aChlKSwgciksCiAgICAgICAgICAgIGEgPSBpZS5nZXRNb2RlKG4sIG8pOwogICAgICAgICAgcmV0dXJuIGllLmNyZWF0ZShpLCBhKTsKICAgICAgICB9LAogICAgICAgIGNyZWF0ZURhdGFGaWxlOiAoZSwgciwgdCwgbiwgbywgaSkgPT4gewogICAgICAgICAgdmFyIGEgPSByOwogICAgICAgICAgZSAmJiAoKGUgPSAnc3RyaW5nJyA9PSB0eXBlb2YgZSA/IGUgOiBpZS5nZXRQYXRoKGUpKSwgKGEgPSByID8gWi5qb2luMihlLCByKSA6IGUpKTsKICAgICAgICAgIHZhciBzID0gaWUuZ2V0TW9kZShuLCBvKSwKICAgICAgICAgICAgdSA9IGllLmNyZWF0ZShhLCBzKTsKICAgICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIGlmICgnc3RyaW5nJyA9PSB0eXBlb2YgdCkgewogICAgICAgICAgICAgIGZvciAodmFyIGwgPSBuZXcgQXJyYXkodC5sZW5ndGgpLCBjID0gMCwgZCA9IHQubGVuZ3RoOyBjIDwgZDsgKytjKSBsW2NdID0gdC5jaGFyQ29kZUF0KGMpOwogICAgICAgICAgICAgIHQgPSBsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGllLmNobW9kKHUsIDE0NiB8IHMpOwogICAgICAgICAgICB2YXIgZiA9IGllLm9wZW4odSwgNTc3KTsKICAgICAgICAgICAgaWUud3JpdGUoZiwgdCwgMCwgdC5sZW5ndGgsIDAsIGkpLCBpZS5jbG9zZShmKSwgaWUuY2htb2QodSwgcyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdTsKICAgICAgICB9LAogICAgICAgIGNyZWF0ZURldmljZTogKGUsIHIsIHQsIG4pID0+IHsKICAgICAgICAgIHZhciBvID0gWi5qb2luMignc3RyaW5nJyA9PSB0eXBlb2YgZSA/IGUgOiBpZS5nZXRQYXRoKGUpLCByKSwKICAgICAgICAgICAgaSA9IGllLmdldE1vZGUoISF0LCAhIW4pOwogICAgICAgICAgaWUuY3JlYXRlRGV2aWNlLm1ham9yIHx8IChpZS5jcmVhdGVEZXZpY2UubWFqb3IgPSA2NCk7CiAgICAgICAgICB2YXIgYSA9IGllLm1ha2VkZXYoaWUuY3JlYXRlRGV2aWNlLm1ham9yKyssIDApOwogICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgaWUucmVnaXN0ZXJEZXZpY2UoYSwgewogICAgICAgICAgICAgIG9wZW46IChlKSA9PiB7CiAgICAgICAgICAgICAgICBlLnNlZWthYmxlID0gITE7CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBjbG9zZTogKGUpID0+IHsKICAgICAgICAgICAgICAgIG4gJiYgbi5idWZmZXIgJiYgbi5idWZmZXIubGVuZ3RoICYmIG4oMTApOwogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgcmVhZDogKGUsIHIsIG4sIG8sIGkpID0+IHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGEgPSAwLCBzID0gMDsgcyA8IG87IHMrKykgewogICAgICAgICAgICAgICAgICB2YXIgdTsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB1ID0gdCgpOwogICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoMjkpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IHUgJiYgMCA9PT0gYSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNik7CiAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IHUpIGJyZWFrOwogICAgICAgICAgICAgICAgICBhKyssIChyW24gKyBzXSA9IHUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGEgJiYgKGUubm9kZS50aW1lc3RhbXAgPSBEYXRlLm5vdygpKSwgYTsKICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIHdyaXRlOiAoZSwgciwgdCwgbywgaSkgPT4gewogICAgICAgICAgICAgICAgZm9yICh2YXIgYSA9IDA7IGEgPCBvOyBhKyspCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbihyW3QgKyBhXSk7CiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgaWUuRXJybm9FcnJvcigyOSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvICYmIChlLm5vZGUudGltZXN0YW1wID0gRGF0ZS5ub3coKSksIGE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgaWUubWtkZXYobywgaSwgYSkKICAgICAgICAgICk7CiAgICAgICAgfSwKICAgICAgICBmb3JjZUxvYWRGaWxlOiAoZSkgPT4gewogICAgICAgICAgaWYgKGUuaXNEZXZpY2UgfHwgZS5pc0ZvbGRlciB8fCBlLmxpbmsgfHwgZS5jb250ZW50cykgcmV0dXJuICEwOwogICAgICAgICAgaWYgKCd1bmRlZmluZWQnICE9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICAgICAgICdMYXp5IGxvYWRpbmcgc2hvdWxkIGhhdmUgYmVlbiBwZXJmb3JtZWQgKGNvbnRlbnRzIHNldCkgaW4gY3JlYXRlTGF6eUZpbGUsIGJ1dCBpdCB3YXMgbm90LiBMYXp5IGxvYWRpbmcgb25seSB3b3JrcyBpbiB3ZWIgd29ya2Vycy4gVXNlIC0tZW1iZWQtZmlsZSBvciAtLXByZWxvYWQtZmlsZSBpbiBlbWNjIG9uIHRoZSBtYWluIHRocmVhZC4nCiAgICAgICAgICAgICk7CiAgICAgICAgICBpZiAoIWEpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgd2l0aG91dCByZWFkKCkgb3IgWE1MSHR0cFJlcXVlc3QuJyk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICAoZS5jb250ZW50cyA9IGVlKGEoZS51cmwpLCAhMCkpLCAoZS51c2VkQnl0ZXMgPSBlLmNvbnRlbnRzLmxlbmd0aCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDI5KTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNyZWF0ZUxhenlGaWxlOiAoZSwgciwgdCwgbiwgbykgPT4gewogICAgICAgICAgZnVuY3Rpb24gaSgpIHsKICAgICAgICAgICAgKHRoaXMubGVuZ3RoS25vd24gPSAhMSksICh0aGlzLmNodW5rcyA9IFtdKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICgKICAgICAgICAgICAgKChpLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIGlmICghKGUgPiB0aGlzLmxlbmd0aCAtIDEgfHwgZSA8IDApKSB7CiAgICAgICAgICAgICAgICB2YXIgciA9IGUgJSB0aGlzLmNodW5rU2l6ZSwKICAgICAgICAgICAgICAgICAgdCA9IChlIC8gdGhpcy5jaHVua1NpemUpIHwgMDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldHRlcih0KVtyXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICAoaS5wcm90b3R5cGUuc2V0RGF0YUdldHRlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgdGhpcy5nZXR0ZXIgPSBlOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgKGkucHJvdG90eXBlLmNhY2hlTGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIHZhciBlID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgaWYgKChlLm9wZW4oJ0hFQUQnLCB0LCAhMSksIGUuc2VuZChudWxsKSwgISgoZS5zdGF0dXMgPj0gMjAwICYmIGUuc3RhdHVzIDwgMzAwKSB8fCAzMDQgPT09IGUuc3RhdHVzKSkpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGxvYWQgIiArIHQgKyAnLiBTdGF0dXM6ICcgKyBlLnN0YXR1cyk7CiAgICAgICAgICAgICAgdmFyIHIsCiAgICAgICAgICAgICAgICBuID0gTnVtYmVyKGUuZ2V0UmVzcG9uc2VIZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJykpLAogICAgICAgICAgICAgICAgbyA9IChyID0gZS5nZXRSZXNwb25zZUhlYWRlcignQWNjZXB0LVJhbmdlcycpKSAmJiAnYnl0ZXMnID09PSByLAogICAgICAgICAgICAgICAgaSA9IChyID0gZS5nZXRSZXNwb25zZUhlYWRlcignQ29udGVudC1FbmNvZGluZycpKSAmJiAnZ3ppcCcgPT09IHIsCiAgICAgICAgICAgICAgICBhID0gMTA0ODU3NjsKICAgICAgICAgICAgICBvIHx8IChhID0gbik7CiAgICAgICAgICAgICAgdmFyIHMgPSB0aGlzOwogICAgICAgICAgICAgIHMuc2V0RGF0YUdldHRlcigoZSkgPT4gewogICAgICAgICAgICAgICAgdmFyIHIgPSBlICogYSwKICAgICAgICAgICAgICAgICAgbyA9IChlICsgMSkgKiBhIC0gMTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgKChvID0gTWF0aC5taW4obywgbiAtIDEpKSwKICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBzLmNodW5rc1tlXSAmJgogICAgICAgICAgICAgICAgICAgIChzLmNodW5rc1tlXSA9ICgoZSwgcikgPT4gewogICAgICAgICAgICAgICAgICAgICAgaWYgKGUgPiByKSB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmFuZ2UgKCcgKyBlICsgJywgJyArIHIgKyAnKSBvciBubyBieXRlcyByZXF1ZXN0ZWQhJyk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAociA+IG4gLSAxKSB0aHJvdyBuZXcgRXJyb3IoJ29ubHkgJyArIG4gKyAnIGJ5dGVzIGF2YWlsYWJsZSEgcHJvZ3JhbW1lciBlcnJvciEnKTsKICAgICAgICAgICAgICAgICAgICAgIHZhciBvID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIChvLm9wZW4oJ0dFVCcsIHQsICExKSwKICAgICAgICAgICAgICAgICAgICAgICAgbiAhPT0gYSAmJiBvLnNldFJlcXVlc3RIZWFkZXIoJ1JhbmdlJywgJ2J5dGVzPScgKyBlICsgJy0nICsgciksCiAgICAgICAgICAgICAgICAgICAgICAgIChvLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcicpLAogICAgICAgICAgICAgICAgICAgICAgICBvLm92ZXJyaWRlTWltZVR5cGUgJiYgby5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L3BsYWluOyBjaGFyc2V0PXgtdXNlci1kZWZpbmVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIG8uc2VuZChudWxsKSwKICAgICAgICAgICAgICAgICAgICAgICAgISgoby5zdGF0dXMgPj0gMjAwICYmIG8uc3RhdHVzIDwgMzAwKSB8fCAzMDQgPT09IG8uc3RhdHVzKSkKICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDb3VsZG4ndCBsb2FkICIgKyB0ICsgJy4gU3RhdHVzOiAnICsgby5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gby5yZXNwb25zZSA/IG5ldyBVaW50OEFycmF5KG8ucmVzcG9uc2UgfHwgW10pIDogZWUoby5yZXNwb25zZVRleHQgfHwgJycsICEwKTsKICAgICAgICAgICAgICAgICAgICB9KShyLCBvKSksCiAgICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gcy5jaHVua3NbZV0pCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9YSFIgZmFpbGVkIScpOwogICAgICAgICAgICAgICAgcmV0dXJuIHMuY2h1bmtzW2VdOwogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKCFpICYmIG4pIHx8CiAgICAgICAgICAgICAgICAgICgoYSA9IG4gPSAxKSwKICAgICAgICAgICAgICAgICAgKG4gPSB0aGlzLmdldHRlcigwKS5sZW5ndGgpLAogICAgICAgICAgICAgICAgICAoYSA9IG4pLAogICAgICAgICAgICAgICAgICB3KCdMYXp5RmlsZXMgb24gZ3ppcCBmb3JjZXMgZG93bmxvYWQgb2YgdGhlIHdob2xlIGZpbGUgd2hlbiBsZW5ndGggaXMgYWNjZXNzZWQnKSksCiAgICAgICAgICAgICAgICAodGhpcy5fbGVuZ3RoID0gbiksCiAgICAgICAgICAgICAgICAodGhpcy5fY2h1bmtTaXplID0gYSksCiAgICAgICAgICAgICAgICAodGhpcy5sZW5ndGhLbm93biA9ICEwKTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgICd1bmRlZmluZWQnICE9IHR5cGVvZiBYTUxIdHRwUmVxdWVzdCkKICAgICAgICAgICkgewogICAgICAgICAgICBpZiAoIWgpCiAgICAgICAgICAgICAgdGhyb3cgJ0Nhbm5vdCBkbyBzeW5jaHJvbm91cyBiaW5hcnkgWEhScyBvdXRzaWRlIHdlYndvcmtlcnMgaW4gbW9kZXJuIGJyb3dzZXJzLiBVc2UgLS1lbWJlZC1maWxlIG9yIC0tcHJlbG9hZC1maWxlIGluIGVtY2MnOwogICAgICAgICAgICB2YXIgYSA9IG5ldyBpKCk7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGEsIHsKICAgICAgICAgICAgICBsZW5ndGg6IHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGhLbm93biB8fCB0aGlzLmNhY2hlTGVuZ3RoKCksIHRoaXMuX2xlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgIGNodW5rU2l6ZTogewogICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aEtub3duIHx8IHRoaXMuY2FjaGVMZW5ndGgoKSwgdGhpcy5fY2h1bmtTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBzID0geyBpc0RldmljZTogITEsIGNvbnRlbnRzOiBhIH07CiAgICAgICAgICB9IGVsc2UgcyA9IHsgaXNEZXZpY2U6ICExLCB1cmw6IHQgfTsKICAgICAgICAgIHZhciB1ID0gaWUuY3JlYXRlRmlsZShlLCByLCBzLCBuLCBvKTsKICAgICAgICAgIHMuY29udGVudHMgPyAodS5jb250ZW50cyA9IHMuY29udGVudHMpIDogcy51cmwgJiYgKCh1LmNvbnRlbnRzID0gbnVsbCksICh1LnVybCA9IHMudXJsKSksCiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHUsIHsKICAgICAgICAgICAgICB1c2VkQnl0ZXM6IHsKICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50cy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBsID0ge307CiAgICAgICAgICBmdW5jdGlvbiBjKGUsIHIsIHQsIG4sIG8pIHsKICAgICAgICAgICAgdmFyIGkgPSBlLm5vZGUuY29udGVudHM7CiAgICAgICAgICAgIGlmIChvID49IGkubGVuZ3RoKSByZXR1cm4gMDsKICAgICAgICAgICAgdmFyIGEgPSBNYXRoLm1pbihpLmxlbmd0aCAtIG8sIG4pOwogICAgICAgICAgICBpZiAoaS5zbGljZSkgZm9yICh2YXIgcyA9IDA7IHMgPCBhOyBzKyspIHJbdCArIHNdID0gaVtvICsgc107CiAgICAgICAgICAgIGVsc2UgZm9yIChzID0gMDsgcyA8IGE7IHMrKykgclt0ICsgc10gPSBpLmdldChvICsgcyk7CiAgICAgICAgICAgIHJldHVybiBhOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgT2JqZWN0LmtleXModS5zdHJlYW1fb3BzKS5mb3JFYWNoKChlKSA9PiB7CiAgICAgICAgICAgICAgdmFyIHIgPSB1LnN0cmVhbV9vcHNbZV07CiAgICAgICAgICAgICAgbFtlXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZS5mb3JjZUxvYWRGaWxlKHUpLCByLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIChsLnJlYWQgPSAoZSwgciwgdCwgbiwgbykgPT4gKGllLmZvcmNlTG9hZEZpbGUodSksIGMoZSwgciwgdCwgbiwgbykpKSwKICAgICAgICAgICAgKGwubW1hcCA9IChlLCByLCB0LCBuLCBvKSA9PiB7CiAgICAgICAgICAgICAgaWUuZm9yY2VMb2FkRmlsZSh1KTsKICAgICAgICAgICAgICB2YXIgaSA9IHRlKHIpOwogICAgICAgICAgICAgIGlmICghaSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNDgpOwogICAgICAgICAgICAgIHJldHVybiBjKGUsIGssIGksIHIsIHQpLCB7IHB0cjogaSwgYWxsb2NhdGVkOiAhMCB9OwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgKHUuc3RyZWFtX29wcyA9IGwpLAogICAgICAgICAgICB1CiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICAgY3JlYXRlUHJlbG9hZGVkRmlsZTogKGUsIHIsIHQsIG4sIG8sIGksIGEsIHMsIHUsIGwpID0+IHsKICAgICAgICAgIHZhciBjID0gciA/IFEucmVzb2x2ZShaLmpvaW4yKGUsIHIpKSA6IGU7CiAgICAgICAgICBxKCdjcCAnICsgYyk7CiAgICAgICAgICBmdW5jdGlvbiBkKHQpIHsKICAgICAgICAgICAgZnVuY3Rpb24gZCh0KSB7CiAgICAgICAgICAgICAgbCAmJiBsKCksIHMgfHwgaWUuY3JlYXRlRGF0YUZpbGUoZSwgciwgdCwgbiwgbywgdSksIGkgJiYgaSgpLCBHKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQnJvd3Nlci5oYW5kbGVkQnlQcmVsb2FkUGx1Z2luKHQsIGMsIGQsICgpID0+IHsKICAgICAgICAgICAgICBhICYmIGEoKSwgRygpOwogICAgICAgICAgICB9KSB8fCBkKHQpOwogICAgICAgICAgfQogICAgICAgICAgWCgpLCAnc3RyaW5nJyA9PSB0eXBlb2YgdCA/IG9lKHQsIChlKSA9PiBkKGUpLCBhKSA6IGQodCk7CiAgICAgICAgfSwKICAgICAgICBpbmRleGVkREI6ICgpID0+IHdpbmRvdy5pbmRleGVkREIgfHwgd2luZG93Lm1vekluZGV4ZWREQiB8fCB3aW5kb3cud2Via2l0SW5kZXhlZERCIHx8IHdpbmRvdy5tc0luZGV4ZWREQiwKICAgICAgICBEQl9OQU1FOiAoKSA9PiAnRU1fRlNfJyArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKICAgICAgICBEQl9WRVJTSU9OOiAyMCwKICAgICAgICBEQl9TVE9SRV9OQU1FOiAnRklMRV9EQVRBJywKICAgICAgICBzYXZlRmlsZXNUb0RCOiAoZSwgciwgdCkgPT4gewogICAgICAgICAgKHIgPSByIHx8ICgoKSA9PiB7fSkpLCAodCA9IHQgfHwgKCgpID0+IHt9KSk7CiAgICAgICAgICB2YXIgbiA9IGllLmluZGV4ZWREQigpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIG8gPSBuLm9wZW4oaWUuREJfTkFNRSgpLCBpZS5EQl9WRVJTSU9OKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmV0dXJuIHQoZSk7CiAgICAgICAgICB9CiAgICAgICAgICAoby5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7CiAgICAgICAgICAgIHcoJ2NyZWF0aW5nIGRiJyksIG8ucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKGllLkRCX1NUT1JFX05BTUUpOwogICAgICAgICAgfSksCiAgICAgICAgICAgIChvLm9uc3VjY2VzcyA9ICgpID0+IHsKICAgICAgICAgICAgICB2YXIgbiA9IG8ucmVzdWx0LnRyYW5zYWN0aW9uKFtpZS5EQl9TVE9SRV9OQU1FXSwgJ3JlYWR3cml0ZScpLAogICAgICAgICAgICAgICAgaSA9IG4ub2JqZWN0U3RvcmUoaWUuREJfU1RPUkVfTkFNRSksCiAgICAgICAgICAgICAgICBhID0gMCwKICAgICAgICAgICAgICAgIHMgPSAwLAogICAgICAgICAgICAgICAgdSA9IGUubGVuZ3RoOwogICAgICAgICAgICAgIGZ1bmN0aW9uIGwoKSB7CiAgICAgICAgICAgICAgICAwID09IHMgPyByKCkgOiB0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGUuZm9yRWFjaCgoZSkgPT4gewogICAgICAgICAgICAgICAgdmFyIHIgPSBpLnB1dChpZS5hbmFseXplUGF0aChlKS5vYmplY3QuY29udGVudHMsIGUpOwogICAgICAgICAgICAgICAgKHIub25zdWNjZXNzID0gKCkgPT4gewogICAgICAgICAgICAgICAgICArK2EgKyBzID09IHUgJiYgbCgpOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAgIChyLm9uZXJyb3IgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgYSArICsrcyA9PSB1ICYmIGwoKTsKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAobi5vbmVycm9yID0gdCk7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICAoby5vbmVycm9yID0gdCk7CiAgICAgICAgfSwKICAgICAgICBsb2FkRmlsZXNGcm9tREI6IChlLCByLCB0KSA9PiB7CiAgICAgICAgICAociA9IHIgfHwgKCgpID0+IHt9KSksICh0ID0gdCB8fCAoKCkgPT4ge30pKTsKICAgICAgICAgIHZhciBuID0gaWUuaW5kZXhlZERCKCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgbyA9IG4ub3BlbihpZS5EQl9OQU1FKCksIGllLkRCX1ZFUlNJT04pOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gdChlKTsKICAgICAgICAgIH0KICAgICAgICAgIChvLm9udXBncmFkZW5lZWRlZCA9IHQpLAogICAgICAgICAgICAoby5vbnN1Y2Nlc3MgPSAoKSA9PiB7CiAgICAgICAgICAgICAgdmFyIG4gPSBvLnJlc3VsdDsKICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIGkgPSBuLnRyYW5zYWN0aW9uKFtpZS5EQl9TVE9SRV9OQU1FXSwgJ3JlYWRvbmx5Jyk7CiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHZvaWQgdChlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGEgPSBpLm9iamVjdFN0b3JlKGllLkRCX1NUT1JFX05BTUUpLAogICAgICAgICAgICAgICAgcyA9IDAsCiAgICAgICAgICAgICAgICB1ID0gMCwKICAgICAgICAgICAgICAgIGwgPSBlLmxlbmd0aDsKICAgICAgICAgICAgICBmdW5jdGlvbiBjKCkgewogICAgICAgICAgICAgICAgMCA9PSB1ID8gcigpIDogdCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlLmZvckVhY2goKGUpID0+IHsKICAgICAgICAgICAgICAgIHZhciByID0gYS5nZXQoZSk7CiAgICAgICAgICAgICAgICAoci5vbnN1Y2Nlc3MgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgIGllLmFuYWx5emVQYXRoKGUpLmV4aXN0cyAmJiBpZS51bmxpbmsoZSksCiAgICAgICAgICAgICAgICAgICAgaWUuY3JlYXRlRGF0YUZpbGUoWi5kaXJuYW1lKGUpLCBaLmJhc2VuYW1lKGUpLCByLnJlc3VsdCwgITAsICEwLCAhMCksCiAgICAgICAgICAgICAgICAgICAgKytzICsgdSA9PSBsICYmIGMoKTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAoci5vbmVycm9yID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHMgKyArK3UgPT0gbCAmJiBjKCk7CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKGkub25lcnJvciA9IHQpOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgKG8ub25lcnJvciA9IHQpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgYWUgPSB7CiAgICAgICAgREVGQVVMVF9QT0xMTUFTSzogNSwKICAgICAgICBjYWxjdWxhdGVBdDogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIGlmIChaLmlzQWJzKHIpKSByZXR1cm4gcjsKICAgICAgICAgIHZhciBuOwogICAgICAgICAgLTEwMCA9PT0gZSA/IChuID0gaWUuY3dkKCkpIDogKG4gPSBhZS5nZXRTdHJlYW1Gcm9tRkQoZSkucGF0aCk7CiAgICAgICAgICBpZiAoMCA9PSByLmxlbmd0aCkgewogICAgICAgICAgICBpZiAoIXQpIHRocm93IG5ldyBpZS5FcnJub0Vycm9yKDQ0KTsKICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gWi5qb2luMihuLCByKTsKICAgICAgICB9LAogICAgICAgIGRvU3RhdDogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciBuID0gZShyKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKGUgJiYgZS5ub2RlICYmIFoubm9ybWFsaXplKHIpICE9PSBaLm5vcm1hbGl6ZShpZS5nZXRQYXRoKGUubm9kZSkpKSByZXR1cm4gLTU0OwogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgfQogICAgICAgICAgKFNbdCA+PiAyXSA9IG4uZGV2KSwKICAgICAgICAgICAgKFNbKHQgKyA4KSA+PiAyXSA9IG4uaW5vKSwKICAgICAgICAgICAgKFNbKHQgKyAxMikgPj4gMl0gPSBuLm1vZGUpLAogICAgICAgICAgICAoRlsodCArIDE2KSA+PiAyXSA9IG4ubmxpbmspLAogICAgICAgICAgICAoU1sodCArIDIwKSA+PiAyXSA9IG4udWlkKSwKICAgICAgICAgICAgKFNbKHQgKyAyNCkgPj4gMl0gPSBuLmdpZCksCiAgICAgICAgICAgIChTWyh0ICsgMjgpID4+IDJdID0gbi5yZGV2KSwKICAgICAgICAgICAgKEggPSBbCiAgICAgICAgICAgICAgbi5zaXplID4+PiAwLAogICAgICAgICAgICAgICgoTCA9IG4uc2l6ZSksCiAgICAgICAgICAgICAgK01hdGguYWJzKEwpID49IDEKICAgICAgICAgICAgICAgID8gTCA+IDAKICAgICAgICAgICAgICAgICAgPyAoMCB8IE1hdGgubWluKCtNYXRoLmZsb29yKEwgLyA0Mjk0OTY3Mjk2KSwgNDI5NDk2NzI5NSkpID4+PiAwCiAgICAgICAgICAgICAgICAgIDogfn4rTWF0aC5jZWlsKChMIC0gKyh+fkwgPj4+IDApKSAvIDQyOTQ5NjcyOTYpID4+PiAwCiAgICAgICAgICAgICAgICA6IDApCiAgICAgICAgICAgIF0pLAogICAgICAgICAgICAoU1sodCArIDQwKSA+PiAyXSA9IEhbMF0pLAogICAgICAgICAgICAoU1sodCArIDQ0KSA+PiAyXSA9IEhbMV0pLAogICAgICAgICAgICAoU1sodCArIDQ4KSA+PiAyXSA9IDQwOTYpLAogICAgICAgICAgICAoU1sodCArIDUyKSA+PiAyXSA9IG4uYmxvY2tzKTsKICAgICAgICAgIHZhciBvID0gbi5hdGltZS5nZXRUaW1lKCksCiAgICAgICAgICAgIGkgPSBuLm10aW1lLmdldFRpbWUoKSwKICAgICAgICAgICAgYSA9IG4uY3RpbWUuZ2V0VGltZSgpOwogICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgKEggPSBbCiAgICAgICAgICAgICAgTWF0aC5mbG9vcihvIC8gMWUzKSA+Pj4gMCwKICAgICAgICAgICAgICAoKEwgPSBNYXRoLmZsb29yKG8gLyAxZTMpKSwKICAgICAgICAgICAgICArTWF0aC5hYnMoTCkgPj0gMQogICAgICAgICAgICAgICAgPyBMID4gMAogICAgICAgICAgICAgICAgICA/ICgwIHwgTWF0aC5taW4oK01hdGguZmxvb3IoTCAvIDQyOTQ5NjcyOTYpLCA0Mjk0OTY3Mjk1KSkgPj4+IDAKICAgICAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKEwgLSArKH5+TCA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgICAgIDogMCkKICAgICAgICAgICAgXSksCiAgICAgICAgICAgIChTWyh0ICsgNTYpID4+IDJdID0gSFswXSksCiAgICAgICAgICAgIChTWyh0ICsgNjApID4+IDJdID0gSFsxXSksCiAgICAgICAgICAgIChGWyh0ICsgNjQpID4+IDJdID0gKG8gJSAxZTMpICogMWUzKSwKICAgICAgICAgICAgKEggPSBbCiAgICAgICAgICAgICAgTWF0aC5mbG9vcihpIC8gMWUzKSA+Pj4gMCwKICAgICAgICAgICAgICAoKEwgPSBNYXRoLmZsb29yKGkgLyAxZTMpKSwKICAgICAgICAgICAgICArTWF0aC5hYnMoTCkgPj0gMQogICAgICAgICAgICAgICAgPyBMID4gMAogICAgICAgICAgICAgICAgICA/ICgwIHwgTWF0aC5taW4oK01hdGguZmxvb3IoTCAvIDQyOTQ5NjcyOTYpLCA0Mjk0OTY3Mjk1KSkgPj4+IDAKICAgICAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKEwgLSArKH5+TCA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgICAgIDogMCkKICAgICAgICAgICAgXSksCiAgICAgICAgICAgIChTWyh0ICsgNzIpID4+IDJdID0gSFswXSksCiAgICAgICAgICAgIChTWyh0ICsgNzYpID4+IDJdID0gSFsxXSksCiAgICAgICAgICAgIChGWyh0ICsgODApID4+IDJdID0gKGkgJSAxZTMpICogMWUzKSwKICAgICAgICAgICAgKEggPSBbCiAgICAgICAgICAgICAgTWF0aC5mbG9vcihhIC8gMWUzKSA+Pj4gMCwKICAgICAgICAgICAgICAoKEwgPSBNYXRoLmZsb29yKGEgLyAxZTMpKSwKICAgICAgICAgICAgICArTWF0aC5hYnMoTCkgPj0gMQogICAgICAgICAgICAgICAgPyBMID4gMAogICAgICAgICAgICAgICAgICA/ICgwIHwgTWF0aC5taW4oK01hdGguZmxvb3IoTCAvIDQyOTQ5NjcyOTYpLCA0Mjk0OTY3Mjk1KSkgPj4+IDAKICAgICAgICAgICAgICAgICAgOiB+fitNYXRoLmNlaWwoKEwgLSArKH5+TCA+Pj4gMCkpIC8gNDI5NDk2NzI5NikgPj4+IDAKICAgICAgICAgICAgICAgIDogMCkKICAgICAgICAgICAgXSksCiAgICAgICAgICAgIChTWyh0ICsgODgpID4+IDJdID0gSFswXSksCiAgICAgICAgICAgIChTWyh0ICsgOTIpID4+IDJdID0gSFsxXSksCiAgICAgICAgICAgIChGWyh0ICsgOTYpID4+IDJdID0gKGEgJSAxZTMpICogMWUzKSwKICAgICAgICAgICAgKEggPSBbCiAgICAgICAgICAgICAgbi5pbm8gPj4+IDAsCiAgICAgICAgICAgICAgKChMID0gbi5pbm8pLAogICAgICAgICAgICAgICtNYXRoLmFicyhMKSA+PSAxCiAgICAgICAgICAgICAgICA/IEwgPiAwCiAgICAgICAgICAgICAgICAgID8gKDAgfCBNYXRoLm1pbigrTWF0aC5mbG9vcihMIC8gNDI5NDk2NzI5NiksIDQyOTQ5NjcyOTUpKSA+Pj4gMAogICAgICAgICAgICAgICAgICA6IH5+K01hdGguY2VpbCgoTCAtICsofn5MID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICAgICAgOiAwKQogICAgICAgICAgICBdKSwKICAgICAgICAgICAgKFNbKHQgKyAxMDQpID4+IDJdID0gSFswXSksCiAgICAgICAgICAgIChTWyh0ICsgMTA4KSA+PiAyXSA9IEhbMV0pLAogICAgICAgICAgICAwCiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICAgZG9Nc3luYzogZnVuY3Rpb24gKGUsIHIsIHQsIG4sIG8pIHsKICAgICAgICAgIGlmICghaWUuaXNGaWxlKHIubm9kZS5tb2RlKSkgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoNDMpOwogICAgICAgICAgaWYgKDIgJiBuKSByZXR1cm4gMDsKICAgICAgICAgIHZhciBpID0gRC5zbGljZShlLCBlICsgdCk7CiAgICAgICAgICBpZS5tc3luYyhyLCBpLCBvLCB0LCBuKTsKICAgICAgICB9LAogICAgICAgIHZhcmFyZ3M6IHZvaWQgMCwKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiAoYWUudmFyYXJncyArPSA0KSwgU1soYWUudmFyYXJncyAtIDQpID4+IDJdOwogICAgICAgIH0sCiAgICAgICAgZ2V0U3RyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgcmV0dXJuIFAoZSk7CiAgICAgICAgfSwKICAgICAgICBnZXRTdHJlYW1Gcm9tRkQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICB2YXIgciA9IGllLmdldFN0cmVhbShlKTsKICAgICAgICAgIGlmICghcikgdGhyb3cgbmV3IGllLkVycm5vRXJyb3IoOCk7CiAgICAgICAgICByZXR1cm4gcjsKICAgICAgICB9CiAgICAgIH07CiAgICB2YXIgc2UgPQogICAgICAnVG8gdXNlIGRsb3BlbiwgeW91IG5lZWQgZW5hYmxlIGR5bmFtaWMgbGlua2luZywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbXNjcmlwdGVuLWNvcmUvZW1zY3JpcHRlbi93aWtpL0xpbmtpbmcnOwogICAgdmFyIHVlLAogICAgICBsZSA9ICEwOwogICAgZnVuY3Rpb24gY2UoZSkgewogICAgICB2YXIgciA9IHkuYnVmZmVyOwogICAgICB0cnkgewogICAgICAgIHJldHVybiB5Lmdyb3coKGUgLSByLmJ5dGVMZW5ndGggKyA2NTUzNSkgPj4+IDE2KSwgQygpLCAxOwogICAgICB9IGNhdGNoIChlKSB7fQogICAgfQogICAgdWUgPSAoKSA9PiBwZXJmb3JtYW5jZS5ub3coKTsKICAgIHZhciBkZSA9IHt9OwogICAgZnVuY3Rpb24gZmUoKSB7CiAgICAgIGlmICghZmUuc3RyaW5ncykgewogICAgICAgIHZhciBlID0gewogICAgICAgICAgVVNFUjogJ3dlYl91c2VyJywKICAgICAgICAgIExPR05BTUU6ICd3ZWJfdXNlcicsCiAgICAgICAgICBQQVRIOiAnLycsCiAgICAgICAgICBQV0Q6ICcvJywKICAgICAgICAgIEhPTUU6ICcvaG9tZS93ZWJfdXNlcicsCiAgICAgICAgICBMQU5HOgogICAgICAgICAgICAoKCdvYmplY3QnID09IHR5cGVvZiBuYXZpZ2F0b3IgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcyAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzWzBdKSB8fCAnQycpLnJlcGxhY2UoJy0nLCAnXycpICsKICAgICAgICAgICAgJy5VVEYtOCcsCiAgICAgICAgICBfOiBkIHx8ICcuL3RoaXMucHJvZ3JhbScKICAgICAgICB9OwogICAgICAgIGZvciAodmFyIHIgaW4gZGUpIHZvaWQgMCA9PT0gZGVbcl0gPyBkZWxldGUgZVtyXSA6IChlW3JdID0gZGVbcl0pOwogICAgICAgIHZhciB0ID0gW107CiAgICAgICAgZm9yICh2YXIgciBpbiBlKSB0LnB1c2gociArICc9JyArIGVbcl0pOwogICAgICAgIGZlLnN0cmluZ3MgPSB0OwogICAgICB9CiAgICAgIHJldHVybiBmZS5zdHJpbmdzOwogICAgfQogICAgZnVuY3Rpb24gbWUoZSkgewogICAgICAoRSA9IGUpLCBnIHx8IChpLm9uRXhpdCAmJiBpLm9uRXhpdChlKSwgKGIgPSAhMCkpLCBmKGUsIG5ldyBKKGUpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGhlKGUsIHIpIHsKICAgICAgKEUgPSBlKSwgbWUoZSk7CiAgICB9CiAgICB2YXIgcGUgPSBoZTsKICAgIGZ1bmN0aW9uIHdlKGUpIHsKICAgICAgcmV0dXJuIGUgJSA0ID09IDAgJiYgKGUgJSAxMDAgIT0gMCB8fCBlICUgNDAwID09IDApOwogICAgfQogICAgdmFyIHZlID0gWzMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdLAogICAgICBfZSA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTsKICAgIGZ1bmN0aW9uIHllKGUsIHIsIHQsIG4pIHsKICAgICAgdmFyIG8gPSBTWyhuICsgNDApID4+IDJdLAogICAgICAgIGkgPSB7CiAgICAgICAgICB0bV9zZWM6IFNbbiA+PiAyXSwKICAgICAgICAgIHRtX21pbjogU1sobiArIDQpID4+IDJdLAogICAgICAgICAgdG1faG91cjogU1sobiArIDgpID4+IDJdLAogICAgICAgICAgdG1fbWRheTogU1sobiArIDEyKSA+PiAyXSwKICAgICAgICAgIHRtX21vbjogU1sobiArIDE2KSA+PiAyXSwKICAgICAgICAgIHRtX3llYXI6IFNbKG4gKyAyMCkgPj4gMl0sCiAgICAgICAgICB0bV93ZGF5OiBTWyhuICsgMjQpID4+IDJdLAogICAgICAgICAgdG1feWRheTogU1sobiArIDI4KSA+PiAyXSwKICAgICAgICAgIHRtX2lzZHN0OiBTWyhuICsgMzIpID4+IDJdLAogICAgICAgICAgdG1fZ210b2ZmOiBTWyhuICsgMzYpID4+IDJdLAogICAgICAgICAgdG1fem9uZTogbyA/IFAobykgOiAnJwogICAgICAgIH0sCiAgICAgICAgYSA9IFAodCksCiAgICAgICAgcyA9IHsKICAgICAgICAgICclYyc6ICclYSAlYiAlZCAlSDolTTolUyAlWScsCiAgICAgICAgICAnJUQnOiAnJW0vJWQvJXknLAogICAgICAgICAgJyVGJzogJyVZLSVtLSVkJywKICAgICAgICAgICclaCc6ICclYicsCiAgICAgICAgICAnJXInOiAnJUk6JU06JVMgJXAnLAogICAgICAgICAgJyVSJzogJyVIOiVNJywKICAgICAgICAgICclVCc6ICclSDolTTolUycsCiAgICAgICAgICAnJXgnOiAnJW0vJWQvJXknLAogICAgICAgICAgJyVYJzogJyVIOiVNOiVTJywKICAgICAgICAgICclRWMnOiAnJWMnLAogICAgICAgICAgJyVFQyc6ICclQycsCiAgICAgICAgICAnJUV4JzogJyVtLyVkLyV5JywKICAgICAgICAgICclRVgnOiAnJUg6JU06JVMnLAogICAgICAgICAgJyVFeSc6ICcleScsCiAgICAgICAgICAnJUVZJzogJyVZJywKICAgICAgICAgICclT2QnOiAnJWQnLAogICAgICAgICAgJyVPZSc6ICclZScsCiAgICAgICAgICAnJU9IJzogJyVIJywKICAgICAgICAgICclT0knOiAnJUknLAogICAgICAgICAgJyVPbSc6ICclbScsCiAgICAgICAgICAnJU9NJzogJyVNJywKICAgICAgICAgICclT1MnOiAnJVMnLAogICAgICAgICAgJyVPdSc6ICcldScsCiAgICAgICAgICAnJU9VJzogJyVVJywKICAgICAgICAgICclT1YnOiAnJVYnLAogICAgICAgICAgJyVPdyc6ICcldycsCiAgICAgICAgICAnJU9XJzogJyVXJywKICAgICAgICAgICclT3knOiAnJXknCiAgICAgICAgfTsKICAgICAgZm9yICh2YXIgdSBpbiBzKSBhID0gYS5yZXBsYWNlKG5ldyBSZWdFeHAodSwgJ2cnKSwgc1t1XSk7CiAgICAgIHZhciBsID0gWydTdW5kYXknLCAnTW9uZGF5JywgJ1R1ZXNkYXknLCAnV2VkbmVzZGF5JywgJ1RodXJzZGF5JywgJ0ZyaWRheScsICdTYXR1cmRheSddLAogICAgICAgIGMgPSBbCiAgICAgICAgICAnSmFudWFyeScsCiAgICAgICAgICAnRmVicnVhcnknLAogICAgICAgICAgJ01hcmNoJywKICAgICAgICAgICdBcHJpbCcsCiAgICAgICAgICAnTWF5JywKICAgICAgICAgICdKdW5lJywKICAgICAgICAgICdKdWx5JywKICAgICAgICAgICdBdWd1c3QnLAogICAgICAgICAgJ1NlcHRlbWJlcicsCiAgICAgICAgICAnT2N0b2JlcicsCiAgICAgICAgICAnTm92ZW1iZXInLAogICAgICAgICAgJ0RlY2VtYmVyJwogICAgICAgIF07CiAgICAgIGZ1bmN0aW9uIGQoZSwgciwgdCkgewogICAgICAgIGZvciAodmFyIG4gPSAnbnVtYmVyJyA9PSB0eXBlb2YgZSA/IGUudG9TdHJpbmcoKSA6IGUgfHwgJyc7IG4ubGVuZ3RoIDwgcjsgKSBuID0gdFswXSArIG47CiAgICAgICAgcmV0dXJuIG47CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZihlLCByKSB7CiAgICAgICAgcmV0dXJuIGQoZSwgciwgJzAnKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBtKGUsIHIpIHsKICAgICAgICBmdW5jdGlvbiB0KGUpIHsKICAgICAgICAgIHJldHVybiBlIDwgMCA/IC0xIDogZSA+IDAgPyAxIDogMDsKICAgICAgICB9CiAgICAgICAgdmFyIG47CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgIDAgPT09IChuID0gdChlLmdldEZ1bGxZZWFyKCkgLSByLmdldEZ1bGxZZWFyKCkpKSAmJgogICAgICAgICAgICAwID09PSAobiA9IHQoZS5nZXRNb250aCgpIC0gci5nZXRNb250aCgpKSkgJiYKICAgICAgICAgICAgKG4gPSB0KGUuZ2V0RGF0ZSgpIC0gci5nZXREYXRlKCkpKSwKICAgICAgICAgIG4KICAgICAgICApOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGgoZSkgewogICAgICAgIHN3aXRjaCAoZS5nZXREYXkoKSkgewogICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpIC0gMSwgMTEsIDI5KTsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCksIDAsIDMpOwogICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpLCAwLCAyKTsKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7CiAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlLmdldEZ1bGxZZWFyKCkgLSAxLCAxMSwgMzEpOwogICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZS5nZXRGdWxsWWVhcigpIC0gMSwgMTEsIDMwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcChlKSB7CiAgICAgICAgdmFyIHIgPSAoZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgICAgZm9yICh2YXIgdCA9IG5ldyBEYXRlKGUuZ2V0VGltZSgpKTsgciA+IDA7ICkgewogICAgICAgICAgICAgIHZhciBuID0gd2UodC5nZXRGdWxsWWVhcigpKSwKICAgICAgICAgICAgICAgIG8gPSB0LmdldE1vbnRoKCksCiAgICAgICAgICAgICAgICBpID0gKG4gPyB2ZSA6IF9lKVtvXTsKICAgICAgICAgICAgICBpZiAoIShyID4gaSAtIHQuZ2V0RGF0ZSgpKSkgcmV0dXJuIHQuc2V0RGF0ZSh0LmdldERhdGUoKSArIHIpLCB0OwogICAgICAgICAgICAgIChyIC09IGkgLSB0LmdldERhdGUoKSArIDEpLAogICAgICAgICAgICAgICAgdC5zZXREYXRlKDEpLAogICAgICAgICAgICAgICAgbyA8IDExID8gdC5zZXRNb250aChvICsgMSkgOiAodC5zZXRNb250aCgwKSwgdC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkgKyAxKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICB9KShuZXcgRGF0ZShlLnRtX3llYXIgKyAxOTAwLCAwLCAxKSwgZS50bV95ZGF5KSwKICAgICAgICAgIHQgPSBuZXcgRGF0ZShyLmdldEZ1bGxZZWFyKCksIDAsIDQpLAogICAgICAgICAgbiA9IG5ldyBEYXRlKHIuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDQpLAogICAgICAgICAgbyA9IGgodCksCiAgICAgICAgICBpID0gaChuKTsKICAgICAgICByZXR1cm4gbShvLCByKSA8PSAwID8gKG0oaSwgcikgPD0gMCA/IHIuZ2V0RnVsbFllYXIoKSArIDEgOiByLmdldEZ1bGxZZWFyKCkpIDogci5nZXRGdWxsWWVhcigpIC0gMTsKICAgICAgfQogICAgICB2YXIgdyA9IHsKICAgICAgICAnJWEnOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgcmV0dXJuIGxbZS50bV93ZGF5XS5zdWJzdHJpbmcoMCwgMyk7CiAgICAgICAgfSwKICAgICAgICAnJUEnOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgcmV0dXJuIGxbZS50bV93ZGF5XTsKICAgICAgICB9LAogICAgICAgICclYic6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICByZXR1cm4gY1tlLnRtX21vbl0uc3Vic3RyaW5nKDAsIDMpOwogICAgICAgIH0sCiAgICAgICAgJyVCJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBjW2UudG1fbW9uXTsKICAgICAgICB9LAogICAgICAgICclQyc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICByZXR1cm4gZigoKGUudG1feWVhciArIDE5MDApIC8gMTAwKSB8IDAsIDIpOwogICAgICAgIH0sCiAgICAgICAgJyVkJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBmKGUudG1fbWRheSwgMik7CiAgICAgICAgfSwKICAgICAgICAnJWUnOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgcmV0dXJuIGQoZS50bV9tZGF5LCAyLCAnICcpOwogICAgICAgIH0sCiAgICAgICAgJyVnJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBwKGUpLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpOwogICAgICAgIH0sCiAgICAgICAgJyVHJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBwKGUpOwogICAgICAgIH0sCiAgICAgICAgJyVIJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBmKGUudG1faG91ciwgMik7CiAgICAgICAgfSwKICAgICAgICAnJUknOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgdmFyIHIgPSBlLnRtX2hvdXI7CiAgICAgICAgICByZXR1cm4gMCA9PSByID8gKHIgPSAxMikgOiByID4gMTIgJiYgKHIgLT0gMTIpLCBmKHIsIDIpOwogICAgICAgIH0sCiAgICAgICAgJyVqJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBmKAogICAgICAgICAgICBlLnRtX21kYXkgKwogICAgICAgICAgICAgIChmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDAsIG4gPSAwOyBuIDw9IHI7IHQgKz0gZVtuKytdKTsKICAgICAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgICAgICAgIH0pKHdlKGUudG1feWVhciArIDE5MDApID8gdmUgOiBfZSwgZS50bV9tb24gLSAxKSwKICAgICAgICAgICAgMwogICAgICAgICAgKTsKICAgICAgICB9LAogICAgICAgICclbSc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICByZXR1cm4gZihlLnRtX21vbiArIDEsIDIpOwogICAgICAgIH0sCiAgICAgICAgJyVNJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBmKGUudG1fbWluLCAyKTsKICAgICAgICB9LAogICAgICAgICclbic6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiAnXG4nOwogICAgICAgIH0sCiAgICAgICAgJyVwJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBlLnRtX2hvdXIgPj0gMCAmJiBlLnRtX2hvdXIgPCAxMiA/ICdBTScgOiAnUE0nOwogICAgICAgIH0sCiAgICAgICAgJyVTJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBmKGUudG1fc2VjLCAyKTsKICAgICAgICB9LAogICAgICAgICcldCc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiAnXHQnOwogICAgICAgIH0sCiAgICAgICAgJyV1JzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBlLnRtX3dkYXkgfHwgNzsKICAgICAgICB9LAogICAgICAgICclVSc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICB2YXIgciA9IGUudG1feWRheSArIDcgLSBlLnRtX3dkYXk7CiAgICAgICAgICByZXR1cm4gZihNYXRoLmZsb29yKHIgLyA3KSwgMik7CiAgICAgICAgfSwKICAgICAgICAnJVYnOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgdmFyIHIgPSBNYXRoLmZsb29yKChlLnRtX3lkYXkgKyA3IC0gKChlLnRtX3dkYXkgKyA2KSAlIDcpKSAvIDcpOwogICAgICAgICAgaWYgKCgoZS50bV93ZGF5ICsgMzcxIC0gZS50bV95ZGF5IC0gMikgJSA3IDw9IDIgJiYgcisrLCByKSkgewogICAgICAgICAgICBpZiAoNTMgPT0gcikgewogICAgICAgICAgICAgIHZhciB0ID0gKGUudG1fd2RheSArIDM3MSAtIGUudG1feWRheSkgJSA3OwogICAgICAgICAgICAgIDQgPT0gdCB8fCAoMyA9PSB0ICYmIHdlKGUudG1feWVhcikpIHx8IChyID0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHIgPSA1MjsKICAgICAgICAgICAgdmFyIG4gPSAoZS50bV93ZGF5ICsgNyAtIGUudG1feWRheSAtIDEpICUgNzsKICAgICAgICAgICAgKDQgPT0gbiB8fCAoNSA9PSBuICYmIHdlKChlLnRtX3llYXIgJSA0MDApIC0gMSkpKSAmJiByKys7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZihyLCAyKTsKICAgICAgICB9LAogICAgICAgICcldyc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICByZXR1cm4gZS50bV93ZGF5OwogICAgICAgIH0sCiAgICAgICAgJyVXJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHZhciByID0gZS50bV95ZGF5ICsgNyAtICgoZS50bV93ZGF5ICsgNikgJSA3KTsKICAgICAgICAgIHJldHVybiBmKE1hdGguZmxvb3IociAvIDcpLCAyKTsKICAgICAgICB9LAogICAgICAgICcleSc6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICByZXR1cm4gKGUudG1feWVhciArIDE5MDApLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDIpOwogICAgICAgIH0sCiAgICAgICAgJyVZJzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHJldHVybiBlLnRtX3llYXIgKyAxOTAwOwogICAgICAgIH0sCiAgICAgICAgJyV6JzogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgIHZhciByID0gZS50bV9nbXRvZmYsCiAgICAgICAgICAgIHQgPSByID49IDA7CiAgICAgICAgICByZXR1cm4gKHIgPSAoKHIgPSBNYXRoLmFicyhyKSAvIDYwKSAvIDYwKSAqIDEwMCArIChyICUgNjApKSwgKHQgPyAnKycgOiAnLScpICsgU3RyaW5nKCcwMDAwJyArIHIpLnNsaWNlKC00KTsKICAgICAgICB9LAogICAgICAgICclWic6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICByZXR1cm4gZS50bV96b25lOwogICAgICAgIH0sCiAgICAgICAgJyUlJzogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuICclJzsKICAgICAgICB9CiAgICAgIH07CiAgICAgIGZvciAodmFyIHUgaW4gKChhID0gYS5yZXBsYWNlKC8lJS9nLCAnXDBcMCcpKSwgdykpIGEuaW5jbHVkZXModSkgJiYgKGEgPSBhLnJlcGxhY2UobmV3IFJlZ0V4cCh1LCAnZycpLCB3W3VdKGkpKSk7CiAgICAgIHZhciB2LAogICAgICAgIF8sCiAgICAgICAgeSA9IGVlKChhID0gYS5yZXBsYWNlKC9cMFwwL2csICclJykpLCAhMSk7CiAgICAgIHJldHVybiB5Lmxlbmd0aCA+IHIgPyAwIDogKCh2ID0geSksIChfID0gZSksIGsuc2V0KHYsIF8pLCB5Lmxlbmd0aCAtIDEpOwogICAgfQogICAgdmFyIGdlID0gZnVuY3Rpb24gKGUsIHIsIHQsIG4pIHsKICAgICAgZSB8fCAoZSA9IHRoaXMpLAogICAgICAgICh0aGlzLnBhcmVudCA9IGUpLAogICAgICAgICh0aGlzLm1vdW50ID0gZS5tb3VudCksCiAgICAgICAgKHRoaXMubW91bnRlZCA9IG51bGwpLAogICAgICAgICh0aGlzLmlkID0gaWUubmV4dElub2RlKyspLAogICAgICAgICh0aGlzLm5hbWUgPSByKSwKICAgICAgICAodGhpcy5tb2RlID0gdCksCiAgICAgICAgKHRoaXMubm9kZV9vcHMgPSB7fSksCiAgICAgICAgKHRoaXMuc3RyZWFtX29wcyA9IHt9KSwKICAgICAgICAodGhpcy5yZGV2ID0gbik7CiAgICB9OwogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZ2UucHJvdG90eXBlLCB7CiAgICAgIHJlYWQ6IHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiAzNjUgPT0gKDM2NSAmIHRoaXMubW9kZSk7CiAgICAgICAgfSwKICAgICAgICBzZXQ6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICBlID8gKHRoaXMubW9kZSB8PSAzNjUpIDogKHRoaXMubW9kZSAmPSAtMzY2KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHdyaXRlOiB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gMTQ2ID09ICgxNDYgJiB0aGlzLm1vZGUpOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgZSA/ICh0aGlzLm1vZGUgfD0gMTQ2KSA6ICh0aGlzLm1vZGUgJj0gLTE0Nyk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpc0ZvbGRlcjogewogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIGllLmlzRGlyKHRoaXMubW9kZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBpc0RldmljZTogewogICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIGllLmlzQ2hyZGV2KHRoaXMubW9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KSwKICAgICAgKGllLkZTTm9kZSA9IGdlKSwKICAgICAgaWUuc3RhdGljSW5pdCgpOwogICAgdmFyIEVlLAogICAgICBiZSA9IHsKICAgICAgICBfX2N4YV90aHJvdzogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIHRocm93ICgKICAgICAgICAgICAgKG5ldyAoZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAodGhpcy5leGNQdHIgPSBlKSwKICAgICAgICAgICAgICAgICh0aGlzLnB0ciA9IGUgLSAyNCksCiAgICAgICAgICAgICAgICAodGhpcy5zZXRfdHlwZSA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgIEZbKHRoaXMucHRyICsgNCkgPj4gMl0gPSBlOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAodGhpcy5nZXRfdHlwZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIEZbKHRoaXMucHRyICsgNCkgPj4gMl07CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICh0aGlzLnNldF9kZXN0cnVjdG9yID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgRlsodGhpcy5wdHIgKyA4KSA+PiAyXSA9IGU7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICh0aGlzLmdldF9kZXN0cnVjdG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gRlsodGhpcy5wdHIgKyA4KSA+PiAyXTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKHRoaXMuc2V0X3JlZmNvdW50ID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgU1t0aGlzLnB0ciA+PiAyXSA9IGU7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICh0aGlzLnNldF9jYXVnaHQgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAoZSA9IGUgPyAxIDogMCksIChrWyh0aGlzLnB0ciArIDEyKSA+PiAwXSA9IGUpOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAodGhpcy5nZXRfY2F1Z2h0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPSBrWyh0aGlzLnB0ciArIDEyKSA+PiAwXTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKHRoaXMuc2V0X3JldGhyb3duID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgKGUgPSBlID8gMSA6IDApLCAoa1sodGhpcy5wdHIgKyAxMykgPj4gMF0gPSBlKTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKHRoaXMuZ2V0X3JldGhyb3duID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gMCAhPSBrWyh0aGlzLnB0ciArIDEzKSA+PiAwXTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKHRoaXMuaW5pdCA9IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0X2FkanVzdGVkX3B0cigwKSwKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldF90eXBlKGUpLAogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0X2Rlc3RydWN0b3IociksCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRfcmVmY291bnQoMCksCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRfY2F1Z2h0KCExKSwKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldF9yZXRocm93bighMSk7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICh0aGlzLmFkZF9yZWYgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHZhciBlID0gU1t0aGlzLnB0ciA+PiAyXTsKICAgICAgICAgICAgICAgICAgU1t0aGlzLnB0ciA+PiAyXSA9IGUgKyAxOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAodGhpcy5yZWxlYXNlX3JlZiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgdmFyIGUgPSBTW3RoaXMucHRyID4+IDJdOwogICAgICAgICAgICAgICAgICByZXR1cm4gKFNbdGhpcy5wdHIgPj4gMl0gPSBlIC0gMSksIDEgPT09IGU7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICh0aGlzLnNldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICBGWyh0aGlzLnB0ciArIDE2KSA+PiAyXSA9IGU7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICh0aGlzLmdldF9hZGp1c3RlZF9wdHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBGWyh0aGlzLnB0ciArIDE2KSA+PiAyXTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgKHRoaXMuZ2V0X2V4Y2VwdGlvbl9wdHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIGlmIChTZSh0aGlzLmdldF90eXBlKCkpKSByZXR1cm4gRlt0aGlzLmV4Y1B0ciA+PiAyXTsKICAgICAgICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmdldF9hZGp1c3RlZF9wdHIoKTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIDAgIT09IGUgPyBlIDogdGhpcy5leGNQdHI7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkoZSkuaW5pdChyLCB0KSwKICAgICAgICAgICAgZSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgZSkKICAgICAgICAgICk7CiAgICAgICAgfSwKICAgICAgICBfX3N5c2NhbGxfZmNudGw2NDogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIGFlLnZhcmFyZ3MgPSB0OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIG4gPSBhZS5nZXRTdHJlYW1Gcm9tRkQoZSk7CiAgICAgICAgICAgIHN3aXRjaCAocikgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiAobyA9IGFlLmdldCgpKSA8IDAgPyAtMjggOiBpZS5jcmVhdGVTdHJlYW0obiwgbykuZmQ7CiAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIHJldHVybiBuLmZsYWdzOwogICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgIHZhciBvID0gYWUuZ2V0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKG4uZmxhZ3MgfD0gbyksIDA7CiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgcmV0dXJuIChvID0gYWUuZ2V0KCkpLCAoTVsobyArIDApID4+IDFdID0gMiksIDA7CiAgICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgY2FzZSA4OgogICAgICAgICAgICAgICAgcmV0dXJuIC0yODsKICAgICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICByZXR1cm4gKGkgPSAyOCksIChTW0RlKCkgPj4gMl0gPSBpKSwgLTE7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaWUgfHwgIShlIGluc3RhbmNlb2YgaWUuRXJybm9FcnJvcikpIHRocm93IGU7CiAgICAgICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBpOwogICAgICAgIH0sCiAgICAgICAgX19zeXNjYWxsX2lvY3RsOiBmdW5jdGlvbiAoZSwgciwgdCkgewogICAgICAgICAgYWUudmFyYXJncyA9IHQ7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgbiA9IGFlLmdldFN0cmVhbUZyb21GRChlKTsKICAgICAgICAgICAgc3dpdGNoIChyKSB7CiAgICAgICAgICAgICAgY2FzZSAyMTUwOToKICAgICAgICAgICAgICBjYXNlIDIxNTA1OgogICAgICAgICAgICAgICAgcmV0dXJuIG4udHR5ID8gMCA6IC01OTsKICAgICAgICAgICAgICBjYXNlIDIxNTEwOgogICAgICAgICAgICAgIGNhc2UgMjE1MTE6CiAgICAgICAgICAgICAgY2FzZSAyMTUxMjoKICAgICAgICAgICAgICBjYXNlIDIxNTA2OgogICAgICAgICAgICAgIGNhc2UgMjE1MDc6CiAgICAgICAgICAgICAgY2FzZSAyMTUwODoKICAgICAgICAgICAgICAgIHJldHVybiBuLnR0eSA/IDAgOiAtNTk7CiAgICAgICAgICAgICAgY2FzZSAyMTUxOToKICAgICAgICAgICAgICAgIGlmICghbi50dHkpIHJldHVybiAtNTk7CiAgICAgICAgICAgICAgICB2YXIgbyA9IGFlLmdldCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIChTW28gPj4gMl0gPSAwKSwgMDsKICAgICAgICAgICAgICBjYXNlIDIxNTIwOgogICAgICAgICAgICAgICAgcmV0dXJuIG4udHR5ID8gLTI4IDogLTU5OwogICAgICAgICAgICAgIGNhc2UgMjE1MzE6CiAgICAgICAgICAgICAgICByZXR1cm4gKG8gPSBhZS5nZXQoKSksIGllLmlvY3RsKG4sIHIsIG8pOwogICAgICAgICAgICAgIGNhc2UgMjE1MjM6CiAgICAgICAgICAgICAgY2FzZSAyMTUyNDoKICAgICAgICAgICAgICAgIHJldHVybiBuLnR0eSA/IDAgOiAtNTk7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiAtMjg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaWUgfHwgIShlIGluc3RhbmNlb2YgaWUuRXJybm9FcnJvcikpIHRocm93IGU7CiAgICAgICAgICAgIHJldHVybiAtZS5lcnJubzsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIF9fc3lzY2FsbF9vcGVuYXQ6IGZ1bmN0aW9uIChlLCByLCB0LCBuKSB7CiAgICAgICAgICBhZS52YXJhcmdzID0gbjsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIChyID0gYWUuZ2V0U3RyKHIpKSwgKHIgPSBhZS5jYWxjdWxhdGVBdChlLCByKSk7CiAgICAgICAgICAgIHZhciBvID0gbiA/IGFlLmdldCgpIDogMDsKICAgICAgICAgICAgcmV0dXJuIGllLm9wZW4ociwgdCwgbykuZmQ7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGlmICh2b2lkIDAgPT09IGllIHx8ICEoZSBpbnN0YW5jZW9mIGllLkVycm5vRXJyb3IpKSB0aHJvdyBlOwogICAgICAgICAgICByZXR1cm4gLWUuZXJybm87CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBfZGxpbml0OiBmdW5jdGlvbiAoZSkge30sCiAgICAgICAgX2Rsb3Blbl9qczogZnVuY3Rpb24gKGUsIHIpIHsKICAgICAgICAgIFYoc2UpOwogICAgICAgIH0sCiAgICAgICAgX2Rsc3ltX2pzOiBmdW5jdGlvbiAoZSwgcikgewogICAgICAgICAgVihzZSk7CiAgICAgICAgfSwKICAgICAgICBfZW1zY3JpcHRlbl9nZXRfbm93X2lzX21vbm90b25pYzogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIGxlOwogICAgICAgIH0sCiAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgIFYoJycpOwogICAgICAgIH0sCiAgICAgICAgZW1zY3JpcHRlbl9kYXRlX25vdzogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIERhdGUubm93KCk7CiAgICAgICAgfSwKICAgICAgICBlbXNjcmlwdGVuX2dldF9oZWFwX21heDogZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIDIxNDc0ODM2NDg7CiAgICAgICAgfSwKICAgICAgICBlbXNjcmlwdGVuX2dldF9ub3c6IHVlLAogICAgICAgIGVtc2NyaXB0ZW5fbWVtY3B5X2JpZzogZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgIEQuY29weVdpdGhpbihlLCByLCByICsgdCk7CiAgICAgICAgfSwKICAgICAgICBlbXNjcmlwdGVuX3Jlc2l6ZV9oZWFwOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgdmFyIHIgPSBELmxlbmd0aDsKICAgICAgICAgIGlmICgoZSA+Pj49IDApID4gMjE0NzQ4MzY0OCkgcmV0dXJuICExOwogICAgICAgICAgbGV0IHQgPSAoZSwgcikgPT4gZSArICgociAtIChlICUgcikpICUgcik7CiAgICAgICAgICBmb3IgKHZhciBuID0gMTsgbiA8PSA0OyBuICo9IDIpIHsKICAgICAgICAgICAgdmFyIG8gPSByICsgNDE5NDMwNCAvIG47CiAgICAgICAgICAgIGlmIChjZShNYXRoLm1pbigyMTQ3NDgzNjQ4LCB0KE1hdGgubWF4KGUsIG8pLCA2NTUzNikpKSkgcmV0dXJuICEwOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuICExOwogICAgICAgIH0sCiAgICAgICAgZW52aXJvbl9nZXQ6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICB2YXIgdCA9IDA7CiAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBmZSgpLmZvckVhY2goZnVuY3Rpb24gKG4sIG8pIHsKICAgICAgICAgICAgICB2YXIgaSA9IHIgKyB0OwogICAgICAgICAgICAgIChGWyhlICsgNCAqIG8pID4+IDJdID0gaSksCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKGUsIHIsIHQpIHsKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxlbmd0aDsgKytuKSBrW3IrKyA+PiAwXSA9IGUuY2hhckNvZGVBdChuKTsKICAgICAgICAgICAgICAgICAgdCB8fCAoa1tyID4+IDBdID0gMCk7CiAgICAgICAgICAgICAgICB9KShuLCBpKSwKICAgICAgICAgICAgICAgICh0ICs9IG4ubGVuZ3RoICsgMSk7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICAwCiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICAgZW52aXJvbl9zaXplc19nZXQ6IGZ1bmN0aW9uIChlLCByKSB7CiAgICAgICAgICB2YXIgdCA9IGZlKCk7CiAgICAgICAgICBGW2UgPj4gMl0gPSB0Lmxlbmd0aDsKICAgICAgICAgIHZhciBuID0gMDsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHQuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgIG4gKz0gZS5sZW5ndGggKyAxOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgKEZbciA+PiAyXSA9IG4pLAogICAgICAgICAgICAwCiAgICAgICAgICApOwogICAgICAgIH0sCiAgICAgICAgZXhpdDogcGUsCiAgICAgICAgZmRfY2xvc2U6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YXIgciA9IGFlLmdldFN0cmVhbUZyb21GRChlKTsKICAgICAgICAgICAgcmV0dXJuIGllLmNsb3NlKHIpLCAwOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAodm9pZCAwID09PSBpZSB8fCAhKGUgaW5zdGFuY2VvZiBpZS5FcnJub0Vycm9yKSkgdGhyb3cgZTsKICAgICAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBmZF9yZWFkOiBmdW5jdGlvbiAoZSwgciwgdCwgbikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIG8gPSAoZnVuY3Rpb24gKGUsIHIsIHQsIG4pIHsKICAgICAgICAgICAgICBmb3IgKHZhciBvID0gMCwgaSA9IDA7IGkgPCB0OyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBhID0gRltyID4+IDJdLAogICAgICAgICAgICAgICAgICBzID0gRlsociArIDQpID4+IDJdOwogICAgICAgICAgICAgICAgciArPSA4OwogICAgICAgICAgICAgICAgdmFyIHUgPSBpZS5yZWFkKGUsIGssIGEsIHMsIG4pOwogICAgICAgICAgICAgICAgaWYgKHUgPCAwKSByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICBpZiAoKChvICs9IHUpLCB1IDwgcykpIGJyZWFrOwogICAgICAgICAgICAgICAgdm9pZCAwICE9PSBuICYmIChuICs9IHUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgICAgfSkoYWUuZ2V0U3RyZWFtRnJvbUZEKGUpLCByLCB0KTsKICAgICAgICAgICAgcmV0dXJuIChGW24gPj4gMl0gPSBvKSwgMDsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaWUgfHwgIShlIGluc3RhbmNlb2YgaWUuRXJybm9FcnJvcikpIHRocm93IGU7CiAgICAgICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgZmRfc2VlazogZnVuY3Rpb24gKGUsIHIsIHQsIG4sIG8pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciBpID0gKCh1ID0gdCkgKyAyMDk3MTUyKSA+Pj4gMCA8IDQxOTQzMDUgLSAhIShzID0gcikgPyAocyA+Pj4gMCkgKyA0Mjk0OTY3Mjk2ICogdSA6IE5hTjsKICAgICAgICAgICAgaWYgKGlzTmFOKGkpKSByZXR1cm4gNjE7CiAgICAgICAgICAgIHZhciBhID0gYWUuZ2V0U3RyZWFtRnJvbUZEKGUpOwogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgIGllLmxsc2VlayhhLCBpLCBuKSwKICAgICAgICAgICAgICAoSCA9IFsKICAgICAgICAgICAgICAgIGEucG9zaXRpb24gPj4+IDAsCiAgICAgICAgICAgICAgICAoKEwgPSBhLnBvc2l0aW9uKSwKICAgICAgICAgICAgICAgICtNYXRoLmFicyhMKSA+PSAxCiAgICAgICAgICAgICAgICAgID8gTCA+IDAKICAgICAgICAgICAgICAgICAgICA/ICgwIHwgTWF0aC5taW4oK01hdGguZmxvb3IoTCAvIDQyOTQ5NjcyOTYpLCA0Mjk0OTY3Mjk1KSkgPj4+IDAKICAgICAgICAgICAgICAgICAgICA6IH5+K01hdGguY2VpbCgoTCAtICsofn5MID4+PiAwKSkgLyA0Mjk0OTY3Mjk2KSA+Pj4gMAogICAgICAgICAgICAgICAgICA6IDApCiAgICAgICAgICAgICAgXSksCiAgICAgICAgICAgICAgKFNbbyA+PiAyXSA9IEhbMF0pLAogICAgICAgICAgICAgIChTWyhvICsgNCkgPj4gMl0gPSBIWzFdKSwKICAgICAgICAgICAgICBhLmdldGRlbnRzICYmIDAgPT09IGkgJiYgMCA9PT0gbiAmJiAoYS5nZXRkZW50cyA9IG51bGwpLAogICAgICAgICAgICAgIDAKICAgICAgICAgICAgKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgaWYgKHZvaWQgMCA9PT0gaWUgfHwgIShlIGluc3RhbmNlb2YgaWUuRXJybm9FcnJvcikpIHRocm93IGU7CiAgICAgICAgICAgIHJldHVybiBlLmVycm5vOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHMsIHU7CiAgICAgICAgfSwKICAgICAgICBmZF93cml0ZTogZnVuY3Rpb24gKGUsIHIsIHQsIG4pIHsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHZhciBvID0gKGZ1bmN0aW9uIChlLCByLCB0LCBuKSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgbyA9IDAsIGkgPSAwOyBpIDwgdDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgYSA9IEZbciA+PiAyXSwKICAgICAgICAgICAgICAgICAgcyA9IEZbKHIgKyA0KSA+PiAyXTsKICAgICAgICAgICAgICAgIHIgKz0gODsKICAgICAgICAgICAgICAgIHZhciB1ID0gaWUud3JpdGUoZSwgaywgYSwgcywgbik7CiAgICAgICAgICAgICAgICBpZiAodSA8IDApIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIChvICs9IHUpLCB2b2lkIDAgIT09IG4gJiYgKG4gKz0gdSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgICAgICB9KShhZS5nZXRTdHJlYW1Gcm9tRkQoZSksIHIsIHQpOwogICAgICAgICAgICByZXR1cm4gKEZbbiA+PiAyXSA9IG8pLCAwOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBpZiAodm9pZCAwID09PSBpZSB8fCAhKGUgaW5zdGFuY2VvZiBpZS5FcnJub0Vycm9yKSkgdGhyb3cgZTsKICAgICAgICAgICAgcmV0dXJuIGUuZXJybm87CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBzdHJmdGltZV9sOiBmdW5jdGlvbiAoZSwgciwgdCwgbiwgbykgewogICAgICAgICAgcmV0dXJuIHllKGUsIHIsIHQsIG4pOwogICAgICAgIH0KICAgICAgfSwKICAgICAga2UgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBlID0geyBlbnY6IGJlLCB3YXNpX3NuYXBzaG90X3ByZXZpZXcxOiBiZSB9OwogICAgICAgIGZ1bmN0aW9uIHIoZSwgcikgewogICAgICAgICAgdmFyIHQsCiAgICAgICAgICAgIG4gPSBlLmV4cG9ydHM7CiAgICAgICAgICAoaS5hc20gPSBuKSwKICAgICAgICAgICAgKHkgPSBpLmFzbS5tZW1vcnkpLAogICAgICAgICAgICBDKCksCiAgICAgICAgICAgIGkuYXNtLl9faW5kaXJlY3RfZnVuY3Rpb25fdGFibGUsCiAgICAgICAgICAgICh0ID0gaS5hc20uX193YXNtX2NhbGxfY3RvcnMpLAogICAgICAgICAgICBULnVuc2hpZnQodCksCiAgICAgICAgICAgIEcoKTsKICAgICAgICB9CiAgICAgICAgaWYgKChYKCksIGkuaW5zdGFudGlhdGVXYXNtKSkKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBpLmluc3RhbnRpYXRlV2FzbShlLCByKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgdignTW9kdWxlLmluc3RhbnRpYXRlV2FzbSBjYWxsYmFjayBmYWlsZWQgd2l0aCBlcnJvcjogJyArIGUpLCBuKGUpOwogICAgICAgICAgfQogICAgICAgIHJldHVybiByKEsoQiwgZSlbMF0pLCBpLmFzbTsKICAgICAgfSkoKSwKICAgICAgRGUgPQogICAgICAgICgoaS5fX193YXNtX2NhbGxfY3RvcnMgPSBrZS5fX3dhc21fY2FsbF9jdG9ycyksCiAgICAgICAgKGkuX25ld19tZW1vcnkgPSBrZS5uZXdfbWVtb3J5KSwKICAgICAgICAoaS5fZnJlZV9tZW1vcnkgPSBrZS5mcmVlX21lbW9yeSksCiAgICAgICAgKGkuX2dldF9yZXR1cm5fbl9wYWNrZXRzID0ga2UuZ2V0X3JldHVybl9uX3BhY2tldHMpLAogICAgICAgIChpLl9nZXRfcmV0dXJuX3BhY2tldF9sZW4gPSBrZS5nZXRfcmV0dXJuX3BhY2tldF9sZW4pLAogICAgICAgIChpLl9nZXRfcmV0dXJuX3BhY2tldCA9IGtlLmdldF9yZXR1cm5fcGFja2V0KSwKICAgICAgICAoaS5fY2xlYXJfcmV0dXJuX3BhY2tldHMgPSBrZS5jbGVhcl9yZXR1cm5fcGFja2V0cyksCiAgICAgICAgKGkuX3Byb2Nlc3NfZXZlbnRfZGF0YSA9IGtlLnByb2Nlc3NfZXZlbnRfZGF0YSksCiAgICAgICAgKGkuX21haW4gPSBrZS5tYWluKSwKICAgICAgICAoaS5fX19lcnJub19sb2NhdGlvbiA9IGtlLl9fZXJybm9fbG9jYXRpb24pKSwKICAgICAgTWUgPQogICAgICAgICgoaS5fZnJlZSA9IGtlLmZyZWUpLAogICAgICAgIChpLl9tYWxsb2MgPSBrZS5tYWxsb2MpLAogICAgICAgIChpLl9fX2RsX3NldGVyciA9IGtlLl9fZGxfc2V0ZXJyKSwKICAgICAgICAoaS5fZW1zY3JpcHRlbl9idWlsdGluX21lbWFsaWduID0ga2UuZW1zY3JpcHRlbl9idWlsdGluX21lbWFsaWduKSksCiAgICAgIFNlID0KICAgICAgICAoKGkuX3NldFRocmV3ID0ga2Uuc2V0VGhyZXcpLAogICAgICAgIChpLl9zYXZlU2V0am1wID0ga2Uuc2F2ZVNldGptcCksCiAgICAgICAgKGkuc3RhY2tTYXZlID0ga2Uuc3RhY2tTYXZlKSwKICAgICAgICAoaS5zdGFja1Jlc3RvcmUgPSBrZS5zdGFja1Jlc3RvcmUpLAogICAgICAgIChpLnN0YWNrQWxsb2MgPSBrZS5zdGFja0FsbG9jKSwKICAgICAgICAoaS5fX19jeGFfaXNfcG9pbnRlcl90eXBlID0ga2UuX19jeGFfaXNfcG9pbnRlcl90eXBlKSk7CiAgICAoaS5keW5DYWxsX2pqaiA9IGtlLmR5bkNhbGxfampqKSwKICAgICAgKGkuZHluQ2FsbF9qaWppID0ga2UuZHluQ2FsbF9qaWppKSwKICAgICAgKGkuZHluQ2FsbF9paWlqID0ga2UuZHluQ2FsbF9paWlqKSwKICAgICAgKGkuZHluQ2FsbF9paWlqaSA9IGtlLmR5bkNhbGxfaWlpamkpLAogICAgICAoaS5keW5DYWxsX2lpaWlqID0ga2UuZHluQ2FsbF9paWlpaiksCiAgICAgIChpLmR5bkNhbGxfaWlpaWpqID0ga2UuZHluQ2FsbF9paWlpamopLAogICAgICAoaS5keW5DYWxsX3ZpaWpqID0ga2UuZHluQ2FsbF92aWlqaiksCiAgICAgIChpLmR5bkNhbGxfdmlpaWpqamogPSBrZS5keW5DYWxsX3ZpaWlqampqKSwKICAgICAgKGkuZHluQ2FsbF92aWlqaWkgPSBrZS5keW5DYWxsX3ZpaWppaSksCiAgICAgIChpLmR5bkNhbGxfaWlpaWlqID0ga2UuZHluQ2FsbF9paWlpaWopLAogICAgICAoaS5keW5DYWxsX2lpaWlpamogPSBrZS5keW5DYWxsX2lpaWlpamopLAogICAgICAoaS5keW5DYWxsX2lpaWlpaWpqID0ga2UuZHluQ2FsbF9paWlpaWlqaik7CiAgICBmdW5jdGlvbiBGZShlKSB7CiAgICAgIHZhciByID0gaS5fbWFpbjsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgdCA9IHIoMCwgMCk7CiAgICAgICAgcmV0dXJuIGhlKHQpLCB0OwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIChmdW5jdGlvbiAoZSkgewogICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBKIHx8ICd1bndpbmQnID09IGUpIHJldHVybiBFOwogICAgICAgICAgZigxLCBlKTsKICAgICAgICB9KShlKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gamUoZSkgewogICAgICBmdW5jdGlvbiByKCkgewogICAgICAgIEVlIHx8CiAgICAgICAgICAoKEVlID0gITApLAogICAgICAgICAgKGkuY2FsbGVkUnVuID0gITApLAogICAgICAgICAgYiB8fAogICAgICAgICAgICAoITAsCiAgICAgICAgICAgIGkubm9GU0luaXQgfHwgaWUuaW5pdC5pbml0aWFsaXplZCB8fCBpZS5pbml0KCksCiAgICAgICAgICAgIChpZS5pZ25vcmVQZXJtaXNzaW9ucyA9ICExKSwKICAgICAgICAgICAgcmUuaW5pdCgpLAogICAgICAgICAgICAkKFQpLAogICAgICAgICAgICAkKE4pLAogICAgICAgICAgICB0KGkpLAogICAgICAgICAgICBpLm9uUnVudGltZUluaXRpYWxpemVkICYmIGkub25SdW50aW1lSW5pdGlhbGl6ZWQoKSwKICAgICAgICAgICAgQWUgJiYgRmUoKSwKICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBpZiAoaS5wb3N0UnVuKQogICAgICAgICAgICAgICAgZm9yICgnZnVuY3Rpb24nID09IHR5cGVvZiBpLnBvc3RSdW4gJiYgKGkucG9zdFJ1biA9IFtpLnBvc3RSdW5dKTsgaS5wb3N0UnVuLmxlbmd0aDsgKQogICAgICAgICAgICAgICAgICAoZSA9IGkucG9zdFJ1bi5zaGlmdCgpKSwgei51bnNoaWZ0KGUpOwogICAgICAgICAgICAgIHZhciBlOwogICAgICAgICAgICAgICQoeik7CiAgICAgICAgICAgIH0pKCkpKTsKICAgICAgfQogICAgICAoZSA9IGUgfHwgYyksCiAgICAgICAgVSA+IDAgfHwKICAgICAgICAgICghKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKGkucHJlUnVuKQogICAgICAgICAgICAgIGZvciAoJ2Z1bmN0aW9uJyA9PSB0eXBlb2YgaS5wcmVSdW4gJiYgKGkucHJlUnVuID0gW2kucHJlUnVuXSk7IGkucHJlUnVuLmxlbmd0aDsgKQogICAgICAgICAgICAgICAgKGUgPSBpLnByZVJ1bi5zaGlmdCgpKSwgTy51bnNoaWZ0KGUpOwogICAgICAgICAgICB2YXIgZTsKICAgICAgICAgICAgJChPKTsKICAgICAgICAgIH0pKCksCiAgICAgICAgICBVID4gMCB8fAogICAgICAgICAgICAoaS5zZXRTdGF0dXMKICAgICAgICAgICAgICA/IChpLnNldFN0YXR1cygnUnVubmluZy4uLicpLAogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGkuc2V0U3RhdHVzKCcnKTsKICAgICAgICAgICAgICAgICAgfSwgMSksCiAgICAgICAgICAgICAgICAgICAgcigpOwogICAgICAgICAgICAgICAgfSwgMSkpCiAgICAgICAgICAgICAgOiByKCkpKTsKICAgIH0KICAgIGlmICgKICAgICAgKChXID0gZnVuY3Rpb24gZSgpIHsKICAgICAgICBFZSB8fCBqZSgpLCBFZSB8fCAoVyA9IGUpOwogICAgICB9KSwKICAgICAgaS5wcmVJbml0KQogICAgKQogICAgICBmb3IgKCdmdW5jdGlvbicgPT0gdHlwZW9mIGkucHJlSW5pdCAmJiAoaS5wcmVJbml0ID0gW2kucHJlSW5pdF0pOyBpLnByZUluaXQubGVuZ3RoID4gMDsgKSBpLnByZUluaXQucG9wKCkoKTsKICAgIHZhciBBZSA9ICEwOwogICAgcmV0dXJuIGkubm9Jbml0aWFsUnVuICYmIChBZSA9ICExKSwgamUoKSwgbzsKICB9Owp9KSgpOwpleHBvcnQgZGVmYXVsdCBsb2FkV0FTTTsK";
|
|
2
|
+
export {
|
|
3
|
+
I as default
|
|
4
|
+
};
|
|
5
|
+
//# sourceMappingURL=dac-PjLlwi1Y.js.map
|