Basic Meditation 1:1 Basic Meditation Coaching · WonderFeelz
Your PersonalResonance Assessment This assessment evaluates the depth of support your situation calls for — and recommends the programme and session fee that matches your needs. It takes about 5 minutes to complete.
All sessions are private, one-to-one with your practitioner Before we begin
Who is this assessment for?
Begin Assessment →
Step 1 of 8 — Primary goal
What brings you here? Choose the goal that most closely describes what you want to achieve. This shapes the depth of your programme and how your practitioner prepares.
← Back
Continue →
Select one to continue
Step 2 of 8 — Present challenges
Rate each statement honestly.
0 = Never 1 = Occasionally 2 = Frequently 3 = Almost Always
There are no right or wrong answers. Your responses help your practitioner understand the full picture.
← Back
Continue →
All 24 ratings counted
Step 3 of 8 — Lifestyle complexity
How demanding is your daily life? Your life context determines the depth of integration your practice needs. Select the option that best describes your current situation in each area.
← Back
Continue →
Step 4 of 8 — Meditation experience
What is your background with meditation? This helps your practitioner calibrate where to begin. Those new to meditation typically need more foundational support, which is reflected in the programme structure.
← Back
Continue →
Step 5 of 8 — Desired support level
How much guidance do you want from your practitioner? All WonderFeelz programmes are private, one-to-one sessions. This choice affects how closely your practitioner works with you between sessions.
← Back
Continue →
Step 6 of 8 — Daily commitment
How much time can you realistically give to practice each day? Be honest — your practitioner designs your programme around what you can actually sustain, not an ideal that won’t hold. Shorter and consistent outperforms longer and sporadic.
← Back
Continue →
Step 7 of 8 — Personalisation needed
How tailored does your practice need to be? Some people benefit from a well-structured general approach. Others carry specific challenges that require a fully customised programme built around their unique situation.
← Back
Continue →
Step 8 of 8 — Integration scope
How much of your life do you want your practice to touch? Meditation can be a standalone practice, or the foundation of a broader transformation across relationships, work, and day-to-day habits. This affects the scope of your programme.
← Back
See my assessment →
A note on this assessment: This evaluation is not a clinical diagnosis. It assesses the depth of personal support your situation calls for, and recommends a programme and fee that reflects the level of professional engagement involved. All recommendations are a starting point — your practitioner will refine the approach in your first session.
Primary focus
Focus multiplier:
Total resonance score
Out of a possible 210
Session fee calculation
Base session fee ( )
Focus multiplier ( )
Base × Multiplier
Support fee ( )
Estimated session fee
Recommended Programme Structure
Practitioner-validated at first session
Estimated total programme investment
Note: This session estimate is a starting point based on your assessment responses. Your practitioner will review and confirm the programme structure in your first session. Some participants progress faster; some benefit from a longer programme. The number of sessions is always agreed with you before committing.
CgovKiBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAKICAgREFUQSBERUZJTklUSU9OUwpcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAgKi8KCmNvbnN0IEdPQUxTID0gWwogIHsgbGFiZWw6ICdDYWxtIE1pbmQnLCAgICAgICAgICAgICBtdWx0OiAxLjAsIGtleTogJ2NhbG0nIH0sCiAgeyBsYWJlbDogJ0JldHRlciBTbGVlcCcsICAgICAgICAgIG11bHQ6IDEuMSwga2V5OiAnc2xlZXAnIH0sCiAgeyBsYWJlbDogJ0ZvY3VzICYgTWVtb3J5JywgICAgICAgIG11bHQ6IDEuMiwga2V5OiAnZm9jdXMnIH0sCiAgeyBsYWJlbDogJ0Vtb3Rpb25hbCBCYWxhbmNlJywgICAgIG11bHQ6IDEuMywga2V5OiAnZW1vdGlvbmFsJyB9LAogIHsgbGFiZWw6ICdGYW1pbHkgSGFybW9ueScsICAgICAgICBtdWx0OiAxLjUsIGtleTogJ2ZhbWlseScgfSwKICB7IGxhYmVsOiAnUmVsYXRpb25zaGlwIEdyb3d0aCcsICAgbXVsdDogMS43LCBrZXk6ICdyZWxhdGlvbnNoaXAnIH0sCiAgeyBsYWJlbDogJ1BhcmVudGluZycsICAgICAgICAgICAgIG11bHQ6IDEuNSwga2V5OiAncGFyZW50aW5nJyB9LAogIHsgbGFiZWw6ICdTdHVkZW50IFN1Y2Nlc3MnLCAgICAgICBtdWx0OiAxLjMsIGtleTogJ3N0dWRlbnQnIH0sCiAgeyBsYWJlbDogJ0F0aGxldGUgUGVyZm9ybWFuY2UnLCAgIG11bHQ6IDIuMCwga2V5OiAnYXRobGV0ZScgfSwKICB7IGxhYmVsOiAnQnVzaW5lc3MgUmVzaWxpZW5jZScsICAgbXVsdDogMS44LCBrZXk6ICdidXNpbmVzcycgfSwKICB7IGxhYmVsOiAnRW50cmVwcmVuZXVyIFBlcmYuJywgICAgbXVsdDogMi4wLCBrZXk6ICdlbnRyZXByZW5ldXInIH0sCiAgeyBsYWJlbDogJ0V4ZWN1dGl2ZSBMZWFkZXJzaGlwJywgIG11bHQ6IDIuMiwga2V5OiAnZXhlY3V0aXZlJyB9LAogIHsgbGFiZWw6ICdQb2xpdGljYWwgTGVhZGVyc2hpcCcsICBtdWx0OiAyLjUsIGtleTogJ3BvbGl0aWNhbCcgfSwKICB7IGxhYmVsOiAnU3Bpcml0dWFsIEdyb3d0aCcsICAgICAgbXVsdDogMS41LCBrZXk6ICdzcGlyaXR1YWwnIH0sCiAgeyBsYWJlbDogJ090aGVyIFNwZWNpZmljIEdvYWwnLCAgIG11bHQ6IG51bGwsIGtleTogJ290aGVyJywgZGlzY3VzczogdHJ1ZSB9LApdOwoKY29uc3QgQ0hBTExFTkdFX1NFQ1RJT05TID0gWwogIHsgdGl0bGU6ICdTbGVlcCcsIGl0ZW1zOiBbJ0RpZmZpY3VsdHkgZmFsbGluZyBhc2xlZXAnLCdOaWdodCBhd2FrZW5pbmcnLCdGZWVsaW5nIHRpcmVkIGFmdGVyIHNsZWVwJywnRHJlYW0gZGlzdHVyYmFuY2UnXSB9LAogIHsgdGl0bGU6ICdFbW90aW9uYWwgUmVndWxhdGlvbicsIGl0ZW1zOiBbJ0ZlZWxpbmcgb3ZlcndoZWxtZWQnLCdBbnhpZXR5JywnSXJyaXRhYmlsaXR5JywnTG9zcyBvZiBtb3RpdmF0aW9uJ10gfSwKICB7IHRpdGxlOiAnUmVsYXRpb25zaGlwcycsIGl0ZW1zOiBbJ0NvbW11bmljYXRpb24gZGlmZmljdWx0eScsJ0NvbmZsaWN0JywnRmVlbGluZyBtaXN1bmRlcnN0b29kJywnU29jaWFsIHdpdGhkcmF3YWwnXSB9LAogIHsgdGl0bGU6ICdXb3JrJywgaXRlbXM6IFsnVW5hYmxlIHRvIHN3aXRjaCBvZmYnLCdEZWNpc2lvbiBmYXRpZ3VlJywnUG9vciBjb25jZW50cmF0aW9uJywnV29yayBwcmVzc3VyZSddIH0sCiAgeyB0aXRsZTogJ0hlYWx0aCcsIGl0ZW1zOiBbJ1BlcnNpc3RlbnQgcGFpbicsJ0xvdyBlbmVyZ3knLCdTdHJlc3MtcmVsYXRlZCBzeW1wdG9tcycsJ01lZGljYWwgY29uZGl0aW9uIGFmZmVjdGluZyB3ZWxsYmVpbmcnXSB9LAogIHsgdGl0bGU6ICdQZXJzb25hbCBHcm93dGgnLCBpdGVtczogWydEaWZmaWN1bHR5IGZpbmRpbmcgcHVycG9zZScsJ0ZlZWxpbmcgc3R1Y2snLCdMb3cgY29uZmlkZW5jZScsJ0ZlYXIgb2YgZmFpbHVyZSddIH0sCl07Cgpjb25zdCBMSUZFU1RZTEVfU0VDVElPTlMgPSBbCiAgewogICAgdGl0bGU6ICdXb3JraW5nIGhvdXJzIHBlciB3ZWVrJywKICAgIGtleTogJ3dvcmtfaG91cnMnLAogICAgb3B0aW9uczogWwogICAgICB7IGxhYmVsOiAnTGVzcyB0aGFuIDQwIGhycy93ZWVrJywgc3ViOiAnU3RhbmRhcmQgd29ya2xvYWQnLCBzY29yZTogMCB9LAogICAgICB7IGxhYmVsOiAnNDBcdTIwMTM2MCBocnMvd2VlaycsICAgICAgICAgc3ViOiAnQnVzeSBzY2hlZHVsZScsICAgICBzY29yZTogMiB9LAogICAgICB7IGxhYmVsOiAnNjBcdTIwMTM4MCBocnMvd2VlaycsICAgICAgICAgc3ViOiAnRGVtYW5kaW5nIHBhY2UnLCAgICBzY29yZTogNCB9LAogICAgICB7IGxhYmVsOiAnODArIGhycy93ZWVrJywgICAgICAgICAgIHN1YjogJ0hpZ2ggaW50ZW5zaXR5JywgICAgc2NvcmU6IDYgfSwKICAgIF0KICB9LAogIHsKICAgIHRpdGxlOiAnUmVzcG9uc2liaWxpdHkgbGV2ZWwnLAogICAga2V5OiAncmVzcG9uc2liaWxpdHknLAogICAgb3B0aW9uczogWwogICAgICB7IGxhYmVsOiAnU3R1ZGVudCcsICAgICAgICBzdWI6ICdTdHVkeWluZyAvIGluIGVkdWNhdGlvbicsIHNjb3JlOiAxIH0sCiAgICAgIHsgbGFiZWw6ICdFbXBsb3llZScsICAgICAgIHN1YjogJ0luZGl2aWR1YWwgY29udHJpYnV0b3InLCAgc2NvcmU6IDIgfSwKICAgICAgeyBsYWJlbDogJ01hbmFnZXInLCAgICAgICAgc3ViOiAnTGVhZGluZyBhIHRlYW0nLCAgICAgICAgIHNjb3JlOiA0IH0sCiAgICAgIHsgbGFiZWw6ICdCdXNpbmVzcyBPd25lcicsIHN1YjogJ1J1bm5pbmcgYSBidXNpbmVzcycsICAgICBzY29yZTogNiB9LAogICAgICB7IGxhYmVsOiAnQ0VPIC8gRGlyZWN0b3InLCBzdWI6ICdFeGVjdXRpdmUgbGVhZGVyc2hpcCcsICAgc2NvcmU6IDggfSwKICAgICAgeyBsYWJlbDogJ1B1YmxpYyBMZWFkZXInLCAgc3ViOiAnUG9saXRpY3MgLyBwdWJsaWMgb2ZmaWNlJywgc2NvcmU6IDEwIH0sCiAgICBdCiAgfSwKICB7CiAgICB0aXRsZTogJ051bWJlciBvZiBkZXBlbmRlbnRzJywKICAgIGtleTogJ2RlcGVuZGVudHMnLAogICAgb3B0aW9uczogWwogICAgICB7IGxhYmVsOiAnTm9uZScsICAgICAgICAgIHN1YjogJ05vIGRlcGVuZGVudHMnLCAgICAgICBzY29yZTogMCB9LAogICAgICB7IGxhYmVsOiAnMVx1MjAxMzIgcGVvcGxlJywgICAgc3ViOiAnU21hbGwgaG91c2Vob2xkJywgICAgIHNjb3JlOiAyIH0sCiAgICAgIHsgbGFiZWw6ICczXHUyMDEzNSBwZW9wbGUnLCAgICBzdWI6ICdNZWRpdW0gaG91c2Vob2xkJywgICAgc2NvcmU6IDQgfSwKICAgICAgeyBsYWJlbDogJ01vcmUgdGhhbiA1JywgICBzdWI6ICdMYXJnZSBob3VzZWhvbGQnLCAgICAgc2NvcmU6IDYgfSwKICAgIF0KICB9LAogIHsKICAgIHRpdGxlOiAnUmVjZW50IG1ham9yIGxpZmUgZXZlbnRzJywKICAgIGtleTogJ2xpZmVfZXZlbnRzJywKICAgIG9wdGlvbnM6IFsKICAgICAgeyBsYWJlbDogJ05vbmUnLCAgICAgICAgIHN1YjogJ0xpZmUgaXMgcmVsYXRpdmVseSBzdGFibGUnLCBzY29yZTogMCB9LAogICAgICB7IGxhYmVsOiAnT25lIGV2ZW50JywgICAgc3ViOiAnT25lIHNpZ25pZmljYW50IGNoYW5nZScsICAgIHNjb3JlOiA0IH0sCiAgICAgIHsgbGFiZWw6ICdUd28gZXZlbnRzJywgICBzdWI6ICdUd28gc2lnbmlmaWNhbnQgY2hhbmdlcycsICAgc2NvcmU6IDYgfSwKICAgICAgeyBsYWJlbDogJ1RocmVlIG9yIG1vcmUnLHN1YjogJ011bHRpcGxlIGxpZmUgY2hhbmdlcycsICAgICBzY29yZTogOCB9LAogICAgXQogIH0sCl07Cgpjb25zdCBFWFBfT1BUSU9OUyA9IFsKICB7IGxhYmVsOiAnTmV2ZXIgcHJhY3Rpc2VkJywgc3ViOiAnQ29tcGxldGVseSBuZXcgdG8gbWVkaXRhdGlvbicsIHNjb3JlOiAyIH0sCiAgeyBsYWJlbDogJ09jY2FzaW9uYWxseScsICAgIHN1YjogJ1RyaWVkIGl0IGEgZmV3IHRpbWVzJywgICAgICAgICBzY29yZTogMSB9LAogIHsgbGFiZWw6ICdSZWd1bGFyIHByYWN0aWNlJyxzdWI6ICdDb25zaXN0ZW50IGN1cnJlbnQgcHJhY3RpY2UnLCAgc2NvcmU6IDAgfSwKICB7IGxhYmVsOiAnVGVhY2hlciAvIGd1aWRlJywgc3ViOiAnR3VpZGUgb3RoZXJzIGluIG1lZGl0YXRpb24nLCAgIHNjb3JlOiAwIH0sCl07CgovLyBHcm91cCByZW1vdmVkIFx1MjAxNCAxOjEgb25seSBwZXIgYnJpZWYKY29uc3QgU1VQUE9SVF9PUFRJT05TID0gWwogIHsgbGFiZWw6ICdTZWxmLUd1aWRlZCcsICBzdWI6ICdQcmFjdGl0aW9uZXIgZ3VpZGVzLCB5b3UgYXBwbHkgaW5kZXBlbmRlbnRseScsICAgc2NvcmU6IDAsICBmZWU6IDAgICAgfSwKICB7IGxhYmVsOiAnU3VwcG9ydGVkJywgICAgc3ViOiAnUmVndWxhciBjaGVjay1pbnMgYmV0d2VlbiBzZXNzaW9ucycsICAgICAgICAgICAgICBzY29yZTogMiwgIGZlZTogMCAgICB9LAogIHsgbGFiZWw6ICdQcmVtaXVtJywgICAgICBzdWI6ICdDbG9zZXIgZ3VpZGFuY2Ugd2l0aCBiZXR3ZWVuLXNlc3Npb24gYWNjZXNzJywgICAgIHNjb3JlOiA1LCAgZmVlOiAxNTAwIH0sCiAgeyBsYWJlbDogJ0VsaXRlJywgICAgICAgIHN1YjogJ0hpZ2hlc3QtdG91Y2gsIGZ1bGx5IGRlZGljYXRlZCBwcmFjdGl0aW9uZXIgdGltZScsIHNjb3JlOiAxMCwgZmVlOiA1MDAwIH0sCl07Cgpjb25zdCBDT01NSVRfT1BUSU9OUyA9IFsKICB7IGxhYmVsOiAnRGFpbHkgMTUgbWludXRlcycsIHN1YjogJ1Nob3J0LCBjb25zaXN0ZW50IGRhaWx5IHByYWN0aWNlJywgICAgICAgIHNjb3JlOiAwIH0sCiAgeyBsYWJlbDogJ0RhaWx5IDMwIG1pbnV0ZXMnLCBzdWI6ICdNb2RlcmF0ZSBzdXN0YWluZWQgY29tbWl0bWVudCcsICAgICAgICAgICBzY29yZTogMiB9LAogIHsgbGFiZWw6ICdEYWlseSA0NSBtaW51dGVzJywgc3ViOiAnRGVkaWNhdGVkIGRhaWx5IHByYWN0aWNlJywgICAgICAgICAgICAgICAgc2NvcmU6IDQgfSwKICB7IGxhYmVsOiAnRGFpbHkgNjArIG1pbnV0ZXMnLCBzdWI6ICdJbW1lcnNpdmUgZGFpbHkgZW5nYWdlbWVudCcsICAgICAgICAgICAgIHNjb3JlOiA2IH0sCl07Cgpjb25zdCBQRVJTT05BTF9PUFRJT05TID0gWwogIHsgbGFiZWw6ICdHZW5lcmFsIGd1aWRhbmNlJywgICAgICAgc3ViOiAnQSB3ZWxsLXN0cnVjdHVyZWQgc3RhbmRhcmQgcHJvZ3JhbW1lJywgc2NvcmU6IDAgfSwKICB7IGxhYmVsOiAnT25lIHNwZWNpZmljIGNoYWxsZW5nZScsIHN1YjogJ0ZvY3VzZWQgb24gb25lIGNsZWFyIGFyZWEnLCAgICAgICAgICAgIHNjb3JlOiAyIH0sCiAgeyBsYWJlbDogJ1NldmVyYWwgY2hhbGxlbmdlcycsICAgICBzdWI6ICdNdWx0aXBsZSBhcmVhcyB0byBhZGRyZXNzJywgICAgICAgICAgICBzY29yZTogNSB9LAogIHsgbGFiZWw6ICdIaWdobHkgY3VzdG9taXNlZCcsICAgICAgc3ViOiAnQnVpbHQgZW50aXJlbHkgYXJvdW5kIHlvdXIgc2l0dWF0aW9uJywgc2NvcmU6IDggfSwKXTsKCmNvbnN0IElOVEVHUkFURV9PUFRJT05TID0gWwogIHsgbGFiZWw6ICdPbmx5IG1lZGl0YXRpb24nLCAgICAgICAgICAgICAgICAgIHN1YjogJ1N0YW5kYWxvbmUgcHJhY3RpY2UgXHUyMDE0IG5vIHdpZGVyIGNoYW5nZScsICAgICBzY29yZTogMCAgfSwKICB7IGxhYmVsOiAnTWVkaXRhdGlvbiArIGxpZmVzdHlsZScsICAgICAgICAgICAgc3ViOiAnU2xlZXAsIGRpZXQsIG1vdmVtZW50IGFsaWdubWVudCcsICAgICAgICAgICBzY29yZTogMyAgfSwKICB7IGxhYmVsOiAnTWVkaXRhdGlvbiArIHJlbGF0aW9uc2hpcHMnLCAgICAgICAgc3ViOiAnSG93IHlvdSByZWxhdGUgdG8gb3RoZXJzIGNoYW5nZXMgdG9vJywgICAgICBzY29yZTogNSAgfSwKICB7IGxhYmVsOiAnTWVkaXRhdGlvbiArIHdvcmsgKyBmYW1pbHknLCAgICAgICAgc3ViOiAnUHJhY3RpY2UgYWNyb3NzIG1ham9yIGxpZmUgZG9tYWlucycsICAgICAgICBzY29yZTogOCAgfSwKICB7IGxhYmVsOiAnV2hvbGUtbGlmZSBpbnRlZ3JhdGlvbicsICAgICAgICAgICAgc3ViOiAnRXZlcnkgYXJlYSBvZiBsaWZlIHRvdWNoZWQgYnkgcHJhY3RpY2UnLCAgIHNjb3JlOiAxMCB9LApdOwoKY29uc3QgTEVWRUxTID0gWwogIHsgbmFtZTogJ0V4cGVyaWVuY2UnLCAgICAgICAgICAgICAgICByYW5nZTogJzBcdTIwMTMyMCcsICAgbWluOiAwLCAgIG1heDogMjAsICBiYXNlOiAwLCAgICBkZXNjOiAnQSBzdHJvbmcgZm91bmRhdGlvbiB0byBiZWdpbiBmcm9tIFx1MjAxNCBhIHRhc3RlciBwcm9ncmFtbWUuJyB9LAogIHsgbmFtZTogJ0F3YXJlbmVzcycsICAgICAgICAgICAgICAgICByYW5nZTogJzIxXHUyMDEzMzUnLCAgbWluOiAyMSwgIG1heDogMzUsICBiYXNlOiA1MDAsICBkZXNjOiAnQnVpbGRpbmcgY29uc2lzdGVudCBhd2FyZW5lc3MgYW5kIGVhcmx5IHNraWxsLicgfSwKICB7IG5hbWU6ICdEaXNjb3ZlcnknLCAgICAgICAgICAgICAgICAgcmFuZ2U6ICczNlx1MjAxMzUwJywgIG1pbjogMzYsICBtYXg6IDUwLCAgYmFzZTogMTAwMCwgZGVzYzogJ0V4cGxvcmluZyB0aGUgYnJlYWR0aCBvZiB5b3VyIHByYWN0aWNlIGFuZCBpdHMgZWZmZWN0cy4nIH0sCiAgeyBuYW1lOiAnSW5zaWdodCcsICAgICAgICAgICAgICAgICAgIHJhbmdlOiAnNTFcdTIwMTM3MCcsICBtaW46IDUxLCAgbWF4OiA3MCwgIGJhc2U6IDIwMDAsIGRlc2M6ICdEZXZlbG9waW5nIHJlYWwgaW5zaWdodCBpbnRvIHBhdHRlcm5zIGFuZCBob3cgdG8gc2hpZnQgdGhlbS4nIH0sCiAgeyBuYW1lOiAnSW50ZWdyYXRpb24nLCAgICAgICAgICAgICAgIHJhbmdlOiAnNzFcdTIwMTM5MCcsICBtaW46IDcxLCAgbWF4OiA5MCwgIGJhc2U6IDM1MDAsIGRlc2M6ICdJbnRlZ3JhdGluZyBwcmFjdGljZSBpbnRvIHRoZSB0ZXh0dXJlIG9mIGRhaWx5IGxpZmUuJyB9LAogIHsgbmFtZTogJ1RyYW5zZm9ybWF0aW9uIEludGVuc2l2ZScsICByYW5nZTogJzkxXHUyMDEzMTIwJywgbWluOiA5MSwgIG1heDogMTIwLCBiYXNlOiA1MDAwLCBkZXNjOiAnSW50ZW5zaXZlLCBzdXN0YWluZWQgdHJhbnNmb3JtYXRpb24gYWNyb3NzIG11bHRpcGxlIGRvbWFpbnMuJyB9LAogIHsgbmFtZTogJ01hc3RlciBNZW50b3JpbmcnLCAgICAgICAgICByYW5nZTogJzEyMSsnLCAgIG1pbjogMTIxLCBtYXg6IDk5OTksYmFzZTogbnVsbCwgZGVzYzogJ0F0IHRoaXMgZGVwdGgsIGEgcGVyc29uYWxpc2VkIGZlZSBkaXNjdXNzaW9uIGlzIHJlcXVpcmVkLicgfSwKXTsKCi8qIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICBTRVNTSU9OIENBTENVTEFUT1IKICAgQ29tcHV0ZXMgcmVjb21tZW5kZWQgbnVtYmVyIG9mIDE6MSBzZXNzaW9ucyBiYXNlZCBvbiBhbGwKICAgYXNzZXNzbWVudCBpbnB1dHMuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggZnVsbCBicmVha2Rvd24uClx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MCAqLwpmdW5jdGlvbiBjb21wdXRlU2Vzc2lvbnMoZGF0YSkgewogIGNvbnN0IHsgbGV2ZWwsIGNoYWxsZW5nZVRvdGFsLCBsaWZlc3R5bGVUb3RhbCwgcGVyc29uYWxUb3RhbCwKICAgICAgICAgIGludGVncmF0ZVRvdGFsLCBjb21taXRUb3RhbCwgZXhwVG90YWwsIEdSQU5EX1RPVEFMLAogICAgICAgICAgZmluYWxGZWUsIGlzTWFzdGVyLCBpc0Rpc2N1c3MgfSA9IGRhdGE7CgogIC8vIEJhc2Ugc2Vzc2lvbnMgcGVyIHJlc29uYW5jZSBsZXZlbAogIGNvbnN0IEJBU0VfTUFQID0gewogICAgJ0V4cGVyaWVuY2UnOiAgICAgICAgICAgICAgIDQsCiAgICAnQXdhcmVuZXNzJzogICAgICAgICAgICAgICAgOCwKICAgICdEaXNjb3ZlcnknOiAgICAgICAgICAgICAgIDEyLAogICAgJ0luc2lnaHQnOiAgICAgICAgICAgICAgICAgMTYsCiAgICAnSW50ZWdyYXRpb24nOiAgICAgICAgICAgICAyMCwKICAgICdUcmFuc2Zvcm1hdGlvbiBJbnRlbnNpdmUnOjI0LAogICAgJ01hc3RlciBNZW50b3JpbmcnOiAgICAgICAgMzYsCiAgfTsKICBjb25zdCBiYXNlID0gQkFTRV9NQVBbbGV2ZWwubmFtZV0gfHwgMTI7CgogIC8vIEFkanVzdG1lbnQgY2FsY3VsYXRpb25zCiAgY29uc3QgYWRqID0ge307CgogIC8vIENoYWxsZW5nZSBzZXZlcml0eQogIGFkai5jaGFsbGVuZ2UgPSBjaGFsbGVuZ2VUb3RhbCA8PSAxOCA/IDAKICAgIDogY2hhbGxlbmdlVG90YWwgPD0gMzYgPyAyCiAgICA6IGNoYWxsZW5nZVRvdGFsIDw9IDU0ID8gNCA6IDY7CgogIC8vIExpZmUgY29tcGxleGl0eQogIGFkai5saWZlc3R5bGUgPSBsaWZlc3R5bGVUb3RhbCA8PSAxMCA/IDAKICAgIDogbGlmZXN0eWxlVG90YWwgPD0gMjAgPyAyIDogNDsKCiAgLy8gUGVyc29uYWxpc2F0aW9uCiAgYWRqLnBlcnNvbmFsID0gcGVyc29uYWxUb3RhbCA9PT0gMCA/IDAKICAgIDogcGVyc29uYWxUb3RhbCA8PSAyID8gMQogICAgOiBwZXJzb25hbFRvdGFsIDw9IDUgPyAzIDogNTsKCiAgLy8gSW50ZWdyYXRpb24gc2NvcGUKICBhZGouaW50ZWdyYXRlID0gaW50ZWdyYXRlVG90YWwgPT09IDAgPyAwCiAgICA6IGludGVncmF0ZVRvdGFsIDw9IDMgPyAxCiAgICA6IGludGVncmF0ZVRvdGFsIDw9IDUgPyAyCiAgICA6IGludGVncmF0ZVRvdGFsIDw9IDggPyA0IDogNjsKCiAgLy8gQ29tbWl0bWVudCAoaW52ZXJzZSBcdTIwMTQgbW9yZSB0aW1lID0gZmFzdGVyIHByb2dyZXNzKQogIGFkai5jb21taXQgPSBjb21taXRUb3RhbCA9PT0gMCA/IDQKICAgIDogY29tbWl0VG90YWwgPD0gMiA/IDIKICAgIDogY29tbWl0VG90YWwgPD0gNCA/IDAgOiAtMjsKCiAgLy8gSW5leHBlcmllbmNlCiAgYWRqLmV4cGVyaWVuY2UgPSBleHBUb3RhbCA+PSAyID8gMgogICAgOiBleHBUb3RhbCA+PSAxID8gMSA6IDA7CgogIGNvbnN0IHRvdGFsQWRqID0gT2JqZWN0LnZhbHVlcyhhZGopLnJlZHVjZSgoYSxiKT0+YStiLDApOwogIGNvbnN0IHRvdGFsU2Vzc2lvbnMgPSBNYXRoLm1heChiYXNlLCBiYXNlICsgdG90YWxBZGopOwoKICAvLyBQaGFzZSBicmVha2Rvd24gKDMwJSAvIDQwJSAvIDMwJSkKICBjb25zdCBmb3VuZGF0aW9uICA9IE1hdGguY2VpbCh0b3RhbFNlc3Npb25zICogMC4zMCk7CiAgY29uc3QgaW50ZWdyYXRpb24gPSBNYXRoLmZsb29yKHRvdGFsU2Vzc2lvbnMgKiAwLjMwKTsKICBjb25zdCBkZXZlbG9wbWVudCA9IHRvdGFsU2Vzc2lvbnMgLSBmb3VuZGF0aW9uIC0gaW50ZWdyYXRpb247CgogIC8vIEZyZXF1ZW5jeSByZWNvbW1lbmRhdGlvbgogIGNvbnN0IGlzVHdpY2VXZWVrbHkgPSAoY29tbWl0VG90YWwgPj0gNCB8fCBHUkFORF9UT1RBTCA+PSA1MCk7CiAgY29uc3QgZnJlcXVlbmN5ID0gaXNNYXN0ZXIgPyAnQnkgZGlzY3Vzc2lvbicKICAgIDogaXNUd2ljZVdlZWtseSA/ICdUd2ljZSB3ZWVrbHknIDogJ1dlZWtseSc7CgogIC8vIFRpbWVsaW5lCiAgbGV0IHdlZWtzLCB0aW1lbGluZTsKICBpZiAoaXNNYXN0ZXIpIHsKICAgIHdlZWtzID0gbnVsbDsgdGltZWxpbmUgPSAnT25nb2luZyBcdTIwMTQgYnkgZGlzY3Vzc2lvbic7CiAgfSBlbHNlIGlmIChpc1R3aWNlV2Vla2x5KSB7CiAgICB3ZWVrcyA9IE1hdGguY2VpbCh0b3RhbFNlc3Npb25zIC8gMik7CiAgICB0aW1lbGluZSA9IHdlZWtzICsgJyB3ZWVrcyc7CiAgfSBlbHNlIHsKICAgIHdlZWtzID0gdG90YWxTZXNzaW9uczsKICAgIHRpbWVsaW5lID0gd2Vla3MgKyAnIHdlZWtzJzsKICB9CgogIC8vIFByb2dyYW1tZSB0eXBlIGxhYmVsCiAgY29uc3QgcHJvZ1R5cGUgPSB0b3RhbFNlc3Npb25zIDw9IDYgPyAnSW50cm9kdWN0b3J5JwogICAgOiB0b3RhbFNlc3Npb25zIDw9IDEyID8gJ0ZvdW5kYXRpb24nCiAgICA6IHRvdGFsU2Vzc2lvbnMgPD0gMjAgPyAnRGV2ZWxvcG1lbnQnCiAgICA6IHRvdGFsU2Vzc2lvbnMgPD0gMjggPyAnSW50ZW5zaXZlJwogICAgOiAnTWFzdGVyIFRyYWNrJzsKCiAgLy8gVG90YWwgaW52ZXN0bWVudAogIGxldCB0b3RhbEludmVzdG1lbnQgPSBudWxsOwogIGlmICghaXNNYXN0ZXIgJiYgIWlzRGlzY3VzcyAmJiBmaW5hbEZlZSAmJiB0eXBlb2YgZmluYWxGZWUgPT09ICdudW1iZXInKSB7CiAgICB0b3RhbEludmVzdG1lbnQgPSB0b3RhbFNlc3Npb25zICogZmluYWxGZWU7CiAgfQoKICAvLyBIdW1hbi1yZWFkYWJsZSBhZGp1c3RtZW50cyBmb3IgZGlzcGxheQogIGNvbnN0IGFkakxhYmVscyA9IFsKICAgIHsgbGFiZWw6ICdCYXNlIHNlc3Npb25zICgnICsgbGV2ZWwubmFtZSArICcpJywgdmFsOiBiYXNlLCBiYXNlOiB0cnVlIH0sCiAgICB7IGxhYmVsOiAnQ2hhbGxlbmdlIHNldmVyaXR5ICgnICsgKGNoYWxsZW5nZVRvdGFsIDw9IDE4ID8gJ2xvdycgOiBjaGFsbGVuZ2VUb3RhbCA8PSAzNiA/ICdtb2RlcmF0ZScgOiBjaGFsbGVuZ2VUb3RhbCA8PSA1NCA/ICdoaWdoJyA6ICdzZXZlcmUnKSArICcpJywgdmFsOiBhZGouY2hhbGxlbmdlIH0sCiAgICB7IGxhYmVsOiAnTGlmZSBjb21wbGV4aXR5ICgnICsgKGxpZmVzdHlsZVRvdGFsIDw9IDEwID8gJ2xvdycgOiBsaWZlc3R5bGVUb3RhbCA8PSAyMCA/ICdtZWRpdW0nIDogJ2hpZ2gnKSArICcpJywgdmFsOiBhZGoubGlmZXN0eWxlIH0sCiAgICB7IGxhYmVsOiAnUGVyc29uYWxpc2F0aW9uIHJlcXVpcmVkJywgdmFsOiBhZGoucGVyc29uYWwgfSwKICAgIHsgbGFiZWw6ICdJbnRlZ3JhdGlvbiBzY29wZScsIHZhbDogYWRqLmludGVncmF0ZSB9LAogICAgeyBsYWJlbDogJ0RhaWx5IHByYWN0aWNlIHRpbWUnLCB2YWw6IGFkai5jb21taXQgfSwKICAgIHsgbGFiZWw6ICdNZWRpdGF0aW9uIGV4cGVyaWVuY2UnLCB2YWw6IGFkai5leHBlcmllbmNlIH0sCiAgICB7IGxhYmVsOiAnVG90YWwgc2Vzc2lvbnMgcmVjb21tZW5kZWQnLCB2YWw6IHRvdGFsU2Vzc2lvbnMsIHRvdGFsOiB0cnVlIH0sCiAgXTsKCiAgcmV0dXJuIHsKICAgIGJhc2UsIGFkaiwgdG90YWxBZGosIHRvdGFsU2Vzc2lvbnMsCiAgICBmb3VuZGF0aW9uLCBkZXZlbG9wbWVudCwgaW50ZWdyYXRpb24sCiAgICBmcmVxdWVuY3ksIHRpbWVsaW5lLCB3ZWVrcywgcHJvZ1R5cGUsCiAgICB0b3RhbEludmVzdG1lbnQsIGlzTWFzdGVyLCBhZGpMYWJlbHMsCiAgICBpc1R3aWNlV2Vla2x5LAogIH07Cn0KCmZ1bmN0aW9uIHJlbmRlclNlc3Npb25zKHNlc3MpIHsKICAvLyBBbmltYXRlIGNvdW50CiAgY29uc3QgY291bnRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzLWNvdW50Jyk7CiAgaWYgKGNvdW50RWwpIHsKICAgIGxldCBjdXIgPSAwOwogICAgY29uc3QgdGFyZ2V0ID0gc2Vzcy5pc01hc3RlciA/IDM2IDogc2Vzcy50b3RhbFNlc3Npb25zOwogICAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0YXJnZXQgLyAzMCkpOwogICAgY29uc3QgaXYgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGN1ciA9IE1hdGgubWluKGN1ciArIHN0ZXAsIHRhcmdldCk7CiAgICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBzZXNzLmlzTWFzdGVyID8gJzM2KycgOiBjdXI7CiAgICAgIGlmIChjdXIgPj0gdGFyZ2V0KSBjbGVhckludGVydmFsKGl2KTsKICAgIH0sIDQwKTsKICB9CgogIGNvbnN0IGxldmVsTGFiZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzcy1sZXZlbC1sYWJlbCcpOwogIGlmIChsZXZlbExhYmVsKSBsZXZlbExhYmVsLnRleHRDb250ZW50ID0gc2Vzcy5pc01hc3RlciA/ICdzZXNzaW9ucyAobWluaW11bSknIDogJ3Nlc3Npb25zIHJlY29tbWVuZGVkJzsKCiAgY29uc3QgaGVhZGxpbmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2Vzcy1oZWFkbGluZScpOwogIGlmIChoZWFkbGluZSkgaGVhZGxpbmUudGV4dENvbnRlbnQgPQogICAgc2Vzcy5pc01hc3RlciA/ICdPbmdvaW5nIG1hc3RlciBtZW50b3JpbmcgcHJvZ3JhbW1lJwogICAgOiBzZXNzLnByb2dUeXBlICsgJyBwcm9ncmFtbWUgXHUwMEI3ICcgKyBzZXNzLnRpbWVsaW5lOwoKICAvLyBQaGFzZSBiYXJzIChhbmltYXRlIG9uIGRlbGF5KQogIHNldFRpbWVvdXQoKCkgPT4gewogICAgY29uc3QgbWF4U2VzcyA9IHNlc3MuaXNNYXN0ZXIgPyAzNiA6IHNlc3MudG90YWxTZXNzaW9uczsKICAgIFsKICAgICAgeyBpZDogJ3BoYXNlLWZvdW5kYXRpb24nLCAgdmFsOiAncGhhc2UtZm91bmRhdGlvbi12YWwnLCAgbjogc2Vzcy5mb3VuZGF0aW9uLCAgbGFiZWw6IHNlc3MuZm91bmRhdGlvbiArICcgc2Vzc2lvbnMnIH0sCiAgICAgIHsgaWQ6ICdwaGFzZS1kZXZlbG9wbWVudCcsIHZhbDogJ3BoYXNlLWRldmVsb3BtZW50LXZhbCcsIG46IHNlc3MuZGV2ZWxvcG1lbnQsIGxhYmVsOiBzZXNzLmRldmVsb3BtZW50ICsgJyBzZXNzaW9ucycgfSwKICAgICAgeyBpZDogJ3BoYXNlLWludGVncmF0aW9uJywgdmFsOiAncGhhc2UtaW50ZWdyYXRpb24tdmFsJywgbjogc2Vzcy5pbnRlZ3JhdGlvbiwgbGFiZWw6IHNlc3MuaW50ZWdyYXRpb24gKyAnIHNlc3Npb25zJyB9LAogICAgXS5mb3JFYWNoKHAgPT4gewogICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHAuaWQpOwogICAgICBjb25zdCB2bCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHAudmFsKTsKICAgICAgaWYgKGVsKSBlbC5zdHlsZS53aWR0aCA9IE1hdGgucm91bmQocC5uIC8gbWF4U2VzcyAqIDEwMCkgKyAnJSc7CiAgICAgIGlmICh2bCkgdmwudGV4dENvbnRlbnQgPSBwLmxhYmVsOwogICAgfSk7CiAgfSwgMzAwKTsKCiAgLy8gTWV0YQogIGNvbnN0IHNldEVsID0gKGlkLCB2YWwpID0+IHsgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IGlmIChlbCkgZWwudGV4dENvbnRlbnQgPSB2YWw7IH07CiAgc2V0RWwoJ3Nlc3MtZnJlcXVlbmN5Jywgc2Vzcy5mcmVxdWVuY3kpOwogIHNldEVsKCdzZXNzLXRpbWVsaW5lJywgIHNlc3MudGltZWxpbmUpOwogIHNldEVsKCdzZXNzLXR5cGUnLCAgICAgIHNlc3MucHJvZ1R5cGUpOwoKICAvLyBBZGp1c3RtZW50IHJvd3MKICBjb25zdCBhZGpDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRqLXJvd3MnKTsKICBpZiAoYWRqQ29udGFpbmVyKSB7CiAgICBhZGpDb250YWluZXIuaW5uZXJIVE1MID0gc2Vzcy5hZGpMYWJlbHMubWFwKHJvdyA9PiB7CiAgICAgIGNvbnN0IGNscyA9IHJvdy5iYXNlIHx8IHJvdy50b3RhbCA/ICcnIDogcm93LnZhbCA+IDAgPyAncG9zJyA6IHJvdy52YWwgPCAwID8gJ25lZycgOiAnemVybyc7CiAgICAgIGNvbnN0IHZhbFN0ciA9IHJvdy5iYXNlIHx8IHJvdy50b3RhbAogICAgICAgID8gJzxzcGFuIGNsYXNzPSJhZGotdmFsIiBzdHlsZT0iY29sb3I6dmFyKC0taW5rKTsgZm9udC13ZWlnaHQ6NjAwOyI+JyArIChyb3cudmFsKSArICc8L3NwYW4+JwogICAgICAgIDogJzxzcGFuIGNsYXNzPSJhZGotdmFsICcgKyAoY2xzKSArICciPicgKyAocm93LnZhbCA+IDAgPyAnKycgOiAnJykgKyAocm93LnZhbCkgKyAnPC9zcGFuPic7CiAgICAgIGNvbnN0IGtleVN0eWxlID0gcm93LnRvdGFsID8gJ2ZvbnQtd2VpZ2h0OjYwMDsgY29sb3I6dmFyKC0taW5rMik7JyA6ICcnOwogICAgICByZXR1cm4gJzxkaXYgY2xhc3M9ImFkai1yb3ciICcgKyAocm93LnRvdGFsID8gJ3N0eWxlPSJib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1saW5lMik7IG1hcmdpbi10b3A6NHB4OyBwYWRkaW5nLXRvcDo4cHg7IicgOiAnJykgKyAnPlxcbiAgICAgICAgPHNwYW4gY2xhc3M9ImFkai1rZXkiIHN0eWxlPSInICsgKGtleVN0eWxlKSArICciPicgKyAocm93LmxhYmVsKSArICc8L3NwYW4+JyArICh2YWxTdHIpICsgJ1xcbiAgICAgIDwvZGl2Pic7CiAgICB9KS5qb2luKCcnKTsKICB9CgogIC8vIFRvdGFsIGludmVzdG1lbnQKICBjb25zdCBpbnZlc3RCbG9jayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzLWludmVzdG1lbnQnKTsKICBjb25zdCBpbnZlc3RWYWwgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXNzLWludmVzdG1lbnQtdmFsJyk7CiAgaWYgKHNlc3MudG90YWxJbnZlc3RtZW50ICYmIGludmVzdEJsb2NrICYmIGludmVzdFZhbCkgewogICAgaW52ZXN0QmxvY2suc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgIGludmVzdFZhbC50ZXh0Q29udGVudCA9ICdcdTIwQjknICsgc2Vzcy50b3RhbEludmVzdG1lbnQudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJyk7CiAgfSBlbHNlIGlmIChpbnZlc3RCbG9jaykgewogICAgaW52ZXN0QmxvY2suc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICB9Cn0KCgovKiBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAKICAgU1RBVEUKXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwICovCmxldCBzdGF0ZSA9IHsKICBjdXJyZW50U3RlcDogMCwgIC8vIDA9bmFtZSwgMS04PXN0ZXBzLCA5PXJlc3VsdHMKICB1c2VyOiB7IGZpcnN0OicnLCBsYXN0OicnLCBlbWFpbDonJywgZGF0ZTonJyB9LAogIGdvYWw6IG51bGwsICAgICAgICAgICAvLyBHT0FMU1tpXQogIGNoYWxsZW5nZVJhdGluZ3M6IHt9LCAvLyAnc2VjdGlvbi1xJzogMC0zCiAgbGlmZXN0eWxlOiB7fSwgICAgICAgICAvLyBrZXk6IHNjb3JlCiAgZXhwU2NvcmU6IG51bGwsCiAgc3VwcG9ydE9wdGlvbjogbnVsbCwgICAvLyBTVVBQT1JUX09QVElPTlNbaV0KICBjb21taXRTY29yZTogbnVsbCwKICBwZXJzb25hbFNjb3JlOiBudWxsLAogIGludGVncmF0ZVNjb3JlOiBudWxsLAp9OwoKLyogXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwCiAgIFNURVAgU1VNTUFSSUVTIChzaG93biBpbiBjb2xsYXBzZWQgY2hpcHMpClx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MCAqLwpjb25zdCBTVEVQX1NVTU1BUklFUyA9IHt9OwoKLyogXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwCiAgIEJVSUxEIFVJClx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MCAqLwpmdW5jdGlvbiBidWlsZEdvYWxHcmlkKCkgewogIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ29hbC1ncmlkJyk7CiAgZ3JpZC5pbm5lckhUTUwgPSAnJzsKICBHT0FMUy5mb3JFYWNoKChnLCBpKSA9PiB7CiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGJ0bi5jbGFzc05hbWUgPSAnZ29hbC1idG4nICsgKGcuZGlzY3VzcyA/ICcgZGlzY3VzcycgOiAnJyk7CiAgICBidG4uaW5uZXJIVE1MID0gKGcubGFiZWwpICsgJzxzcGFuIGNsYXNzPSJnb2FsLW11bHQiPicgKyAoZy5kaXNjdXNzID8gJ29uIHJlcXVlc3QnIDogJ1x1MDBENycgKyBnLm11bHQudG9GaXhlZCgxKSkgKyAnPC9zcGFuPic7CiAgICBidG4ub25jbGljayA9ICgpID0+IHsKICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmdvYWwtYnRuJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7CiAgICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICBzdGF0ZS5nb2FsID0gZzsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAxLW5leHQnKS5kaXNhYmxlZCA9IGZhbHNlOwogICAgfTsKICAgIGdyaWQuYXBwZW5kQ2hpbGQoYnRuKTsKICB9KTsKfQoKZnVuY3Rpb24gYnVpbGRDaGFsbGVuZ2VzKCkgewogIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFsbGVuZ2Utc2VjdGlvbnMnKTsKICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7CiAgY29uc3QgTEFCRUxTID0gWycwJywgJzEnLCAnMicsICczJ107CiAgY29uc3QgU1VCTEFCRUxTID0gWydOZXZlcicsICdPY2Nhc2lvbmFsbHknLCAnRnJlcXVlbnRseScsICdBbHdheXMnXTsKICBDSEFMTEVOR0VfU0VDVElPTlMuZm9yRWFjaChzZWN0aW9uID0+IHsKICAgIGNvbnN0IHNlYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgc2VjLmNsYXNzTmFtZSA9ICdjaGFsbGVuZ2Utc2VjdGlvbic7CiAgICBzZWMuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9ImNoYWxsZW5nZS1zZWN0aW9uLXRpdGxlIj4nICsgKHNlY3Rpb24udGl0bGUpICsgJzwvZGl2Pic7CiAgICBzZWN0aW9uLml0ZW1zLmZvckVhY2goKGl0ZW0sIHFpKSA9PiB7CiAgICAgIGNvbnN0IGtleSA9IHNlY3Rpb24udGl0bGUgKyAnLScgKyBxaTsKICAgICAgc3RhdGUuY2hhbGxlbmdlUmF0aW5nc1trZXldID0gMDsgLy8gZGVmYXVsdCAwCiAgICAgIGNvbnN0IGl0ZW1EaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgaXRlbURpdi5jbGFzc05hbWUgPSAnY2hhbGxlbmdlLWl0ZW0nOwogICAgICBjb25zdCByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgcm93LmNsYXNzTmFtZSA9ICdyYXRpbmctcm93JzsKICAgICAgTEFCRUxTLmZvckVhY2goKGxibCwgbGkpID0+IHsKICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICBidG4uY2xhc3NOYW1lID0gJ3JhdGluZy1idG4nICsgKGxpID09PSAwID8gJyBzZWxlY3RlZCcgOiAnJyk7CiAgICAgICAgYnRuLmlubmVySFRNTCA9IChsYmwpICsgJzxzcGFuIGNsYXNzPSJyLWxhYmVsIj4nICsgKFNVQkxBQkVMU1tsaV0pICsgJzwvc3Bhbj4nOwogICAgICAgIGJ0bi5vbmNsaWNrID0gKCkgPT4gewogICAgICAgICAgcm93LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yYXRpbmctYnRuJykuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKSk7CiAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKICAgICAgICAgIHN0YXRlLmNoYWxsZW5nZVJhdGluZ3Nba2V5XSA9IGxpOwogICAgICAgICAgdXBkYXRlQ2hhbGxlbmdlU2NvcmUoKTsKICAgICAgICB9OwogICAgICAgIHJvdy5hcHBlbmRDaGlsZChidG4pOwogICAgICB9KTsKICAgICAgaXRlbURpdi5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0iY2hhbGxlbmdlLXEiPicgKyAoaXRlbSkgKyAnPC9kaXY+JzsKICAgICAgaXRlbURpdi5hcHBlbmRDaGlsZChyb3cpOwogICAgICBzZWMuYXBwZW5kQ2hpbGQoaXRlbURpdik7CiAgICB9KTsKICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWMpOwogIH0pOwogIHVwZGF0ZUNoYWxsZW5nZVNjb3JlKCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUNoYWxsZW5nZVNjb3JlKCkgewogIGNvbnN0IHRvdGFsID0gT2JqZWN0LnZhbHVlcyhzdGF0ZS5jaGFsbGVuZ2VSYXRpbmdzKS5yZWR1Y2UoKGEsYik9PmErYiwwKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhbGxlbmdlLXNjb3JlLWRpc3BsYXknKS50ZXh0Q29udGVudCA9IHRvdGFsOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFsbGVuZ2UtYmFyLWZpbGwnKS5zdHlsZS53aWR0aCA9ICh0b3RhbC83MioxMDApKyclJzsKfQoKZnVuY3Rpb24gYnVpbGRPcHRpb25HcmlkKGNvbnRhaW5lcklkLCBvcHRpb25zLCBzdGF0ZUtleSwgbmV4dEJ0bklkKSB7CiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNvbnRhaW5lcklkKTsKICBncmlkLmlubmVySFRNTCA9ICcnOwogIG9wdGlvbnMuZm9yRWFjaCgob3B0LCBpKSA9PiB7CiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGJ0bi5jbGFzc05hbWUgPSAnb3B0aW9uLWJ0bic7CiAgICBidG4uaW5uZXJIVE1MID0gJzxzcGFuIGNsYXNzPSJvcHQtbGFiZWwiPicgKyAob3B0LmxhYmVsKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9Im9wdC1zdWIiPicgKyAob3B0LnN1YikgKyAnPC9zcGFuPic7CiAgICBidG4ub25jbGljayA9ICgpID0+IHsKICAgICAgZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcub3B0aW9uLWJ0bicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpOwogICAgICBidG4uY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTsKICAgICAgc3RhdGVbc3RhdGVLZXldID0gb3B0OwogICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChuZXh0QnRuSWQpLmRpc2FibGVkID0gZmFsc2U7CiAgICB9OwogICAgZ3JpZC5hcHBlbmRDaGlsZChidG4pOwogIH0pOwp9CgpmdW5jdGlvbiBidWlsZExpZmVzdHlsZVNlY3Rpb25zKCkgewogIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWZlc3R5bGUtc2VjdGlvbnMnKTsKICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7CiAgbGV0IGFsbFNlbGVjdGVkID0gKCkgPT4gTElGRVNUWUxFX1NFQ1RJT05TLmV2ZXJ5KHMgPT4gc3RhdGUubGlmZXN0eWxlW3Mua2V5XSAhPT0gdW5kZWZpbmVkKTsKCiAgTElGRVNUWUxFX1NFQ1RJT05TLmZvckVhY2goc2VjdGlvbiA9PiB7CiAgICBjb25zdCBzZWMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIHNlYy5zdHlsZS5tYXJnaW5Cb3R0b20gPSAnMS41cmVtJzsKICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICB0aXRsZS5jbGFzc05hbWUgPSAnY2hhbGxlbmdlLXNlY3Rpb24tdGl0bGUnOwogICAgdGl0bGUuc3R5bGUubWFyZ2luQm90dG9tID0gJzAuNjVyZW0nOwogICAgdGl0bGUudGV4dENvbnRlbnQgPSBzZWN0aW9uLnRpdGxlOwogICAgc2VjLmFwcGVuZENoaWxkKHRpdGxlKTsKICAgIGNvbnN0IGdyaWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGdyaWQuY2xhc3NOYW1lID0gJ29wdGlvbi1ncmlkJzsKICAgIGlmIChzZWN0aW9uLm9wdGlvbnMubGVuZ3RoID4gNCkgZ3JpZC5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID0gJ3JlcGVhdCgzLDFmciknOwogICAgc2VjdGlvbi5vcHRpb25zLmZvckVhY2gob3B0ID0+IHsKICAgICAgY29uc3QgYnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgICAgIGJ0bi5jbGFzc05hbWUgPSAnb3B0aW9uLWJ0bic7CiAgICAgIGJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9Im9wdC1sYWJlbCI+JyArIChvcHQubGFiZWwpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz0ib3B0LXN1YiI+JyArIChvcHQuc3ViKSArICc8L3NwYW4+JzsKICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgICAgZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCcub3B0aW9uLWJ0bicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJykpOwogICAgICAgIGJ0bi5jbGFzc0xpc3QuYWRkKCdzZWxlY3RlZCcpOwogICAgICAgIHN0YXRlLmxpZmVzdHlsZVtzZWN0aW9uLmtleV0gPSB7IGxhYmVsOiBvcHQubGFiZWwsIHNjb3JlOiBvcHQuc2NvcmUgfTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcDMtbmV4dCcpLmRpc2FibGVkID0gIWFsbFNlbGVjdGVkKCk7CiAgICAgIH07CiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoYnRuKTsKICAgIH0pOwogICAgc2VjLmFwcGVuZENoaWxkKGdyaWQpOwogICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHNlYyk7CiAgfSk7Cn0KCi8qIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICBOQVZJR0FUSU9OClx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MCAqLwpmdW5jdGlvbiBzZXRQcm9ncmVzcyhzdGVwKSB7CiAgLy8gc3RlcCAwPW5hbWUsIDEtOD1zdGVwcywgOT1yZXN1bHRzCiAgY29uc3QgdG90YWxTdGVwcyA9IDk7CiAgY29uc3QgcGN0ID0gc3RlcCA9PT0gMCA/IDUgOiBNYXRoLnJvdW5kKChzdGVwIC8gOCkgKiAxMDApOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9ncmVzcy1maWxsJykuc3R5bGUud2lkdGggPSBwY3QgKyAnJSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2dyZXNzLWxhYmVsJykudGV4dENvbnRlbnQgPQogICAgc3RlcCA9PT0gMCA/ICdCZWdpbiB5b3VyIGFzc2Vzc21lbnQnCiAgICA6IHN0ZXAgPT09IDkgPyAnQXNzZXNzbWVudCBjb21wbGV0ZScKICAgIDogJ1N0ZXAgJyArIChzdGVwKSArICcgb2YgOCc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2dyZXNzLWZyYWMnKS50ZXh0Q29udGVudCA9CiAgICBzdGVwID09PSAwID8gJycgOiBzdGVwID09PSA5ID8gJzEwMCUnIDogTWF0aC5yb3VuZChwY3QpICsgJyUnOwp9Cgpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmFtZS1uZXh0LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogIHN0YXRlLnVzZXIuZmlyc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1maXJzdCcpLnZhbHVlLnRyaW0oKTsKICBzdGF0ZS51c2VyLmxhc3QgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbGFzdCcpLnZhbHVlLnRyaW0oKTsKICBzdGF0ZS51c2VyLmVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItZW1haWwnKS52YWx1ZS50cmltKCk7CiAgc3RhdGUudXNlci5kYXRlICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLWRhdGUnKS52YWx1ZSB8fCBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nKTsKCiAgaWYgKCFzdGF0ZS51c2VyLmZpcnN0KSB7IGFsZXJ0KCdQbGVhc2UgZW50ZXIgeW91ciBmaXJzdCBuYW1lIHRvIGNvbnRpbnVlLicpOyByZXR1cm47IH0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmFtZS1zdGVwJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICBzaG93U3RlcCgxKTsKfSk7CgpmdW5jdGlvbiBzaG93U3RlcChuKSB7CiAgICBjb25zb2xlLmxvZygic2hvd1N0ZXAiLCBuKTsKICBmb3IgKGxldCBpID0gMTsgaSA8PSA4OyBpKyspIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLScraSsnLWNhcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIH0KICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RlcC0nK24rJy1jYXJkJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgc3RhdGUuY3VycmVudFN0ZXAgPSBuOwogIHNldFByb2dyZXNzKG4pOwogIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOwp9CgpmdW5jdGlvbiBuZXh0U3RlcChuKSB7CiAgLy8gU2F2ZSBzdW1tYXJ5IGZvciBjb2xsYXBzZWQgdmlldwogIHNhdmVTdW1tYXJ5KG4pOwogIHNob3dTdGVwKG4gKyAxKTsKfQoKZnVuY3Rpb24gZ29CYWNrKG4pIHsKICBpZiAobiA9PT0gMSkgewogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hbWUtc3RlcCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0ZXAtMS1jYXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgIHNldFByb2dyZXNzKDApOwogIH0gZWxzZSB7CiAgICBzaG93U3RlcChuIC0gMSk7CiAgfQp9CgpmdW5jdGlvbiBzYXZlU3VtbWFyeShzdGVwKSB7CiAgLy8gU3RvcmUgZm9yIFBERiBhbmQgY29tcGxldGVkIGNoaXBzIChmdXR1cmUgdXNlKQogIFNURVBfU1VNTUFSSUVTW3N0ZXBdID0gZ2V0U3RlcFN1bW1hcnkoc3RlcCk7Cn0KCmZ1bmN0aW9uIGdldFN0ZXBTdW1tYXJ5KHN0ZXApIHsKICBzd2l0Y2goc3RlcCkgewogICAgY2FzZSAxOiByZXR1cm4gc3RhdGUuZ29hbCA/IHN0YXRlLmdvYWwubGFiZWwgOiAnJzsKICAgIGNhc2UgMjogcmV0dXJuICdDaGFsbGVuZ2Ugc2NvcmU6ICcgKyBPYmplY3QudmFsdWVzKHN0YXRlLmNoYWxsZW5nZVJhdGluZ3MpLnJlZHVjZSgoYSxiKT0+YStiLDApICsgJyAvIDcyJzsKICAgIGNhc2UgMzogcmV0dXJuIE9iamVjdC52YWx1ZXMoc3RhdGUubGlmZXN0eWxlKS5tYXAodj0+di5sYWJlbCkuam9pbignIFx1MDBCNyAnKTsKICAgIGNhc2UgNDogcmV0dXJuIHN0YXRlLmV4cFNjb3JlID8gc3RhdGUuZXhwU2NvcmUubGFiZWwgOiAnJzsKICAgIGNhc2UgNTogcmV0dXJuIHN0YXRlLnN1cHBvcnRPcHRpb24gPyBzdGF0ZS5zdXBwb3J0T3B0aW9uLmxhYmVsIDogJyc7CiAgICBjYXNlIDY6IHJldHVybiBzdGF0ZS5jb21taXRTY29yZSA/IHN0YXRlLmNvbW1pdFNjb3JlLmxhYmVsIDogJyc7CiAgICBjYXNlIDc6IHJldHVybiBzdGF0ZS5wZXJzb25hbFNjb3JlID8gc3RhdGUucGVyc29uYWxTY29yZS5sYWJlbCA6ICcnOwogICAgY2FzZSA4OiByZXR1cm4gc3RhdGUuaW50ZWdyYXRlU2NvcmUgPyBzdGF0ZS5pbnRlZ3JhdGVTY29yZS5sYWJlbCA6ICcnOwogIH0KICByZXR1cm4gJyc7Cn0KCi8qIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICBDT01QVVRFIFJFU1VMVFMKXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwICovCmZ1bmN0aW9uIGNvbXB1dGVSZXN1bHRzKCkgewogIHNhdmVTdW1tYXJ5KDgpOwoKICAvLyBcdTI1MDBcdTI1MDAgVGFsbHkgc2NvcmVzIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMAogIGNvbnN0IGNoYWxsZW5nZVRvdGFsID0gT2JqZWN0LnZhbHVlcyhzdGF0ZS5jaGFsbGVuZ2VSYXRpbmdzKS5yZWR1Y2UoKGEsYik9PmErYiwwKTsKCiAgY29uc3QgbGlmZXN0eWxlVG90YWwgPSBPYmplY3QudmFsdWVzKHN0YXRlLmxpZmVzdHlsZSkucmVkdWNlKChhLG8pPT5hK28uc2NvcmUsMCk7CgogIGNvbnN0IGV4cFRvdGFsICAgICAgPSBzdGF0ZS5leHBTY29yZSAgICAgPyBzdGF0ZS5leHBTY29yZS5zY29yZSAgICAgOiAwOwogIGNvbnN0IHN1cHBvcnRTY29yZSAgPSBzdGF0ZS5zdXBwb3J0T3B0aW9uPyBzdGF0ZS5zdXBwb3J0T3B0aW9uLnNjb3JlIDogMDsKICBjb25zdCBjb21taXRUb3RhbCAgID0gc3RhdGUuY29tbWl0U2NvcmUgID8gc3RhdGUuY29tbWl0U2NvcmUuc2NvcmUgIDogMDsKICBjb25zdCBwZXJzb25hbFRvdGFsID0gc3RhdGUucGVyc29uYWxTY29yZT8gc3RhdGUucGVyc29uYWxTY29yZS5zY29yZTogMDsKICBjb25zdCBpbnRlZ3JhdGVUb3RhbD0gc3RhdGUuaW50ZWdyYXRlU2NvcmU/c3RhdGUuaW50ZWdyYXRlU2NvcmUuc2NvcmU6MDsKCiAgY29uc3QgR1JBTkRfVE9UQUwgPSBjaGFsbGVuZ2VUb3RhbCArIGxpZmVzdHlsZVRvdGFsICsgZXhwVG90YWwgKwogICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydFNjb3JlICsgY29tbWl0VG90YWwgKyBwZXJzb25hbFRvdGFsICsgaW50ZWdyYXRlVG90YWw7CgogIC8vIFx1MjUwMFx1MjUwMCBEZXRlcm1pbmUgbGV2ZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwCiAgY29uc3QgbGV2ZWwgPSBMRVZFTFMuZmluZChsID0+IEdSQU5EX1RPVEFMID49IGwubWluICYmIEdSQU5EX1RPVEFMIDw9IGwubWF4KSB8fCBMRVZFTFNbTEVWRUxTLmxlbmd0aC0xXTsKCiAgLy8gXHUyNTAwXHUyNTAwIERldGVybWluZSBmZWUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwCiAgY29uc3QgZ29hbCA9IHN0YXRlLmdvYWwgfHwgR09BTFNbMF07CiAgY29uc3QgbXVsdCA9IGdvYWwubXVsdCB8fCBudWxsOwogIGNvbnN0IGJhc2VGZWUgPSBsZXZlbC5iYXNlOwogIGNvbnN0IHN1cHBvcnRGZWUgPSBzdGF0ZS5zdXBwb3J0T3B0aW9uID8gc3RhdGUuc3VwcG9ydE9wdGlvbi5mZWUgOiAwOwogIGNvbnN0IGlzTWFzdGVyID0gbGV2ZWwubmFtZSA9PT0gJ01hc3RlciBNZW50b3JpbmcnOwogIGNvbnN0IGlzRGlzY3VzcyA9IGdvYWwuZGlzY3VzczsKCiAgbGV0IGZpbmFsRmVlID0gbnVsbDsKICBpZiAoIWlzTWFzdGVyICYmICFpc0Rpc2N1c3MgJiYgYmFzZUZlZSAhPT0gbnVsbCkgewogICAgZmluYWxGZWUgPSBNYXRoLnJvdW5kKGJhc2VGZWUgKiAobXVsdHx8MSkpICsgc3VwcG9ydEZlZTsKICB9CgogIC8vIFx1MjUwMFx1MjUwMCBTdG9yZSBmb3IgUERGIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMAogIHdpbmRvdy5fYXNzZXNzbWVudERhdGEgPSB7CiAgICB1c2VyOiBzdGF0ZS51c2VyLCBnb2FsLCBjaGFsbGVuZ2VUb3RhbCwgbGlmZXN0eWxlVG90YWwsCiAgICBleHBUb3RhbCwgc3VwcG9ydFNjb3JlLCBjb21taXRUb3RhbCwgcGVyc29uYWxUb3RhbCwgaW50ZWdyYXRlVG90YWwsCiAgICBHUkFORF9UT1RBTCwgbGV2ZWwsIG11bHQsIGJhc2VGZWUsIHN1cHBvcnRGZWUsIGZpbmFsRmVlLAogICAgaXNNYXN0ZXIsIGlzRGlzY3VzcywKICAgIGNoYWxsZW5nZVJhdGluZ3M6IHN0YXRlLmNoYWxsZW5nZVJhdGluZ3MsCiAgICBsaWZlc3R5bGU6IHN0YXRlLmxpZmVzdHlsZSwKICAgIGV4cE9wdGlvbjogc3RhdGUuZXhwU2NvcmUsCiAgICBzdXBwb3J0T3B0aW9uOiBzdGF0ZS5zdXBwb3J0T3B0aW9uLAogICAgY29tbWl0T3B0aW9uOiBzdGF0ZS5jb21taXRTY29yZSwKICAgIHBlcnNvbmFsT3B0aW9uOiBzdGF0ZS5wZXJzb25hbFNjb3JlLAogICAgaW50ZWdyYXRlT3B0aW9uOiBzdGF0ZS5pbnRlZ3JhdGVTY29yZSwKICAgIFNURVBfU1VNTUFSSUVTLAogIH07CgogIC8vIFx1MjUwMFx1MjUwMCBDb21wdXRlIHNlc3Npb25zCiAgY29uc3Qgc2Vzc0RhdGEgPSBjb21wdXRlU2Vzc2lvbnMod2luZG93Ll9hc3Nlc3NtZW50RGF0YSk7CiAgd2luZG93Ll9hc3Nlc3NtZW50RGF0YS5zZXNzaW9ucyA9IHNlc3NEYXRhOwoKICAvLyBcdTI1MDBcdTI1MDAgUmVuZGVyIHJlc3VsdHMgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Fzc2Vzc21lbnQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRyby1ibG9jaycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25hbWUtc3RlcCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgY29uc3QgcmVzdWx0c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3VsdHMnKTsKICByZXN1bHRzRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgc2V0UHJvZ3Jlc3MoOSk7CgogIC8vIE5hbWUKICBjb25zdCBuYW1lID0gW3N0YXRlLnVzZXIuZmlyc3QsIHN0YXRlLnVzZXIubGFzdF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdWx0cy1uYW1lJykudGV4dENvbnRlbnQgPQogICAgJ0Fzc2Vzc21lbnQgZm9yICcgKyBuYW1lICsgKHN0YXRlLnVzZXIuZGF0ZSA/ICcgXHUwMEI3ICcgKyBzdGF0ZS51c2VyLmRhdGUgOiAnJyk7CgogIC8vIFJlc29uYW5jZSBtZXRlcgogIGNvbnN0IHJtQmFuZHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncm0tYmFuZHMnKTsKICBybUJhbmRzLmlubmVySFRNTCA9ICcnOwogIExFVkVMUy5mb3JFYWNoKGwgPT4gewogICAgY29uc3QgaXNBY3RpdmUgPSBsLm5hbWUgPT09IGxldmVsLm5hbWU7CiAgICBjb25zdCBiYW5kUGN0ID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChNYXRoLm1pbihHUkFORF9UT1RBTCwgbC5tYXgpIC0gbC5taW4pIC8gKGwubWF4IC0gbC5taW4pICogMTAwKSk7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5jbGFzc05hbWUgPSAncm0tYmFuZCcgKyAoaXNBY3RpdmUgPyAnIGFjdGl2ZScgOiAnJyk7CiAgICBkaXYuaW5uZXJIVE1MID0gJ1xcbiAgICAgIDxzcGFuIGNsYXNzPSJybS1iYW5kLW51bSI+JyArIChsLnJhbmdlKSArICc8L3NwYW4+XFxuICAgICAgPHNwYW4gY2xhc3M9InJtLWJhbmQtbmFtZSI+JyArIChsLm5hbWUpICsgJzwvc3Bhbj5cXG4gICAgICA8ZGl2IGNsYXNzPSJybS1iYW5kLWJhciI+PGRpdiBjbGFzcz0icm0tYmFuZC1maWxsIiBzdHlsZT0id2lkdGg6JyArIChpc0FjdGl2ZT8xMDA6MCkgKyAnJSI+PC9kaXY+PC9kaXY+XFxuICAgICAgJyArIChpc0FjdGl2ZSA/ICc8c3BhbiBjbGFzcz0icm0tc2NvcmUtY291bnQiIGlkPSJybS1jb3VudCI+MDwvc3Bhbj4nIDogJycpICsgJ1xcbiAgICAnOwogICAgcm1CYW5kcy5hcHBlbmRDaGlsZChkaXYpOwogIH0pOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdybS1zY29yZS1sYWJlbCcpLnRleHRDb250ZW50ID0gJ1RvdGFsIHNjb3JlOiAnICsgR1JBTkRfVE9UQUw7CgogIC8vIEFuaW1hdGUgc2NvcmUgY291bnQKICBjb25zdCBjb3VudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JtLWNvdW50Jyk7CiAgaWYgKGNvdW50RWwpIHsKICAgIGxldCBjdXIgPSAwOwogICAgY29uc3Qgc3RlcCA9IE1hdGguY2VpbChHUkFORF9UT1RBTCAvIDQwKTsKICAgIGNvbnN0IGl2ID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBjdXIgPSBNYXRoLm1pbihjdXIgKyBzdGVwLCBHUkFORF9UT1RBTCk7CiAgICAgIGNvdW50RWwudGV4dENvbnRlbnQgPSBjdXI7CiAgICAgIGlmIChjdXIgPj0gR1JBTkRfVE9UQUwpIGNsZWFySW50ZXJ2YWwoaXYpOwogICAgfSwgNDApOwogIH0KCiAgLy8gU2NvcmUgYnJlYWtkb3duIGJhcnMKICBjb25zdCBicmVha2Rvd25EYXRhID0gWwogICAgeyBsYWJlbDogJ1ByZXNlbnQgY2hhbGxlbmdlcycsIHNjb3JlOiBjaGFsbGVuZ2VUb3RhbCwgbWF4OiA3MiB9LAogICAgeyBsYWJlbDogJ0xpZmVzdHlsZSBjb21wbGV4aXR5Jywgc2NvcmU6IGxpZmVzdHlsZVRvdGFsLCBtYXg6IDMwIH0sCiAgICB7IGxhYmVsOiAnTWVkaXRhdGlvbiBleHBlcmllbmNlJywgc2NvcmU6IGV4cFRvdGFsLCBtYXg6IDIgfSwKICAgIHsgbGFiZWw6ICdTdXBwb3J0IGxldmVsJywgc2NvcmU6IHN1cHBvcnRTY29yZSwgbWF4OiAxMCB9LAogICAgeyBsYWJlbDogJ0RhaWx5IGNvbW1pdG1lbnQnLCBzY29yZTogY29tbWl0VG90YWwsIG1heDogNiB9LAogICAgeyBsYWJlbDogJ1BlcnNvbmFsaXNhdGlvbiBuZWVkZWQnLCBzY29yZTogcGVyc29uYWxUb3RhbCwgbWF4OiA4IH0sCiAgICB7IGxhYmVsOiAnSW50ZWdyYXRpb24gc2NvcGUnLCBzY29yZTogaW50ZWdyYXRlVG90YWwsIG1heDogMTAgfSwKICBdOwogIGNvbnN0IGJyZWFrZG93bkNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzY29yZS1icmVha2Rvd24tcm93cycpOwogIGJyZWFrZG93bkNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsKICBicmVha2Rvd25EYXRhLmZvckVhY2gocm93ID0+IHsKICAgIGNvbnN0IHBjdCA9IE1hdGgucm91bmQocm93LnNjb3JlIC8gcm93Lm1heCAqIDEwMCk7CiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgIGRpdi5jbGFzc05hbWUgPSAnc2Itcm93JzsKICAgIGRpdi5pbm5lckhUTUwgPSAnXFxuICAgICAgPHNwYW4gY2xhc3M9InNiLWxhYmVsIj4nICsgKHJvdy5sYWJlbCkgKyAnPC9zcGFuPlxcbiAgICAgIDxkaXYgY2xhc3M9InNiLWJhci10cmFjayI+PGRpdiBjbGFzcz0ic2ItYmFyLWZpbGwiIHN0eWxlPSJ3aWR0aDowJSIgZGF0YS10YXJnZXQ9IicgKyAocGN0KSArICciPjwvZGl2PjwvZGl2PlxcbiAgICAgIDxzcGFuIGNsYXNzPSJzYi12YWwiPicgKyAocm93LnNjb3JlKSArICcgLyAnICsgKHJvdy5tYXgpICsgJzwvc3Bhbj5cXG4gICAgJzsKICAgIGJyZWFrZG93bkNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpOwogIH0pOwogIC8vIEFuaW1hdGUgYmFycwogIHNldFRpbWVvdXQoKCkgPT4gewogICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNiLWJhci1maWxsJykuZm9yRWFjaChiYXIgPT4gewogICAgICBiYXIuc3R5bGUud2lkdGggPSBiYXIuZGF0YXNldC50YXJnZXQgKyAnJSc7CiAgICB9KTsKICB9LCAyMDApOwoKICAvLyBSZW5kZXIgc2Vzc2lvbnMgYmxvY2sKICByZW5kZXJTZXNzaW9ucyhzZXNzRGF0YSk7CgogIC8vIFJlc3VsdCBjYXJkcwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYy1sZXZlbCcpLnRleHRDb250ZW50ID0gbGV2ZWwubmFtZTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmMtbGV2ZWwtZGVzYycpLnRleHRDb250ZW50ID0gbGV2ZWwuZGVzYzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmMtZ29hbCcpLnRleHRDb250ZW50ID0gZ29hbC5sYWJlbDsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmMtbXVsdGlwbGllcicpLnRleHRDb250ZW50ID0gbXVsdCA/ICdcdTAwRDcnICsgbXVsdC50b0ZpeGVkKDEpIDogJ0J5IGRpc2N1c3Npb24nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYy1zdXBwb3J0JykudGV4dENvbnRlbnQgPSBzdGF0ZS5zdXBwb3J0T3B0aW9uID8gc3RhdGUuc3VwcG9ydE9wdGlvbi5sYWJlbCA6ICdcdTIwMTQnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYy1zdXBwb3J0LWRlc2MnKS50ZXh0Q29udGVudCA9IHN0YXRlLnN1cHBvcnRPcHRpb24gPyBzdGF0ZS5zdXBwb3J0T3B0aW9uLnN1YiA6ICcnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYy10b3RhbC1zY29yZScpLnRleHRDb250ZW50ID0gR1JBTkRfVE9UQUw7CgogIC8vIEZlZSBjYWxjdWxhdGlvbgogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYy1sZXZlbCcpLnRleHRDb250ZW50ID0gbGV2ZWwubmFtZTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmMtYmFzZScpLnRleHRDb250ZW50ID0gaXNNYXN0ZXIgPyAnQnkgZGlzY3Vzc2lvbicgOiAoYmFzZUZlZSA9PT0gMCA/ICdGcmVlJyA6ICdcdTIwQjknICsgYmFzZUZlZS50b0xvY2FsZVN0cmluZygnZW4tSU4nKSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZjLWdvYWwnKS50ZXh0Q29udGVudCA9IGdvYWwubGFiZWwgKyAobXVsdCA/ICcgXHUwMEQ3JyArIG11bHQudG9GaXhlZCgxKSA6ICcnKTsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmMtbXVsdCcpLnRleHRDb250ZW50ID0gbXVsdCA/ICdcdTAwRDcnICsgbXVsdC50b0ZpeGVkKDEpIDogJ0J5IGRpc2N1c3Npb24nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYy1zdWInKS50ZXh0Q29udGVudCA9ICghaXNNYXN0ZXIgJiYgIWlzRGlzY3VzcyAmJiBiYXNlRmVlIT09bnVsbCAmJiBtdWx0KQogICAgPyAnXHUyMEI5JyArIE1hdGgucm91bmQoYmFzZUZlZSAqIG11bHQpLnRvTG9jYWxlU3RyaW5nKCdlbi1JTicpCiAgICA6IGlzTWFzdGVyID8gJ0J5IGRpc2N1c3Npb24nIDogJ1x1MjBCOScgKyAoYmFzZUZlZXx8MCkudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJyk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZjLXN1cHBvcnQnKS50ZXh0Q29udGVudCA9IHN0YXRlLnN1cHBvcnRPcHRpb24gPyBzdGF0ZS5zdXBwb3J0T3B0aW9uLmxhYmVsIDogJ1x1MjAxNCc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZjLXN1cHBvcnQtZmVlJykudGV4dENvbnRlbnQgPSAnXHUyMEI5JyArIHN1cHBvcnRGZWUudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJyk7CgogIGlmIChpc01hc3RlciB8fCBpc0Rpc2N1c3MpIHsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYy10b3RhbCcpLnRleHRDb250ZW50ID0gJ0J5IERpc2N1c3Npb24nOwogICAgY29uc3Qgbm90ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYy1tYXN0ZXItbm90ZScpOwogICAgbm90ZS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICAgIG5vdGUuaW5uZXJIVE1MID0gaXNNYXN0ZXIKICAgICAgPyAnPHN0cm9uZz5NYXN0ZXIgTWVudG9yaW5nPC9zdHJvbmc+IFx1MjAxNCBZb3VyIHJlc29uYW5jZSBzY29yZSBpbmRpY2F0ZXMgYSBkZXB0aCBvZiBlbmdhZ2VtZW50IHRoYXQgcmVxdWlyZXMgYSBwZXJzb25hbGlzZWQgZmVlIGNvbnZlcnNhdGlvbi4gUGxlYXNlIGJvb2sgYSBmcmVlIGludHJvZHVjdG9yeSBjYWxsIHdpdGggeW91ciBwcmFjdGl0aW9uZXIgdG8gZGlzY3VzcyB5b3VyIHByb2dyYW1tZSBhbmQgaW52ZXN0bWVudC4nCiAgICAgIDogJzxzdHJvbmc+T3RoZXIgU3BlY2lmaWMgR29hbDwvc3Ryb25nPiBcdTIwMTQgWW91ciBwcm9ncmFtbWUgd2lsbCBiZSBkZXNpZ25lZCBhcm91bmQgeW91ciBzcGVjaWZpYyBzaXR1YXRpb24uIFBsZWFzZSBzaGFyZSBtb3JlIGRldGFpbCBpbiB5b3VyIGZpcnN0IHNlc3Npb24gYW5kIHlvdXIgcHJhY3RpdGlvbmVyIHdpbGwgY29uZmlybSB0aGUgZmVlLic7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmMtd29ya2luZycpLnRleHRDb250ZW50ID0gJ1Njb3JlOiAnICsgR1JBTkRfVE9UQUwgKyAnIFx1MjE5MiBMZXZlbDogJyArIGxldmVsLm5hbWUgKyAnIFx1MjE5MiBGZWU6IGJ5IGRpc2N1c3Npb24nOwogIH0gZWxzZSB7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmMtdG90YWwnKS50ZXh0Q29udGVudCA9IGZpbmFsRmVlID09PSAwID8gJ0ZyZWUgKEV4cGVyaWVuY2UgbGV2ZWwpJyA6ICdcdTIwQjknICsgZmluYWxGZWUudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJyk7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmMtbWFzdGVyLW5vdGUnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZjLXdvcmtpbmcnKS50ZXh0Q29udGVudCA9CiAgICAgICdTY29yZSAnICsgKEdSQU5EX1RPVEFMKSArICcgXHUyMTkyICcgKyAobGV2ZWwubmFtZSkgKyAnIFx1MDBCNyBCYXNlIFx1MjBCOScgKyAoKGJhc2VGZWV8fDApLnRvTG9jYWxlU3RyaW5nKCdlbi1JTicpKSArICcgXHUwMEQ3ICcgKyAobXVsdCA/IG11bHQudG9GaXhlZCgxKSA6IDEpICsgJyA9IFx1MjBCOScgKyAoTWF0aC5yb3VuZCgoYmFzZUZlZXx8MCkqKG11bHR8fDEpKS50b0xvY2FsZVN0cmluZygnZW4tSU4nKSkgKyAnICsgU3VwcG9ydCBcdTIwQjknICsgKHN1cHBvcnRGZWUudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJykpICsgJyA9IFx1MjBCOScgKyAoZmluYWxGZWUudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJykpICsgJyBwZXIgc2Vzc2lvbic7CiAgfQoKICAvLyBOZXh0IHN0ZXBzCiAgY29uc3QgbmV4dFN0ZXBzID0gWwogICAgJ0Jvb2sgeW91ciBjb21wbGltZW50YXJ5IGludHJvZHVjdG9yeSBjYWxsIHdpdGggYSBXb25kZXJGZWVseiBwcmFjdGl0aW9uZXInLAogICAgJ1NoYXJlIHRoaXMgYXNzZXNzbWVudCByZXBvcnQgaW4geW91ciBmaXJzdCBzZXNzaW9uIGZvciBjb250ZXh0JywKICAgIGlzTWFzdGVyIHx8IEdSQU5EX1RPVEFMID4gOTAKICAgICAgPyAnQXQgeW91ciBsZXZlbCwgeW91ciBwcmFjdGl0aW9uZXIgd2lsbCBidWlsZCBhIGZ1bGx5IGJlc3Bva2UgcHJvZ3JhbW1lIGluIHlvdXIgZmlyc3Qgc2Vzc2lvbicKICAgICAgOiAnWW91ciBwcmFjdGl0aW9uZXIgd2lsbCBjb25maXJtIHlvdXIgcHJvZ3JhbW1lIHN0cnVjdHVyZSBhbmQgYmVnaW4gYXQgeW91ciBuZXh0IHNjaGVkdWxlZCBzZXNzaW9uJywKICAgICdBbGwgc2Vzc2lvbnMgYXJlIHByaXZhdGUgYW5kIG9uZS10by1vbmUgXHUyMDE0IG5vdGhpbmcgeW91IHNoYXJlIGxlYXZlcyB0aGUgc2Vzc2lvbicsCiAgICAnWW91ciBmaXJzdCBzZXNzaW9uIGluY2x1ZGVzIGEgZnVsbCByZXZpZXcgb2YgdGhpcyBhc3Nlc3NtZW50IHdpdGggeW91ciBwcmFjdGl0aW9uZXInLAogIF07CiAgY29uc3QgbnNMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25leHQtc3RlcHMtbGlzdCcpOwogIG5zTGlzdC5pbm5lckhUTUwgPSAnJzsKICBuZXh0U3RlcHMuZm9yRWFjaChzdGVwID0+IHsKICAgIGNvbnN0IGxpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGknKTsKICAgIGxpLnRleHRDb250ZW50ID0gc3RlcDsKICAgIG5zTGlzdC5hcHBlbmRDaGlsZChsaSk7CiAgfSk7CgogIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOwp9CgovKiBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTBcdTI1NTAKICAgUERGIEdFTkVSQVRJT04KXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwXHUyNTUwICovCmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkb3dubG9hZC1wZGYtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBnZW5lcmF0ZVBERik7CgpmdW5jdGlvbiBnZW5lcmF0ZVBERigpIHsKICBjb25zdCBkID0gd2luZG93Ll9hc3Nlc3NtZW50RGF0YTsKICBpZiAoIWQpIHJldHVybjsKICBjb25zdCB7IGpzUERGIH0gPSB3aW5kb3cuanNwZGY7CiAgY29uc3QgZG9jID0gbmV3IGpzUERGKHsgb3JpZW50YXRpb246ICdwb3J0cmFpdCcsIHVuaXQ6ICdtbScsIGZvcm1hdDogJ2E0JyB9KTsKCiAgY29uc3QgVyA9IDIxMCwgTUwgPSAxOCwgTVIgPSAxOCwgVFcgPSBXIC0gTUwgLSBNUjsKICBsZXQgeSA9IDIwOwoKICBjb25zdCBzZXRGb250ID0gKHN0eWxlLCBzaXplLCBjb2xvcikgPT4gewogICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsIHN0eWxlIHx8ICdub3JtYWwnKTsKICAgIGRvYy5zZXRGb250U2l6ZShzaXplIHx8IDExKTsKICAgIGlmIChjb2xvcikgZG9jLnNldFRleHRDb2xvciguLi5jb2xvcik7IGVsc2UgZG9jLnNldFRleHRDb2xvcigyOCwgMjUsIDIzKTsKICB9OwoKICBjb25zdCBsaW5lID0gKHgxLHkxLHgyLHkyLGNvbG9yKSA9PiB7CiAgICBkb2Muc2V0RHJhd0NvbG9yKC4uLihjb2xvcnx8WzIwMCwxOTIsMTgwXSkpOwogICAgZG9jLmxpbmUoeDEseTEseDIseTIpOwogIH07CgogIGNvbnN0IGFkZFBhZ2UgPSAoKSA9PiB7IGRvYy5hZGRQYWdlKCk7IHkgPSAyMDsgfTsKICBjb25zdCBjaGVja1kgPSAobmVlZGVkKSA9PiB7IGlmICh5ICsgbmVlZGVkID4gMjcwKSBhZGRQYWdlKCk7IH07CgogIC8vIFx1MjUwMFx1MjUwMCBQQUdFIDE6IEhlYWRlciArIHBlcnNvbmFsIGluZm8gKyBnb2FsIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMAogIC8vIEhlYWRlciBiYXIKICBkb2Muc2V0RmlsbENvbG9yKDI4LCAyNSwgMjMpOwogIGRvYy5yZWN0KDAsIDAsIFcsIDI0LCAnRicpOwogIHNldEZvbnQoJ2JvbGQnLCAxNiwgWzIzMiwgMjI2LCAyMTJdKTsKICBkb2MudGV4dCgnV29uZGVyRmVlbHonLCBNTCwgMTEpOwogIHNldEZvbnQoJ25vcm1hbCcsIDgsIFsxMDcsIDExNCwgMTI4XSk7CiAgZG9jLnRleHQoJ1BlcnNvbmFsIFJlc29uYW5jZSBBc3Nlc3NtZW50IFJlcG9ydCcsIE1MLCAxNyk7CiAgc2V0Rm9udCgnbm9ybWFsJywgOCwgWzE4NCwgMTUwLCA5MF0pOwogIGRvYy50ZXh0KCd3b25kZXJmZWVsei5jb20nLCBXIC0gTVIsIDExLCB7IGFsaWduOiAncmlnaHQnIH0pOwogIHkgPSAzMjsKCiAgLy8gUGVyc29uYWwgZGV0YWlscyBib3gKICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgZG9jLnRleHQoJ1BBUlRJQ0lQQU5UIERFVEFJTFMnLCBNTCwgeSk7IHkgKz0gNTsKICBsaW5lKE1MLCB5LCBXLU1SLCB5KTsgeSArPSA0OwogIHNldEZvbnQoJ25vcm1hbCcsIDEwKTsKICBjb25zdCB1c2VyTmFtZSA9IFtkLnVzZXIuZmlyc3QsIGQudXNlci5sYXN0XS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpIHx8ICdOb3QgcHJvdmlkZWQnOwogIGRvYy50ZXh0KCdOYW1lOiAnICsgdXNlck5hbWUsIE1MLCB5KTsgeSArPSA2OwogIGRvYy50ZXh0KCdFbWFpbDogJyArIChkLnVzZXIuZW1haWwgfHwgJ05vdCBwcm92aWRlZCcpLCBNTCwgeSk7IHkgKz0gNjsKICBkb2MudGV4dCgnRGF0ZTogJyArIChkLnVzZXIuZGF0ZSB8fCBuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nKSksIE1MLCB5KTsgeSArPSA2OwogIGRvYy50ZXh0KCdQcmltYXJ5IEdvYWw6ICcgKyBkLmdvYWwubGFiZWwsIE1MLCB5KTsgeSArPSA2OwogIGRvYy50ZXh0KCdGb2N1cyBNdWx0aXBsaWVyOiAnICsgKGQubXVsdCA/ICdcdTAwRDcnICsgZC5tdWx0LnRvRml4ZWQoMSkgOiAnQnkgZGlzY3Vzc2lvbicpLCBNTCwgeSk7CiAgeSArPSAxMjsKCiAgLy8gXHUyNTAwXHUyNTAwIFNURVAgMjogQ2hhbGxlbmdlcyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDAKICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgZG9jLnRleHQoJ1BSRVNFTlQgQ0hBTExFTkdFUyAoU3RlcCAyKScsIE1MLCB5KTsgeSArPSA1OwogIGxpbmUoTUwsIHksIFctTVIsIHkpOyB5ICs9IDU7CiAgY29uc3QgUkFURV9MQUJFTFMgPSBbJ05ldmVyICgwKScsICdPY2Nhc2lvbmFsbHkgKDEpJywgJ0ZyZXF1ZW50bHkgKDIpJywgJ0FsbW9zdCBBbHdheXMgKDMpJ107CiAgQ0hBTExFTkdFX1NFQ1RJT05TLmZvckVhY2goc2VjdGlvbiA9PiB7CiAgICBjaGVja1koMzApOwogICAgc2V0Rm9udCgnYm9sZCcsIDgsIFsxMDAsIDgwLCA1MF0pOwogICAgZG9jLnRleHQoc2VjdGlvbi50aXRsZS50b1VwcGVyQ2FzZSgpLCBNTCwgeSk7IHkgKz0gNTsKICAgIHNlY3Rpb24uaXRlbXMuZm9yRWFjaCgoaXRlbSwgcWkpID0+IHsKICAgICAgY2hlY2tZKDgpOwogICAgICBjb25zdCBrZXkgPSBzZWN0aW9uLnRpdGxlICsgJy0nICsgcWk7CiAgICAgIGNvbnN0IHZhbCA9IGQuY2hhbGxlbmdlUmF0aW5nc1trZXldIHx8IDA7CiAgICAgIHNldEZvbnQoJ25vcm1hbCcsIDksIFsyOCwgMjUsIDIzXSk7CiAgICAgIGRvYy50ZXh0KGl0ZW0sIE1MICsgMywgeSk7CiAgICAgIHNldEZvbnQoJ2JvbGQnLCA5LCBbNDIsIDEyMiwgOTRdKTsKICAgICAgZG9jLnRleHQoUkFURV9MQUJFTFNbdmFsXSwgVyAtIE1SLCB5LCB7IGFsaWduOiAncmlnaHQnIH0pOwogICAgICB5ICs9IDY7CiAgICB9KTsKICAgIHkgKz0gMjsKICB9KTsKCiAgc2V0Rm9udCgnYm9sZCcsIDEwLCBbMjgsIDI1LCAyM10pOwogIGNoZWNrWSgxMik7CiAgZG9jLnRleHQoJ0NoYWxsZW5nZSBzdWJ0b3RhbDogJyArIGQuY2hhbGxlbmdlVG90YWwgKyAnIC8gNzInLCBNTCwgeSk7IHkgKz0gMTI7CgogIC8vIFx1MjUwMFx1MjUwMCBQQUdFIDI6IFN0ZXBzIDNcdTIwMTM4IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMAogIGFkZFBhZ2UoKTsKCiAgZG9jLnNldEZpbGxDb2xvcigyOCwgMjUsIDIzKTsKICBkb2MucmVjdCgwLCAwLCBXLCAxMiwgJ0YnKTsKICBzZXRGb250KCdib2xkJywgOSwgWzIzMiwgMjI2LCAyMTJdKTsKICBkb2MudGV4dCgnV29uZGVyRmVlbHogUGVyc29uYWwgUmVzb25hbmNlIEFzc2Vzc21lbnQgXHUyMDE0IFBhZ2UgMicsIE1MLCA4KTsKICB5ID0gMjA7CgogIC8vIFN0ZXAgMyBsaWZlc3R5bGUKICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgZG9jLnRleHQoJ0xJRkVTVFlMRSBDT01QTEVYSVRZIChTdGVwIDMpJywgTUwsIHkpOyB5ICs9IDU7CiAgbGluZShNTCwgeSwgVy1NUiwgeSk7IHkgKz0gNTsKICBMSUZFU1RZTEVfU0VDVElPTlMuZm9yRWFjaChzZWMgPT4gewogICAgY29uc3QgdiA9IGQubGlmZXN0eWxlW3NlYy5rZXldOwogICAgc2V0Rm9udCgnbm9ybWFsJywgMTApOwogICAgZG9jLnRleHQoc2VjLnRpdGxlICsgJzogJywgTUwgKyAzLCB5KTsKICAgIHNldEZvbnQoJ2JvbGQnLCAxMCwgWzQyLCAxMjIsIDk0XSk7CiAgICBkb2MudGV4dCgodiA/IHYubGFiZWwgKyAnIChzY29yZTogJyArIHYuc2NvcmUgKyAnKScgOiAnTm90IGFuc3dlcmVkJyksIE1MICsgMyArIGRvYy5nZXRUZXh0V2lkdGgoc2VjLnRpdGxlICsgJzogJyksIHkpOwogICAgc2V0Rm9udCgnbm9ybWFsJywgMTAsIFsyOCwgMjUsIDIzXSk7CiAgICB5ICs9IDc7CiAgfSk7CiAgc2V0Rm9udCgnYm9sZCcsIDEwKTsKICBkb2MudGV4dCgnTGlmZXN0eWxlIHN1YnRvdGFsOiAnICsgZC5saWZlc3R5bGVUb3RhbCArICcgLyAzMCcsIE1MLCB5KTsgeSArPSAxMjsKCiAgLy8gU3RlcHMgNFx1MjAxMzggYXMgYSB0YWJsZQogIGNvbnN0IHN0ZXBSb3dzID0gWwogICAgeyBzdGVwOiA0LCBsYWJlbDogJ01lZGl0YXRpb24gRXhwZXJpZW5jZScsIHZhbDogZC5leHBPcHRpb24gPyBkLmV4cE9wdGlvbi5sYWJlbCA6ICdcdTIwMTQnLCBzY29yZTogZC5leHBUb3RhbCwgbWF4OiAyIH0sCiAgICB7IHN0ZXA6IDUsIGxhYmVsOiAnRGVzaXJlZCBTdXBwb3J0JywgICAgICAgIHZhbDogZC5zdXBwb3J0T3B0aW9uID8gZC5zdXBwb3J0T3B0aW9uLmxhYmVsIDogJ1x1MjAxNCcsIHNjb3JlOiBkLnN1cHBvcnRTY29yZSwgbWF4OiAxMCB9LAogICAgeyBzdGVwOiA2LCBsYWJlbDogJ0RhaWx5IENvbW1pdG1lbnQnLCAgICAgICAgdmFsOiBkLmNvbW1pdE9wdGlvbiA/IGQuY29tbWl0T3B0aW9uLmxhYmVsIDogJ1x1MjAxNCcsIHNjb3JlOiBkLmNvbW1pdFRvdGFsLCBtYXg6IDYgfSwKICAgIHsgc3RlcDogNywgbGFiZWw6ICdQZXJzb25hbGlzYXRpb24gTmVlZGVkJywgIHZhbDogZC5wZXJzb25hbE9wdGlvbiA/IGQucGVyc29uYWxPcHRpb24ubGFiZWwgOiAnXHUyMDE0Jywgc2NvcmU6IGQucGVyc29uYWxUb3RhbCwgbWF4OiA4IH0sCiAgICB7IHN0ZXA6IDgsIGxhYmVsOiAnSW50ZWdyYXRpb24gU2NvcGUnLCAgICAgICB2YWw6IGQuaW50ZWdyYXRlT3B0aW9uID8gZC5pbnRlZ3JhdGVPcHRpb24ubGFiZWwgOiAnXHUyMDE0Jywgc2NvcmU6IGQuaW50ZWdyYXRlVG90YWwsIG1heDogMTAgfSwKICBdOwogIHNldEZvbnQoJ2JvbGQnLCA5LCBbNDIsIDEyMiwgOTRdKTsKICBkb2MudGV4dCgnQVNTRVNTTUVOVCBTVEVQUyA0XHUyMDEzOCcsIE1MLCB5KTsgeSArPSA1OwogIGxpbmUoTUwsIHksIFctTVIsIHkpOyB5ICs9IDU7CgogIC8vIFRhYmxlIGhlYWRlcgogIGRvYy5zZXRGaWxsQ29sb3IoMjM3LCAyMzEsIDIyMCk7CiAgZG9jLnJlY3QoTUwsIHktNCwgVFcsIDcsICdGJyk7CiAgc2V0Rm9udCgnYm9sZCcsIDgsIFsyOCwgMjUsIDIzXSk7CiAgZG9jLnRleHQoJ1N0ZXAnLCBNTCsyLCB5KTsgZG9jLnRleHQoJ0NhdGVnb3J5JywgTUwrMjAsIHkpOyBkb2MudGV4dCgnUmVzcG9uc2UnLCBNTCs4MCwgeSk7IGRvYy50ZXh0KCdTY29yZScsIFctTVItMTAsIHksIHthbGlnbjoncmlnaHQnfSk7CiAgeSArPSA2OyBsaW5lKE1MLCB5LCBXLU1SLCB5LCBbMTgwLDE3MCwxNjBdKTsgeSArPSA0OwoKICBzdGVwUm93cy5mb3JFYWNoKChyLCBpKSA9PiB7CiAgICBjaGVja1koOCk7CiAgICBpZiAoaSAlIDIgPT09IDApIHsgZG9jLnNldEZpbGxDb2xvcigyNDcsIDI0MywgMjM3KTsgZG9jLnJlY3QoTUwsIHktNCwgVFcsIDcsICdGJyk7IH0KICAgIHNldEZvbnQoJ25vcm1hbCcsIDksIFsyOCwgMjUsIDIzXSk7CiAgICBkb2MudGV4dChTdHJpbmcoci5zdGVwKSwgTUwrNCwgeSk7CiAgICBkb2MudGV4dChyLmxhYmVsLCBNTCsyMCwgeSk7CiAgICBkb2MudGV4dChyLnZhbCwgTUwrODAsIHkpOwogICAgc2V0Rm9udCgnYm9sZCcsIDksIFs0MiwgMTIyLCA5NF0pOwogICAgZG9jLnRleHQoci5zY29yZSArICcgLyAnICsgci5tYXgsIFctTVIsIHksIHthbGlnbjoncmlnaHQnfSk7CiAgICB5ICs9IDc7CiAgfSk7CiAgeSArPSA4OwoKICAvLyBcdTI1MDBcdTI1MDAgUEFHRSAzOiBTY29yZSBzdW1tYXJ5ICsgZmVlIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMAogIGNoZWNrWSg4MCk7CiAgc2V0Rm9udCgnYm9sZCcsIDksIFs0MiwgMTIyLCA5NF0pOwogIGRvYy50ZXh0KCdTQ09SRSBTVU1NQVJZJywgTUwsIHkpOyB5ICs9IDU7CiAgbGluZShNTCwgeSwgVy1NUiwgeSk7IHkgKz0gNjsKCiAgY29uc3Qgc2NvcmVSb3dzID0gWwogICAgeyBsYWJlbDogJ1ByZXNlbnQgY2hhbGxlbmdlcycsIHNjb3JlOiBkLmNoYWxsZW5nZVRvdGFsLCBtYXg6IDcyIH0sCiAgICB7IGxhYmVsOiAnTGlmZXN0eWxlIGNvbXBsZXhpdHknLCBzY29yZTogZC5saWZlc3R5bGVUb3RhbCwgbWF4OiAzMCB9LAogICAgeyBsYWJlbDogJ01lZGl0YXRpb24gZXhwZXJpZW5jZScsIHNjb3JlOiBkLmV4cFRvdGFsLCBtYXg6IDIgfSwKICAgIHsgbGFiZWw6ICdTdXBwb3J0IGxldmVsIGNob3NlbicsIHNjb3JlOiBkLnN1cHBvcnRTY29yZSwgbWF4OiAxMCB9LAogICAgeyBsYWJlbDogJ0RhaWx5IGNvbW1pdG1lbnQnLCBzY29yZTogZC5jb21taXRUb3RhbCwgbWF4OiA2IH0sCiAgICB7IGxhYmVsOiAnUGVyc29uYWxpc2F0aW9uIG5lZWRlZCcsIHNjb3JlOiBkLnBlcnNvbmFsVG90YWwsIG1heDogOCB9LAogICAgeyBsYWJlbDogJ0ludGVncmF0aW9uIHNjb3BlJywgc2NvcmU6IGQuaW50ZWdyYXRlVG90YWwsIG1heDogMTAgfSwKICBdOwogIHNjb3JlUm93cy5mb3JFYWNoKHIgPT4gewogICAgc2V0Rm9udCgnbm9ybWFsJywgMTAsIFsyOCwgMjUsIDIzXSk7CiAgICBkb2MudGV4dChyLmxhYmVsLCBNTCArIDMsIHkpOwogICAgc2V0Rm9udCgnYm9sZCcsIDEwLCBbNDIsIDEyMiwgOTRdKTsKICAgIGRvYy50ZXh0KHIuc2NvcmUgKyAnIC8gJyArIHIubWF4LCBXLU1SLCB5LCB7YWxpZ246J3JpZ2h0J30pOwogICAgeSArPSA3OwogIH0pOwogIGxpbmUoTUwsIHksIFctTVIsIHkpOyB5ICs9IDY7CiAgc2V0Rm9udCgnYm9sZCcsIDEyLCBbMjgsIDI1LCAyM10pOwogIGRvYy50ZXh0KCdUb3RhbCBSZXNvbmFuY2UgU2NvcmUnLCBNTCArIDMsIHkpOwogIGRvYy50ZXh0KFN0cmluZyhkLkdSQU5EX1RPVEFMKSwgVy1NUiwgeSwge2FsaWduOidyaWdodCd9KTsKICB5ICs9IDEyOwoKICAvLyBSZXNvbmFuY2UgbGV2ZWwgYm94CiAgZG9jLnNldEZpbGxDb2xvcig0MiwgMTIyLCA5NCk7CiAgZG9jLnJlY3QoTUwsIHksIFRXLCAxOCwgJ0YnKTsKICBzZXRGb250KCdib2xkJywgMTMsIFsyNTUsIDI1NSwgMjU1XSk7CiAgZG9jLnRleHQoJ1Jlc29uYW5jZSBMZXZlbDogJyArIGQubGV2ZWwubmFtZSwgTUwgKyA1LCB5ICsgOCk7CiAgc2V0Rm9udCgnbm9ybWFsJywgOSwgWzIwMCwgMjMwLCAyMjBdKTsKICBkb2MudGV4dCgnU2NvcmUgJyArIGQuR1JBTkRfVE9UQUwgKyAnIFx1MDBCNyBSYW5nZSAnICsgZC5sZXZlbC5yYW5nZSwgTUwgKyA1LCB5ICsgMTQpOwogIHkgKz0gMjY7CgogIC8vIEZlZSBjYWxjdWxhdGlvbiBib3gKICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgZG9jLnRleHQoJ1NFU1NJT04gRkVFIENBTENVTEFUSU9OJywgTUwsIHkpOyB5ICs9IDU7CiAgbGluZShNTCwgeSwgVy1NUiwgeSk7IHkgKz0gNjsKCiAgY29uc3QgZmVlUm93cyA9IFsKICAgIHsgbGFiZWw6ICdSZXNvbmFuY2UgbGV2ZWwnLCAgICAgICAgICB2YWw6IGQubGV2ZWwubmFtZSB9LAogICAgeyBsYWJlbDogJ0Jhc2Ugc2Vzc2lvbiBmZWUnLCAgICAgICAgIHZhbDogZC5pc01hc3RlciA/ICdCeSBkaXNjdXNzaW9uJyA6IChkLmJhc2VGZWUgPT09IDAgPyAnRnJlZScgOiAnXHUyMEI5JyArIChkLmJhc2VGZWV8fDApLnRvTG9jYWxlU3RyaW5nKCdlbi1JTicpKSB9LAogICAgeyBsYWJlbDogJ0ZvY3VzOiAnICsgZC5nb2FsLmxhYmVsLCAgIHZhbDogZC5tdWx0ID8gJ1x1MDBENycgKyBkLm11bHQudG9GaXhlZCgxKSA6ICdCeSBkaXNjdXNzaW9uJyB9LAogICAgeyBsYWJlbDogJ0Jhc2UgXHUwMEQ3IE11bHRpcGxpZXInLCAgICAgICAgdmFsOiAoZC5pc01hc3Rlcnx8ZC5pc0Rpc2N1c3MpID8gJ0J5IGRpc2N1c3Npb24nIDogJ1x1MjBCOScgKyBNYXRoLnJvdW5kKChkLmJhc2VGZWV8fDApKihkLm11bHR8fDEpKS50b0xvY2FsZVN0cmluZygnZW4tSU4nKSB9LAogICAgeyBsYWJlbDogJ1N1cHBvcnQ6ICcgKyAoZC5zdXBwb3J0T3B0aW9uP2Quc3VwcG9ydE9wdGlvbi5sYWJlbDonXHUyMDE0JyksIHZhbDogJ1x1MjBCOScgKyBkLnN1cHBvcnRGZWUudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJykgfSwKICBdOwogIGZlZVJvd3MuZm9yRWFjaChyID0+IHsKICAgIHNldEZvbnQoJ25vcm1hbCcsIDEwLCBbMjgsMjUsMjNdKTsKICAgIGRvYy50ZXh0KHIubGFiZWwsIE1MKzMsIHkpOwogICAgc2V0Rm9udCgnYm9sZCcsIDEwLCBbNDIsMTIyLDk0XSk7CiAgICBkb2MudGV4dChyLnZhbCwgVy1NUiwgeSwge2FsaWduOidyaWdodCd9KTsKICAgIHkgKz0gNzsKICB9KTsKICBsaW5lKE1MLCB5LCBXLU1SLCB5LCBbMTgwLDE1MCw5MF0pOyB5ICs9IDY7CiAgc2V0Rm9udCgnYm9sZCcsIDEzLCBbMjgsMjUsMjNdKTsKICBkb2MudGV4dCgnRXN0aW1hdGVkIFNlc3Npb24gRmVlJywgTUwrMywgeSk7CiAgY29uc3QgZmVlVGV4dCA9IChkLmlzTWFzdGVyIHx8IGQuaXNEaXNjdXNzKSA/ICdCeSBEaXNjdXNzaW9uJwogICAgOiAoZC5maW5hbEZlZSA9PT0gMCA/ICdGcmVlIChFeHBlcmllbmNlIGxldmVsKScgOiAnXHUyMEI5JyArIGQuZmluYWxGZWUudG9Mb2NhbGVTdHJpbmcoJ2VuLUlOJykpOwogIGRvYy5zZXRUZXh0Q29sb3IoNDIsMTIyLDk0KTsKICBkb2MudGV4dChmZWVUZXh0LCBXLU1SLCB5LCB7YWxpZ246J3JpZ2h0J30pOwogIHkgKz0gMTI7CgogIC8vIFdvcmtpbmcgc2hvd24KICBzZXRGb250KCdub3JtYWwnLCA4LCBbMTA3LDExNCwxMjhdKTsKICBjb25zdCB3b3JraW5nVGV4dCA9IChkLmlzTWFzdGVyfHxkLmlzRGlzY3VzcykgPyAnRmVlIHRvIGJlIGNvbmZpcm1lZCBpbiBpbnRyb2R1Y3Rvcnkgc2Vzc2lvbi4nCiAgICA6ICcoXHUyMEI5JyArICgoZC5iYXNlRmVlfHwwKS50b0xvY2FsZVN0cmluZygnZW4tSU4nKSkgKyAnIFx1MDBENyAnICsgKGQubXVsdD9kLm11bHQudG9GaXhlZCgxKTonMS4wJykgKyAnKSArIFx1MjBCOScgKyAoZC5zdXBwb3J0RmVlLnRvTG9jYWxlU3RyaW5nKCdlbi1JTicpKSArICcgPSBcdTIwQjknICsgKChkLmZpbmFsRmVlfHwwKS50b0xvY2FsZVN0cmluZygnZW4tSU4nKSkgKyAnIHBlciBzZXNzaW9uJzsKICBkb2MudGV4dCh3b3JraW5nVGV4dCwgTUwsIHkpOyB5ICs9IDEyOwoKICAvLyBcdTI1MDBcdTI1MDAgU0VTU0lPTlMgQkxPQ0sgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwCiAgY2hlY2tZKDcwKTsKICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgZG9jLnRleHQoJ1JFQ09NTUVOREVEIFBST0dSQU1NRSBTVFJVQ1RVUkUnLCBNTCwgeSk7IHkgKz0gNTsKICBsaW5lKE1MLCB5LCBXLU1SLCB5KTsgeSArPSA2OwoKICBjb25zdCBzZXNzID0gZC5zZXNzaW9uczsKICBpZiAoc2VzcykgewogICAgLy8gQmlnIHNlc3Npb24gbnVtYmVyIGJveAogICAgZG9jLnNldEZpbGxDb2xvcig0MiwgMTIyLCA5NCk7CiAgICBkb2MucmVjdChNTCwgeSwgMzgsIDE4LCAnRicpOwogICAgc2V0Rm9udCgnYm9sZCcsIDE4LCBbMjU1LCAyNTUsIDI1NV0pOwogICAgZG9jLnRleHQoc2Vzcy5pc01hc3RlciA/ICczNisnIDogU3RyaW5nKHNlc3MudG90YWxTZXNzaW9ucyksIE1MICsgNiwgeSArIDEyKTsKICAgIHNldEZvbnQoJ25vcm1hbCcsIDgsIFsyMDAsIDIzMCwgMjIwXSk7CiAgICBkb2MudGV4dCgnc2Vzc2lvbnMnLCBNTCArIDYsIHkgKyAxNik7CgogICAgLy8gUHJvZ3JhbW1lIGRldGFpbHMgbmV4dCB0byBudW1iZXIgYm94CiAgICBzZXRGb250KCdib2xkJywgMTEsIFsyOCwgMjUsIDIzXSk7CiAgICBkb2MudGV4dChzZXNzLnByb2dUeXBlICsgJyBQcm9ncmFtbWUnLCBNTCArIDQ0LCB5ICsgNyk7CiAgICBzZXRGb250KCdub3JtYWwnLCA5LCBbMTA3LCAxMTQsIDEyOF0pOwogICAgZG9jLnRleHQoc2Vzcy50aW1lbGluZSArICcgXHUwMEI3ICcgKyBzZXNzLmZyZXF1ZW5jeSwgTUwgKyA0NCwgeSArIDEzKTsKICAgIHkgKz0gMjQ7CgogICAgLy8gUGhhc2UgYnJlYWtkb3duIHRhYmxlCiAgICBzZXRGb250KCdib2xkJywgOCwgWzEwNywgMTE0LCAxMjhdKTsKICAgIGRvYy50ZXh0KCdQaGFzZScsIE1MICsgMywgeSk7CiAgICBkb2MudGV4dCgnU2Vzc2lvbnMnLCBNTCArIDUwLCB5KTsKICAgIGRvYy50ZXh0KCdQdXJwb3NlJywgTUwgKyA4MCwgeSk7CiAgICB5ICs9IDU7IGxpbmUoTUwsIHksIFctTVIsIHksIFsyMDAsIDE5MiwgMTgwXSk7IHkgKz0gNDsKCiAgICBjb25zdCBwaGFzZVB1cnBvc2VzID0gWwogICAgICB7IG5hbWU6ICdGb3VuZGF0aW9uJywgIG46IHNlc3MuZm91bmRhdGlvbiwgIHB1cnBvc2U6ICdHcm91bmRpbmcsIGJhc2VsaW5lIGFzc2Vzc21lbnQsIGZpcnN0IHRlY2huaXF1ZXMnIH0sCiAgICAgIHsgbmFtZTogJ0RldmVsb3BtZW50Jywgbjogc2Vzcy5kZXZlbG9wbWVudCwgcHVycG9zZTogJ0NvcmUgcHJhY3RpY2UgZGV2ZWxvcG1lbnQsIHBhdHRlcm4gd29yaycgfSwKICAgICAgeyBuYW1lOiAnSW50ZWdyYXRpb24nLCBuOiBzZXNzLmludGVncmF0aW9uLCBwdXJwb3NlOiAnRW1iZWRkaW5nIHByYWN0aWNlLCBidWlsZGluZyBhdXRvbm9teScgfSwKICAgIF07CiAgICBwaGFzZVB1cnBvc2VzLmZvckVhY2goKHAsIGkpID0+IHsKICAgICAgY2hlY2tZKDgpOwogICAgICBpZiAoaSAlIDIgPT09IDApIHsgZG9jLnNldEZpbGxDb2xvcigyNDcsIDI0MywgMjM3KTsgZG9jLnJlY3QoTUwsIHktNCwgVFcsIDcsICdGJyk7IH0KICAgICAgc2V0Rm9udCgnbm9ybWFsJywgOSwgWzI4LCAyNSwgMjNdKTsKICAgICAgZG9jLnRleHQocC5uYW1lLCBNTCArIDMsIHkpOwogICAgICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgICAgIGRvYy50ZXh0KFN0cmluZyhwLm4pICsgJyBzZXNzaW9ucycsIE1MICsgNTAsIHkpOwogICAgICBzZXRGb250KCdub3JtYWwnLCA5LCBbMTA3LCAxMTQsIDEyOF0pOwogICAgICBkb2MudGV4dChwLnB1cnBvc2UsIE1MICsgODAsIHkpOwogICAgICB5ICs9IDc7CiAgICB9KTsKICAgIHkgKz0gNDsKCiAgICAvLyBBZGp1c3RtZW50IGJyZWFrZG93bgogICAgc2V0Rm9udCgnYm9sZCcsIDksIFs0MiwgMTIyLCA5NF0pOwogICAgZG9jLnRleHQoJ0hPVyBUSElTIFdBUyBDQUxDVUxBVEVEJywgTUwsIHkpOyB5ICs9IDU7CiAgICBsaW5lKE1MLCB5LCBXLU1SLCB5KTsgeSArPSA1OwoKICAgIHNlc3MuYWRqTGFiZWxzLmZvckVhY2goKHJvdywgaSkgPT4gewogICAgICBjaGVja1koOCk7CiAgICAgIGNvbnN0IGlzVG90YWwgPSAhIXJvdy50b3RhbDsKICAgICAgY29uc3QgaXNCYXNlICA9ICEhcm93LmJhc2U7CiAgICAgIGlmIChpc1RvdGFsKSB7IGxpbmUoTUwsIHktMiwgVy1NUiwgeS0yLCBbMjAwLCAxOTIsIDE4MF0pOyB9CiAgICAgIHNldEZvbnQoaXNUb3RhbCB8fCBpc0Jhc2UgPyAnYm9sZCcgOiAnbm9ybWFsJywgOSwKICAgICAgICBpc1RvdGFsID8gWzQyLCAxMjIsIDk0XSA6IFsyOCwgMjUsIDIzXSk7CiAgICAgIGRvYy50ZXh0KHJvdy5sYWJlbCwgTUwgKyAzLCB5KTsKICAgICAgY29uc3QgdmFsU3RyID0gKHJvdy52YWwgPiAwICYmICFpc0Jhc2UgJiYgIWlzVG90YWwgPyAnKycgOiAnJykgKyBTdHJpbmcocm93LnZhbCk7CiAgICAgIHNldEZvbnQoJ2JvbGQnLCA5LCBpc1RvdGFsID8gWzQyLDEyMiw5NF0gOiByb3cudmFsID4gMCAmJiAhaXNCYXNlID8gWzQyLDEyMiw5NF0gOiByb3cudmFsIDwgMCA/IFsxODQsMTUwLDkwXSA6IFsxMDcsMTE0LDEyOF0pOwogICAgICBkb2MudGV4dCh2YWxTdHIsIFctTVIsIHksIHsgYWxpZ246ICdyaWdodCcgfSk7CiAgICAgIHkgKz0gNzsKICAgIH0pOwogICAgeSArPSA0OwoKICAgIC8vIFRvdGFsIGludmVzdG1lbnQgaWYgYXZhaWxhYmxlCiAgICBpZiAoc2Vzcy50b3RhbEludmVzdG1lbnQpIHsKICAgICAgY2hlY2tZKDE2KTsKICAgICAgZG9jLnNldEZpbGxDb2xvcig0MiwgMTIyLCA5NCk7CiAgICAgIGRvYy5zZXREcmF3Q29sb3IoNDIsIDEyMiwgOTQpOwogICAgICBkb2MucmVjdChNTCwgeSwgVFcsIDE0LCAnRCcpOwogICAgICBzZXRGb250KCdib2xkJywgMTAsIFsyOCwgMjUsIDIzXSk7CiAgICAgIGRvYy50ZXh0KCdFc3RpbWF0ZWQgVG90YWwgUHJvZ3JhbW1lIEludmVzdG1lbnQnLCBNTCArIDQsIHkgKyA2KTsKICAgICAgc2V0Rm9udCgnYm9sZCcsIDEyLCBbNDIsIDEyMiwgOTRdKTsKICAgICAgZG9jLnRleHQoJ1x1MjBCOScgKyBzZXNzLnRvdGFsSW52ZXN0bWVudC50b0xvY2FsZVN0cmluZygnZW4tSU4nKSwgVy1NUiwgeSArIDksIHsgYWxpZ246ICdyaWdodCcgfSk7CiAgICAgIHkgKz0gMjA7CiAgICB9CgogICAgLy8gRnJlcXVlbmN5ICsgdGltZWxpbmUgbWV0YQogICAgY2hlY2tZKDIwKTsKICAgIHNldEZvbnQoJ25vcm1hbCcsIDgsIFsxMDcsIDExNCwgMTI4XSk7CiAgICBkb2MudGV4dCgnUmVjb21tZW5kZWQgZnJlcXVlbmN5OiAnICsgc2Vzcy5mcmVxdWVuY3ksIE1MICsgMywgeSk7IHkgKz0gNjsKICAgIGRvYy50ZXh0KCdFc3RpbWF0ZWQgdGltZWxpbmU6ICcgKyBzZXNzLnRpbWVsaW5lLCBNTCArIDMsIHkpOyB5ICs9IDY7CiAgICBkb2MudGV4dCgnVGhpcyBlc3RpbWF0ZSBpcyB2YWxpZGF0ZWQgYW5kIG1heSBiZSBhZGp1c3RlZCBieSB5b3VyIHByYWN0aXRpb25lciBpbiBTZXNzaW9uIDEuJywgTUwgKyAzLCB5KTsKICAgIHkgKz0gMTI7CiAgfSBlbHNlIHsKICAgIHNldEZvbnQoJ25vcm1hbCcsIDksIFsxMDcsIDExNCwgMTI4XSk7CiAgICBkb2MudGV4dCgnU2Vzc2lvbiBjYWxjdWxhdGlvbiBkYXRhIHVuYXZhaWxhYmxlLicsIE1MICsgMywgeSk7IHkgKz0gMTA7CiAgfQoKICAvLyBOZXh0IHN0ZXBzCiAgY2hlY2tZKDUwKTsKICBzZXRGb250KCdib2xkJywgOSwgWzQyLCAxMjIsIDk0XSk7CiAgZG9jLnRleHQoJ1JFQ09NTUVOREVEIE5FWFQgU1RFUFMnLCBNTCwgeSk7IHkgKz0gNTsKICBsaW5lKE1MLCB5LCBXLU1SLCB5KTsgeSArPSA2OwogIGNvbnN0IG5leHRTdGVwc1BERiA9IFsKICAgICdCb29rIHlvdXIgY29tcGxpbWVudGFyeSBpbnRyb2R1Y3RvcnkgY2FsbCBhdCB3b25kZXJmZWVsei5jb20vYm9vay1ub3cnLAogICAgJ0JyaW5nIHRoaXMgcmVwb3J0IHRvIHlvdXIgZmlyc3Qgc2Vzc2lvbiBmb3IgY29udGV4dCcsCiAgICAnQWxsIHNlc3Npb25zIGFyZSBwcml2YXRlIGFuZCBvbmUtdG8tb25lJywKICAgICdZb3VyIHByYWN0aXRpb25lciB3aWxsIHJldmlldyB0aGlzIGFzc2Vzc21lbnQgd2l0aCB5b3UgaW4gU2Vzc2lvbiAxJywKICAgIGQuR1JBTkRfVE9UQUwgPiA5MCA/ICdZb3VyIGJlc3Bva2UgcHJvZ3JhbW1lIHdpbGwgYmUgZGVzaWduZWQgaW4geW91ciBmaXJzdCBzZXNzaW9uJwogICAgICA6ICdZb3VyIHByYWN0aXRpb25lciB3aWxsIGNvbmZpcm0geW91ciBwcm9ncmFtbWUgc3RydWN0dXJlIGF0IHlvdXIgZmlyc3Qgc2Vzc2lvbicsCiAgXTsKICBuZXh0U3RlcHNQREYuZm9yRWFjaChzdGVwID0+IHsKICAgIGNoZWNrWSg4KTsKICAgIHNldEZvbnQoJ25vcm1hbCcsIDksIFsyOCwyNSwyM10pOwogICAgZG9jLnRleHQoJ1x1MjE5MiAgJyArIHN0ZXAsIE1MICsgMywgeSk7IHkgKz0gNzsKICB9KTsKICB5ICs9IDg7CgogIC8vIEZvb3RlciBvbiBsYXN0IHBhZ2UKICBkb2Muc2V0RmlsbENvbG9yKDIzNywgMjMxLCAyMjApOwogIGRvYy5yZWN0KDAsIDI4MiwgVywgMTUsICdGJyk7CiAgc2V0Rm9udCgnbm9ybWFsJywgNywgWzEwNywxMTQsMTI4XSk7CiAgZG9jLnRleHQoJ1RoaXMgYXNzZXNzbWVudCBpcyBub3QgYSBjbGluaWNhbCBkaWFnbm9zaXMuIEl0IGlzIGEgZnJhbWV3b3JrIGZvciB1bmRlcnN0YW5kaW5nIHRoZSBkZXB0aCBvZiBzdXBwb3J0IHlvdXIgc2l0dWF0aW9uIHJlcXVpcmVzLicsIE1MLCAyODgpOwogIGRvYy50ZXh0KCdXb25kZXJGZWVseiBcdTAwQjcgd29uZGVyZmVlbHouY29tIFx1MDBCNyBBbGwgc2Vzc2lvbnMgYXJlIHByaXZhdGUgYW5kIG9uZS10by1vbmUuJywgTUwsIDI5Myk7CiAgZG9jLnRleHQoJ1BhZ2UgJyArIGRvYy5pbnRlcm5hbC5nZXRDdXJyZW50UGFnZUluZm8oKS5wYWdlTnVtYmVyLCBXLU1SLCAyODgsIHthbGlnbjoncmlnaHQnfSk7CgogIC8vIEFkZCBwYWdlIG51bWJlcnMgdG8gYWxsIHBhZ2VzCiAgY29uc3QgdG90YWxQYWdlcyA9IGRvYy5pbnRlcm5hbC5nZXROdW1iZXJPZlBhZ2VzKCk7CiAgZm9yIChsZXQgcCA9IDE7IHAgPD0gdG90YWxQYWdlczsgcCsrKSB7CiAgICBkb2Muc2V0UGFnZShwKTsKICAgIHNldEZvbnQoJ25vcm1hbCcsIDcsIFsxMDcsMTE0LDEyOF0pOwogICAgZG9jLnRleHQoJ1BhZ2UgJyArIHAgKyAnIG9mICcgKyB0b3RhbFBhZ2VzLCBXLU1SLCAyOTMsIHthbGlnbjoncmlnaHQnfSk7CiAgfQoKICBjb25zdCBmaWxlTmFtZSA9ICdXb25kZXJGZWVsei1Bc3Nlc3NtZW50LScgKyAoZC51c2VyLmZpcnN0IHx8ICdSZXBvcnQnKSArICctJyArIChkLnVzZXIuZGF0ZXx8JycpLnJlcGxhY2UoL1wvL2csJy0nKSArICcucGRmJzsKICBkb2Muc2F2ZShmaWxlTmFtZSk7Cn0KCi8qIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICBSRVNUQVJUClx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MCAqLwpmdW5jdGlvbiByZXN0YXJ0QXNzZXNzbWVudCgpIHsKICBzdGF0ZSA9IHsKICAgIGN1cnJlbnRTdGVwOiAwLCB1c2VyOiB7IGZpcnN0OicnLCBsYXN0OicnLCBlbWFpbDonJywgZGF0ZTonJyB9LAogICAgZ29hbDogbnVsbCwgY2hhbGxlbmdlUmF0aW5nczoge30sIGxpZmVzdHlsZToge30sCiAgICBleHBTY29yZTogbnVsbCwgc3VwcG9ydE9wdGlvbjogbnVsbCwKICAgIGNvbW1pdFNjb3JlOiBudWxsLCBwZXJzb25hbFNjb3JlOiBudWxsLCBpbnRlZ3JhdGVTY29yZTogbnVsbCwKICB9OwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXN1bHRzJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXNzZXNzbWVudCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdpbnRyby1ibG9jaycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduYW1lLXN0ZXAnKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsKICBmb3IgKGxldCBpID0gMTsgaSA8PSA4OyBpKyspIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGVwLScraSsnLWNhcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLWZpcnN0JykudmFsdWUgPSAnJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1sYXN0JykudmFsdWUgPSAnJzsKICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1lbWFpbCcpLnZhbHVlID0gJyc7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItZGF0ZScpLnZhbHVlID0gJyc7CiAgc2V0UHJvZ3Jlc3MoMCk7CiAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7Cn0KCi8qIFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MAogICBJTklUClx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MFx1MjU1MCAqLwooZnVuY3Rpb24gaW5pdFdGUGxhbm5lcigpIHsKICAvLyBTZXQgdG9kYXkncyBkYXRlCiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItZGF0ZScpLnZhbHVlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNsaWNlKDAsMTApOwoKICAvLyBCdWlsZCBzdGVwIDEgZ29hbCBncmlkCiAgYnVpbGRHb2FsR3JpZCgpOwoKICAvLyBCdWlsZCBzdGVwIDIgY2hhbGxlbmdlcwogIGJ1aWxkQ2hhbGxlbmdlcygpOwoKICAvLyBCdWlsZCBzdGVwIDMgbGlmZXN0eWxlCiAgYnVpbGRMaWZlc3R5bGVTZWN0aW9ucygpOwoKICAvLyBCdWlsZCBzdGVwIDQgZXhwZXJpZW5jZQogIGJ1aWxkT3B0aW9uR3JpZCgnZXhwLWdyaWQnLCBFWFBfT1BUSU9OUywgJ2V4cFNjb3JlJywgJ3N0ZXA0LW5leHQnKTsKCiAgLy8gQnVpbGQgc3RlcCA1IHN1cHBvcnQgKG5vIGdyb3VwIFx1MjAxNCAxOjEgb25seSkKICBidWlsZE9wdGlvbkdyaWQoJ3N1cHBvcnQtZ3JpZCcsIFNVUFBPUlRfT1BUSU9OUywgJ3N1cHBvcnRPcHRpb24nLCAnc3RlcDUtbmV4dCcpOwoKICAvLyBCdWlsZCBzdGVwIDYgY29tbWl0bWVudAogIGJ1aWxkT3B0aW9uR3JpZCgnY29tbWl0LWdyaWQnLCBDT01NSVRfT1BUSU9OUywgJ2NvbW1pdFNjb3JlJywgJ3N0ZXA2LW5leHQnKTsKCiAgLy8gQnVpbGQgc3RlcCA3IHBlcnNvbmFsaXNhdGlvbgogIGJ1aWxkT3B0aW9uR3JpZCgncGVyc29uYWwtZ3JpZCcsIFBFUlNPTkFMX09QVElPTlMsICdwZXJzb25hbFNjb3JlJywgJ3N0ZXA3LW5leHQnKTsKCiAgLy8gQnVpbGQgc3RlcCA4IGludGVncmF0aW9uCiAgYnVpbGRPcHRpb25HcmlkKCdpbnRlZ3JhdGUtZ3JpZCcsIElOVEVHUkFURV9PUFRJT05TLCAnaW50ZWdyYXRlU2NvcmUnLCAnc3RlcDgtbmV4dCcpOwoKICBzZXRQcm9ncmVzcygwKTsKICAvLyBFeHBvc2UgbmF2aWdhdGlvbiBmdW5jdGlvbnMgZ2xvYmFsbHkgc28gSFRNTCBvbmNsaWNrPSBhdHRyaWJ1dGVzIGNhbiByZWFjaCB0aGVtCiAgd2luZG93LmdvQmFjayA9IGdvQmFjazsKICB3aW5kb3cubmV4dFN0ZXAgPSBuZXh0U3RlcDsKICB3aW5kb3cuY29tcHV0ZVJlc3VsdHMgPSBjb21wdXRlUmVzdWx0czsKICB3aW5kb3cuc2hvd1N0ZXAgPSBzaG93U3RlcDsKfSkoKTsKCg==