{"data":{"format":"sidebud-widget-pack","formatVersion":2,"exportedAt":"2026-09-26T11:45:20.350Z","manifest":{"id":"app.sidebud.openclaw","mcp":{"env":{"OPENCLAW_STATE_DIR":"{{setting.stateDir}}"},"args":["server/index.mjs"],"command":"node","transport":"stdio"},"data":[{"id":"overview","tool":"get_overview","refreshSeconds":15},{"id":"approvals","tool":"list_approvals","refreshSeconds":10},{"id":"sessions","tool":"list_sessions","arguments":{"limit":20},"refreshSeconds":15},{"id":"runs","tool":"list_runs","arguments":{"limit":30},"refreshSeconds":20},{"id":"agents","tool":"list_agents","refreshSeconds":60},{"id":"jobs","tool":"list_scheduled_jobs","refreshSeconds":120},{"id":"channels","tool":"list_channels","refreshSeconds":120}],"logo":{"kind":"file","path":"logo.png","source":"https://github.com/openclaw/openclaw/blob/eb377ac59e6c9fd6c7705028034812becf00271b/ui/public/favicon.svg"},"name":"OpenClaw","tile":{"size":"large"},"badge":{"text":"{{approvals/count}}","tone":"warning"},"setup":{"steps":["Install OpenClaw (curl -fsSL https://openclaw.ai/install.sh | bash) and set it up with its Gateway as a background service: openclaw onboard --install-daemon. openclaw gateway status should say it is running.","Nothing to copy: the pack reads the Gateway's port and token from OpenClaw's config on this computer and connects to the Gateway here. Install it on the computer that runs the Gateway.","Optional: link a chat channel (openclaw channels add) so chats from WhatsApp, Telegram, Discord, and others show up with their channel."],"detect":{"anyPath":["~/.openclaw/openclaw.json","{{env.OPENCLAW_STATE_DIR}}/openclaw.json"]},"prerequisites":[{"name":"OpenClaw","command":"openclaw"},{"name":"Node.js","command":"node"}]},"skill":{"path":"SKILL.md"},"author":{"name":"Sidebud"},"blocks":[{"type":"stats","items":[{"tone":"neutral","label":"Agents","value":"{{overview/agents|default:0}}"},{"tone":"info","label":"Working","value":"{{overview/working|default:0}}"},{"tone":"warning","label":"Needs you","value":"{{approvals/count|default:0}}"}]},{"item":{"key":"{{item/session_key}}","time":"{{item/lastActivityAt}}","title":"{{item/title|truncate:70}}","status":"{{item/activity}}","subtitle":"{{item/where}}","statusTones":{"running":"info"}},"type":"list","items":"{{sessions/sessions|sort:-state=running,-lastActivityAt}}","limit":8,"title":"Sessions","emptyText":"No OpenClaw sessions yet"},{"item":{"key":"{{item/session_key}}","time":"{{item/expiresAt}}","title":"{{item/summary|truncate:80}}","status":"waiting","subtitle":"{{item/agent}} · {{item/title}}","statusTones":{"waiting":"warning"}},"type":"list","items":"{{approvals/approvals}}","limit":5,"title":"Needs you","emptyText":"Nothing is waiting for you"},{"item":{"key":"{{item/session_key}}","time":"{{item/updatedAt}}","title":"{{item/title|truncate:80}}","subtitle":"{{item/where}}"},"type":"board","items":"{{runs/runs}}","limit":3,"title":"Runs","column":"{{item/column}}","columns":[{"id":"queued","tone":"neutral","title":"Queued"},{"id":"running","tone":"info","title":"Running"},{"id":"blocked","tone":"warning","title":"Blocked"},{"id":"done","tone":"success","title":"Done"},{"id":"failed","tone":"danger","title":"Failed"}]},{"item":{"time":"{{item/nextRunAt}}","title":"{{item/name|truncate:60}}","status":"{{item/status}}","subtitle":"{{item/agent}} · {{item/schedule|default:custom schedule}}","statusTones":{"ok":"success","off":"neutral","error":"danger","skipped":"neutral"}},"type":"list","items":"{{jobs/jobs}}","limit":6,"title":"Scheduled","emptyText":"No scheduled jobs"},{"item":{"time":"{{item/lastActiveAt}}","title":"{{item/name}}","status":"{{item/activity}}","subtitle":"{{item/model|default:Default model}}","statusTones":{"working":"info"}},"type":"list","items":"{{agents/agents|sort:-workingSessions,-lastActiveAt}}","limit":10,"title":"Agents","emptyText":"No OpenClaw agents"},{"item":{"time":"{{item/lastMessageAt}}","title":"{{item/name}}","status":"{{item/state}}","subtitle":"{{item/account}}","statusTones":{"off":"neutral","error":"danger","stopped":"warning","connected":"success","connecting":"info","not linked":"neutral"}},"type":"list","items":"{{channels/channels}}","limit":6,"title":"Channels","emptyText":"No chat channels linked (openclaw channels add)"}],"detail":{"tool":"read_session","message":{"at":"{{item/at}}","role":"{{item/role}}","text":"{{item/content}}"},"messages":"{{detail/messages}}","arguments":{"limit":20,"session_key":"{{item/session_key}}"}},"glance":{"stats":[{"tone":"info","label":"Working","value":"{{overview/working|default:0}}"},{"tone":"warning","label":"Needs you","value":"{{approvals/count|default:0}}"}]},"notify":[{"id":"approvals","key":"{{item/id}}","items":"{{approvals/approvals}}","rules":[{"new":true,"text":"OpenClaw's {{item/agent}} agent is waiting for your OK to {{item/title}}: {{item/summary|truncate:100}}.","priority":"needs_you"}],"category":"agents"},{"id":"sessions","key":"{{item/session_key}}","items":"{{sessions/sessions}}","rules":[{"text":"OpenClaw agent {{item/agent}} finished “{{item/title|truncate:60}}”.","state":"idle","priority":"finished","withLatest":true}],"state":"{{item/state}}","category":"agents"},{"id":"runs","key":"{{item/id}}","items":"{{runs/runs}}","rules":[{"text":"OpenClaw run “{{item/title|truncate:60}}” ({{item/agent}}) failed: {{item/error|default:no details given|truncate:100}}.","state":"failed","priority":"failed","withLatest":false},{"text":"OpenClaw run “{{item/title|truncate:60}}” ({{item/agent}}) is blocked.","state":"blocked","priority":"needs_you","withLatest":false}],"state":"{{item/column}}","category":"agents"},{"id":"jobs","key":"{{item/id}}","items":"{{jobs/jobs}}","rules":[{"text":"OpenClaw's scheduled job {{item/name}} failed: {{item/lastError|default:no details|truncate:100}}.","state":"error","priority":"failed"}],"state":"{{item/status}}","category":"agents"}],"license":"MIT","listing":{"account":"OpenClaw and its Gateway on this computer","category":"agents","homepage":"https://docs.openclaw.ai","connectsTo":"The OpenClaw Gateway on this computer, through the server in this pack"},"preview":{"at":"2026-09-25T09:00:00.000Z","data":{"jobs":{"jobs":[{"id":"j1","name":"Check the build","agent":"coder","status":"ok","schedule":"every 6h","nextRunAt":"2026-09-25T12:00:00.000Z"},{"id":"j2","name":"Morning digest","agent":"main","status":"ok","schedule":"daily at 08:00","nextRunAt":"2026-09-26T08:00:00.000Z"}],"count":2,"enabled":2},"runs":{"runs":[{"id":"r1","agent":"coder","title":"Fix the flaky checkout test","where":"coder · chat","column":"running","updatedAt":"2026-09-25T08:59:00.000Z","session_key":"agent:coder:main"},{"id":"r2","agent":"main","title":"Morning digest","where":"main · scheduled","column":"done","updatedAt":"2026-09-25T08:00:30.000Z","session_key":null},{"id":"r3","agent":"main","title":"Summarize the release notes","where":"main · run","column":"failed","updatedAt":"2026-09-25T07:10:00.000Z","session_key":"agent:main:main"}],"count":3,"failed":1,"running":1},"agents":{"count":2,"agents":[{"id":"main","name":"main","model":"anthropic/claude-opus-5","activity":"","lastActiveAt":"2026-09-25T08:20:00.000Z","workingSessions":0},{"id":"coder","name":"Coder","model":"anthropic/claude-sonnet-5","activity":"working","lastActiveAt":"2026-09-25T08:59:00.000Z","workingSessions":1}],"working":1},"channels":{"count":1,"channels":[{"name":"Telegram","state":"connected","account":"default","channel":"telegram","lastMessageAt":"2026-09-25T08:20:00.000Z"}],"connected":1},"overview":{"jobs":2,"agents":2,"running":1,"summary":"2 agents · 1 working · 1 waiting on you · 2 jobs · 1 channel","working":1,"channels":1,"approvals":1},"sessions":{"count":3,"running":1,"sessions":[{"agent":"coder","state":"running","title":"Fix the flaky checkout test","where":"coder","activity":"running","session_key":"agent:coder:main","lastActivityAt":"2026-09-25T08:59:00.000Z"},{"agent":"main","state":"idle","title":"Plan Saturday's long run","where":"main · Telegram","activity":"","session_key":"agent:main:telegram:dm:sample","lastActivityAt":"2026-09-25T08:20:00.000Z"},{"agent":"main","state":"idle","title":"Name for the weekly planning ritual","where":"main","activity":"","session_key":"agent:main:main","lastActivityAt":"2026-09-25T06:40:00.000Z"}]},"approvals":{"next":[{"id":"plugin:sample-1","agent":"coder","title":"Run a command","summary":"npm test -- --run checkout"}],"count":1,"approvals":[{"id":"plugin:sample-1","kind":"plugin","tool":"Bash","agent":"coder","title":"Run a command","summary":"npm test -- --run checkout","createdAt":"2026-09-25T08:59:00.000Z","decisions":["allow-once","deny"],"expiresAt":"2026-09-25T09:01:00.000Z","session_key":"agent:coder:main"}]}}},"version":"1.0.1","controls":[{"id":"status","kind":"prompt","label":"What's happening","prompt":"What are my OpenClaw agents working on, and does anything need me?","default":true},{"id":"needs-me","kind":"prompt","label":"Needs me","prompt":"Which OpenClaw requests are waiting for my approval? Read each one to me and ask what I want to do.","default":true},{"id":"allow-next","kind":"tool","tool":"respond_to_approval","label":"Allow next once","effect":"consequential","confirm":"Allow OpenClaw's {{approvals/next/0/agent|default:agent}} agent once to {{approvals/next/0/title|default:go ahead}}: {{approvals/next/0/summary|default:nothing is waiting|truncate:140}}?","default":true,"forEach":"{{approvals/next}}","maxCalls":1,"arguments":{"id":"{{item/id}}","decision":"allow-once","expect_oldest":true}},{"id":"deny-next","kind":"tool","tool":"respond_to_approval","label":"Deny next","effect":"consequential","confirm":"Deny OpenClaw's {{approvals/next/0/agent|default:agent}} agent: {{approvals/next/0/summary|default:nothing is waiting|truncate:140}}?","forEach":"{{approvals/next}}","maxCalls":1,"arguments":{"id":"{{item/id}}","decision":"deny","expect_oldest":true}},{"id":"deny-all","kind":"tool","tool":"deny_all_approvals","label":"Deny all waiting","effect":"consequential","confirm":"Deny all {{approvals/count|default:0}} OpenClaw requests waiting for you?"},{"id":"jobs","kind":"prompt","label":"Scheduled jobs","prompt":"Which OpenClaw jobs run next, and did any fail recently?"}],"settings":[{"id":"stateDir","type":"text","label":"OpenClaw folder","default":"","description":"Only if OpenClaw keeps its state somewhere other than ~/.openclaw (its OPENCLAW_STATE_DIR). Leave empty otherwise."}],"subtitle":"{{overview/summary}}","description":"Your OpenClaw agents on the phone: what each is working on, requests waiting for your approval (allow or deny them from the widget), recent runs, scheduled jobs, and linked chat channels. The execution agent can read and continue sessions, start new ones, stop a run, run jobs, and answer approvals.","permissions":{"reach":["computer"],"tools":[{"name":"get_overview","access":"read","description":"Agents, who is working, approvals waiting, jobs, and channels at a glance"},{"name":"list_agents","access":"read","description":"The user's OpenClaw agents and what each is doing"},{"name":"list_sessions","access":"read","description":"Recent sessions (chats with an agent) and which are running"},{"name":"read_session","access":"read","description":"A session's latest messages"},{"name":"list_approvals","access":"read","description":"Requests from agents waiting for the user's approval"},{"name":"list_runs","access":"read","description":"Recent runs and their status"},{"name":"list_scheduled_jobs","access":"read","description":"Scheduled jobs and their next and last runs"},{"name":"list_channels","access":"read","description":"Linked chat channels and whether they are connected"},{"name":"send_message","access":"write","description":"Continue a session with a message"},{"name":"start_session","access":"write","description":"Start a new session with an agent"},{"name":"stop_session","access":"write","description":"Stop the run going in a session"},{"name":"respond_to_approval","access":"write","description":"Allow or deny one waiting request"},{"name":"deny_all_approvals","access":"write","description":"Deny every waiting request"},{"name":"run_scheduled_job","access":"write","description":"Run a scheduled job now"},{"name":"set_scheduled_job_enabled","access":"write","description":"Turn a scheduled job off or back on"}],"network":["The OpenClaw Gateway on this computer (127.0.0.1)"]},"schemaVersion":3,"refreshSeconds":15,"contentHash":"sha256:b42f1ce4b8be1c44b232c538aaaab38fd4d768e6d467914dcc5ae2c07ec89ffb"},"files":{"logo.png":"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","server/gateway.mjs":"Ly8gQSBzbWFsbCBjbGllbnQgZm9yIHRoZSBPcGVuQ2xhdyBHYXRld2F5J3MgV2ViU29ja2V0IHByb3RvY29sICh2NCksIGZvcgovLyB0aGlzIHBhY2sncyBzZXJ2ZXIuIEl0IGNvbm5lY3RzIGFzIGEgdHJ1c3RlZCBsb2NhbCBiYWNrZW5kIHdpdGggdGhlCi8vIEdhdGV3YXkncyBvd24gdG9rZW4gZnJvbSBPcGVuQ2xhdydzIGNvbmZpZyBvbiB0aGlzIGNvbXB1dGVyLCBzbyBub3RoaW5nIGlzCi8vIGNvcGllZCBpbnRvIFNpZGVidWQuIEl0IHN0YXlzIGNvbm5lY3RlZCwgd2l0aCB0aGUgYXBwcm92YWxzIGNhcGFiaWxpdHkgYW5kCi8vIG9wZXJhdG9yLmFkbWluLCBzbyBleGVjIGFuZCBwbHVnaW4gYXBwcm92YWxzIHJhaXNlZCBieSBhbnkgT3BlbkNsYXcgYWdlbnQKLy8gd2FpdCBmb3IgYW4gYW5zd2VyIGluc3RlYWQgb2YgYmVpbmcgZGVuaWVkIGZvciBoYXZpbmcgbm8gYXBwcm92ZXIuCmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnCmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJwppbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJwoKY29uc3QgUFJPVE9DT0wgPSA0CmNvbnN0IFNDT1BFUyA9IFsnb3BlcmF0b3IuYWRtaW4nLCAnb3BlcmF0b3IucmVhZCcsICdvcGVyYXRvci53cml0ZScsICdvcGVyYXRvci5hcHByb3ZhbHMnXQpjb25zdCBDQVBTID0gWydhcHByb3ZhbHMnLCAnZXhlYy1hcHByb3ZhbHMnLCAncGx1Z2luLWFwcHJvdmFscyddCmNvbnN0IFJFUVVFU1RfVElNRU9VVF9NUyA9IDMwXzAwMApjb25zdCBDT05ORUNUX1dBSVRfTVMgPSAxMF8wMDAKY29uc3QgUkVUUllfTUFYX01TID0gMzBfMDAwCgovKiogT3BlbkNsYXcncyBzdGF0ZSBmb2xkZXI6IE9QRU5DTEFXX1NUQVRFX0RJUiwgZWxzZSB+Ly5vcGVuY2xhdy4gKi8KZXhwb3J0IGNvbnN0IG9wZW5jbGF3SG9tZSA9IChlbnYgPSBwcm9jZXNzLmVudikgPT4gZW52Lk9QRU5DTEFXX1NUQVRFX0RJUiB8fCBqb2luKGhvbWVkaXIoKSwgJy5vcGVuY2xhdycpCgovKioKICogUGFyc2VzIE9wZW5DbGF3J3MgY29uZmlnLCB3aGljaCBtYXkgYmUgSlNPTjU6IGNvbW1lbnRzIGFuZCB0cmFpbGluZyBjb21tYXMKICogYXJlIHJlbW92ZWQgb3V0c2lkZSBzdHJpbmdzIGJlZm9yZSBKU09OLnBhcnNlLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ29uZmlnKHRleHQpIHsKICBsZXQgb3V0ID0gJycKICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGV4dC5sZW5ndGg7IGluZGV4ICs9IDEpIHsKICAgIGNvbnN0IGNoYXIgPSB0ZXh0W2luZGV4XQogICAgaWYgKGNoYXIgPT09ICciJyB8fCBjaGFyID09PSAiJyIpIHsKICAgICAgbGV0IGVuZCA9IGluZGV4ICsgMQogICAgICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgdGV4dFtlbmRdICE9PSBjaGFyKSBlbmQgKz0gdGV4dFtlbmRdID09PSAnXFwnID8gMiA6IDEKICAgICAgY29uc3QgYm9keSA9IHRleHQuc2xpY2UoaW5kZXggKyAxLCBlbmQpCiAgICAgIG91dCArPSBjaGFyID09PSAnIicgPyBgIiR7Ym9keX0iYCA6IEpTT04uc3RyaW5naWZ5KGJvZHkucmVwbGFjZSgvXFwnL2csICInIikpCiAgICAgIGluZGV4ID0gZW5kCiAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICcvJyAmJiB0ZXh0W2luZGV4ICsgMV0gPT09ICcvJykgewogICAgICB3aGlsZSAoaW5kZXggPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0W2luZGV4XSAhPT0gJ1xuJykgaW5kZXggKz0gMQogICAgICBvdXQgKz0gJ1xuJwogICAgfSBlbHNlIGlmIChjaGFyID09PSAnLycgJiYgdGV4dFtpbmRleCArIDFdID09PSAnKicpIHsKICAgICAgaW5kZXggPSB0ZXh0LmluZGV4T2YoJyovJywgaW5kZXggKyAyKQogICAgICBpZiAoaW5kZXggPCAwKSBicmVhawogICAgICBpbmRleCArPSAxCiAgICB9IGVsc2UgaWYgKC9bQS1aYS16XyRdLy50ZXN0KGNoYXIpICYmIC9beyxdXHMqJC8udGVzdChvdXQpKSB7CiAgICAgIC8vIEFuIHVucXVvdGVkIGtleS4KICAgICAgY29uc3Qga2V5ID0gdGV4dC5zbGljZShpbmRleCkubWF0Y2goL15bQS1aYS16XyRdW1x3JF0qLylbMF0KICAgICAgb3V0ICs9IEpTT04uc3RyaW5naWZ5KGtleSkKICAgICAgaW5kZXggKz0ga2V5Lmxlbmd0aCAtIDEKICAgIH0gZWxzZSBvdXQgKz0gY2hhcgogIH0KICByZXR1cm4gSlNPTi5wYXJzZShvdXQucmVwbGFjZSgvLChccypbfVxdXSkvZywgJyQxJykpCn0KCi8qKgogKiBXaGVyZSB0aGUgR2F0ZXdheSBvbiB0aGlzIGNvbXB1dGVyIGxpc3RlbnMgYW5kIGhvdyB0byBzaWduIGluIHRvIGl0LCBmcm9tCiAqIE9wZW5DbGF3J3MgY29uZmlnIChPUEVOQ0xBV19DT05GSUdfUEFUSCwgZWxzZSA8aG9tZT4vb3BlbmNsYXcuanNvbikuCiAqLwpleHBvcnQgZnVuY3Rpb24gbG9jYWxHYXRld2F5KGVudiA9IHByb2Nlc3MuZW52KSB7CiAgY29uc3QgcGF0aCA9IGVudi5PUEVOQ0xBV19DT05GSUdfUEFUSCB8fCBqb2luKG9wZW5jbGF3SG9tZShlbnYpLCAnb3BlbmNsYXcuanNvbicpCiAgbGV0IGNvbmZpZwogIHRyeSB7CiAgICBjb25maWcgPSBwYXJzZUNvbmZpZyhyZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKSkKICB9IGNhdGNoIChlcnJvcikgewogICAgdGhyb3cgbmV3IEVycm9yKGVycm9yPy5jb2RlID09PSAnRU5PRU5UJyA/IGBPcGVuQ2xhdyBpcyBub3Qgc2V0IHVwIG9uIHRoaXMgY29tcHV0ZXIgKG5vICR7cGF0aH0pLiBSdW46IG9wZW5jbGF3IG9uYm9hcmQgLS1pbnN0YWxsLWRhZW1vbmAgOiBgQ291bGQgbm90IHJlYWQgT3BlbkNsYXcncyBjb25maWcgYXQgJHtwYXRofTogJHtlcnJvci5tZXNzYWdlfWApCiAgfQogIGNvbnN0IGdhdGV3YXkgPSBjb25maWc/LmdhdGV3YXkgPz8ge30KICBpZiAoZ2F0ZXdheS5tb2RlID09PSAncmVtb3RlJykgdGhyb3cgbmV3IEVycm9yKCJUaGlzIGNvbXB1dGVyJ3MgT3BlbkNsYXcgdXNlcyBhIHJlbW90ZSBHYXRld2F5LiBJbnN0YWxsIHRoZSBwYWNrIG9uIHRoZSBjb21wdXRlciB0aGF0IHJ1bnMgdGhlIEdhdGV3YXkuIikKICBjb25zdCBwb3J0ID0gTnVtYmVyKGVudi5PUEVOQ0xBV19HQVRFV0FZX1BPUlQgfHwgZ2F0ZXdheS5wb3J0IHx8IDE4Nzg5KQogIGNvbnN0IGF1dGggPSBnYXRld2F5LmF1dGggPz8ge30KICBjb25zdCBzZWNyZXQgPSAodmFsdWUpID0+ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB2YWx1ZT8uc291cmNlID09PSAnZW52JyAmJiB0eXBlb2YgdmFsdWUuaWQgPT09ICdzdHJpbmcnID8gZW52W3ZhbHVlLmlkXSA6IHVuZGVmaW5lZCkKICBjb25zdCB0b2tlbiA9IGF1dGgubW9kZSA9PT0gJ3Bhc3N3b3JkJyA/IHVuZGVmaW5lZCA6IHNlY3JldChhdXRoLnRva2VuKQogIGNvbnN0IHBhc3N3b3JkID0gYXV0aC5tb2RlID09PSAncGFzc3dvcmQnID8gc2VjcmV0KGF1dGgucGFzc3dvcmQpIDogdW5kZWZpbmVkCiAgaWYgKGF1dGgubW9kZSAhPT0gJ25vbmUnICYmICF0b2tlbiAmJiAhcGFzc3dvcmQpIHRocm93IG5ldyBFcnJvcigiT3BlbkNsYXcncyBHYXRld2F5IHRva2VuIGlzIG5vdCByZWFkYWJsZSBmcm9tIGl0cyBjb25maWcgKGl0IG1heSBiZSBrZXB0IGluIGEgc2VjcmV0IHN0b3JlKS4gU2V0IGdhdGV3YXkuYXV0aC50b2tlbiBpbiBPcGVuQ2xhdydzIGNvbmZpZy4iKQogIHJldHVybiB7IHVybDogYHdzOi8vMTI3LjAuMC4xOiR7cG9ydH1gLCBhdXRoOiB7IC4uLih0b2tlbiA/IHsgdG9rZW4gfSA6IHt9KSwgLi4uKHBhc3N3b3JkID8geyBwYXNzd29yZCB9IDoge30pIH0gfQp9CgovKioKICogQSBsb25nLWxpdmVkIEdhdGV3YXkgY29ubmVjdGlvbi4gYHJlcXVlc3QobWV0aG9kLCBwYXJhbXMpYCB3YWl0cyBicmllZmx5CiAqIGZvciB0aGUgY29ubmVjdGlvbiwgdGhlbiBzZW5kczsgYG9uRXZlbnQobGlzdGVuZXIpYCByZWNlaXZlcyBldmVyeSBldmVudAogKiBmcmFtZS4gSXQgcmVjb25uZWN0cyB3aXRoIGJhY2tvZmYgYWZ0ZXIgdGhlIEdhdGV3YXkgcmVzdGFydHMuCiAqLwpleHBvcnQgZnVuY3Rpb24gZ2F0ZXdheUNsaWVudCh7IHJlc29sdmUgPSAoKSA9PiBsb2NhbEdhdGV3YXkoKSwgV2ViU29ja2V0SW1wbCA9IGdsb2JhbFRoaXMuV2ViU29ja2V0LCB2ZXJzaW9uID0gJzEuMC4wJywgbG9nID0gKCkgPT4ge30gfSA9IHt9KSB7CiAgbGV0IHNvY2tldCA9IG51bGwKICBsZXQgcmVhZHkgPSBmYWxzZQogIGxldCBjbG9zZWQgPSBmYWxzZQogIGxldCBsYXN0RXJyb3IgPSBudWxsCiAgbGV0IHJldHJ5TXMgPSAxXzAwMAogIGxldCByZXRyeVRpbWVyID0gbnVsbAogIGxldCBzZXF1ZW5jZSA9IDAKICBjb25zdCBwZW5kaW5nID0gbmV3IE1hcCgpCiAgY29uc3Qgd2FpdGVycyA9IG5ldyBTZXQoKQogIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQoKQoKICBjb25zdCBzZXR0bGVXYWl0ZXJzID0gKCkgPT4gewogICAgZm9yIChjb25zdCB3YWl0ZXIgb2YgWy4uLndhaXRlcnNdKSB3YWl0ZXIoKQogIH0KICBjb25zdCBmYWlsID0gKGVycm9yKSA9PiB7CiAgICBsYXN0RXJyb3IgPSBlcnJvcgogICAgZm9yIChjb25zdCBlbnRyeSBvZiBwZW5kaW5nLnZhbHVlcygpKSBlbnRyeS5yZWplY3QoZXJyb3IpCiAgICBwZW5kaW5nLmNsZWFyKCkKICB9CiAgY29uc3Qgc2VuZCA9IChmcmFtZSkgPT4gc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZnJhbWUpKQogIGNvbnN0IGNhbGwgPSAobWV0aG9kLCBwYXJhbXMpID0+CiAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZUNhbGwsIHJlamVjdCkgPT4gewogICAgICBjb25zdCBpZCA9IGBzJHsoc2VxdWVuY2UgKz0gMSl9YAogICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHBlbmRpbmcuZGVsZXRlKGlkKQogICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE9wZW5DbGF3IGRpZCBub3QgYW5zd2VyICR7bWV0aG9kfSBpbiB0aW1lYCkpCiAgICAgIH0sIFJFUVVFU1RfVElNRU9VVF9NUykKICAgICAgcGVuZGluZy5zZXQoaWQsIHsKICAgICAgICByZXNvbHZlOiAodmFsdWUpID0+IChjbGVhclRpbWVvdXQodGltZXIpLCByZXNvbHZlQ2FsbCh2YWx1ZSkpLAogICAgICAgIHJlamVjdDogKGVycm9yKSA9PiAoY2xlYXJUaW1lb3V0KHRpbWVyKSwgcmVqZWN0KGVycm9yKSksCiAgICAgIH0pCiAgICAgIHNlbmQoeyB0eXBlOiAncmVxJywgaWQsIG1ldGhvZCwgcGFyYW1zIH0pCiAgICB9KQoKICBjb25zdCBjb25uZWN0ID0gKCkgPT4gewogICAgaWYgKGNsb3NlZCkgcmV0dXJuCiAgICBsZXQgdGFyZ2V0CiAgICB0cnkgewogICAgICB0YXJnZXQgPSByZXNvbHZlKCkKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGxhc3RFcnJvciA9IGVycm9yCiAgICAgIHNldHRsZVdhaXRlcnMoKQogICAgICByZXR1cm4gc2NoZWR1bGUoKQogICAgfQogICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0SW1wbCh0YXJnZXQudXJsKQogICAgc29ja2V0ID0gd3MKICAgIHdzLm9ubWVzc2FnZSA9IChldmVudCkgPT4gewogICAgICBsZXQgZnJhbWUKICAgICAgdHJ5IHsKICAgICAgICBmcmFtZSA9IEpTT04ucGFyc2UodHlwZW9mIGV2ZW50LmRhdGEgPT09ICdzdHJpbmcnID8gZXZlbnQuZGF0YSA6IFN0cmluZyhldmVudC5kYXRhKSkKICAgICAgfSBjYXRjaCB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgaWYgKGZyYW1lLnR5cGUgPT09ICdyZXMnKSB7CiAgICAgICAgY29uc3QgZW50cnkgPSBwZW5kaW5nLmdldChmcmFtZS5pZCkKICAgICAgICBpZiAoIWVudHJ5KSByZXR1cm4KICAgICAgICBwZW5kaW5nLmRlbGV0ZShmcmFtZS5pZCkKICAgICAgICBpZiAoZnJhbWUub2spIGVudHJ5LnJlc29sdmUoZnJhbWUucGF5bG9hZCkKICAgICAgICBlbHNlIGVudHJ5LnJlamVjdChuZXcgRXJyb3IoZnJhbWUuZXJyb3I/Lm1lc3NhZ2UgfHwgJ09wZW5DbGF3IHJlZnVzZWQgdGhlIHJlcXVlc3QnKSkKICAgICAgfSBlbHNlIGlmIChmcmFtZS50eXBlID09PSAnZXZlbnQnICYmIGZyYW1lLmV2ZW50ID09PSAnY29ubmVjdC5jaGFsbGVuZ2UnKSB7CiAgICAgICAgY2FsbCgnY29ubmVjdCcsIHsKICAgICAgICAgIG1pblByb3RvY29sOiBQUk9UT0NPTCwKICAgICAgICAgIG1heFByb3RvY29sOiBQUk9UT0NPTCwKICAgICAgICAgIGNsaWVudDogeyBpZDogJ2dhdGV3YXktY2xpZW50JywgdmVyc2lvbiwgcGxhdGZvcm06IHByb2Nlc3MucGxhdGZvcm0sIG1vZGU6ICdiYWNrZW5kJywgZGlzcGxheU5hbWU6ICdTaWRlYnVkJyB9LAogICAgICAgICAgcm9sZTogJ29wZXJhdG9yJywKICAgICAgICAgIHNjb3BlczogU0NPUEVTLAogICAgICAgICAgY2FwczogQ0FQUywKICAgICAgICAgIGF1dGg6IHRhcmdldC5hdXRoLAogICAgICAgIH0pLnRoZW4oCiAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZQogICAgICAgICAgICBsYXN0RXJyb3IgPSBudWxsCiAgICAgICAgICAgIHJldHJ5TXMgPSAxXzAwMAogICAgICAgICAgICBzZXR0bGVXYWl0ZXJzKCkKICAgICAgICAgICAgbG9nKCdjb25uZWN0ZWQnKQogICAgICAgICAgfSwKICAgICAgICAgIChlcnJvcikgPT4gewogICAgICAgICAgICBsYXN0RXJyb3IgPSBuZXcgRXJyb3IoYE9wZW5DbGF3J3MgR2F0ZXdheSByZWZ1c2VkIFNpZGVidWQ6ICR7ZXJyb3IubWVzc2FnZX1gKQogICAgICAgICAgICBzZXR0bGVXYWl0ZXJzKCkKICAgICAgICAgICAgd3MuY2xvc2UoKQogICAgICAgICAgfQogICAgICAgICkKICAgICAgfSBlbHNlIGlmIChmcmFtZS50eXBlID09PSAnZXZlbnQnKSB7CiAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIGxpc3RlbmVyKGZyYW1lLmV2ZW50LCBmcmFtZS5wYXlsb2FkKQogICAgICB9CiAgICB9CiAgICB3cy5vbmVycm9yID0gKCkgPT4gewogICAgICBsYXN0RXJyb3IgPSBsYXN0RXJyb3IgPz8gbmV3IEVycm9yKGBPcGVuQ2xhdydzIEdhdGV3YXkgaXMgbm90IHJ1bm5pbmcgYXQgJHt0YXJnZXQudXJsfS4gU3RhcnQgaXQgd2l0aDogb3BlbmNsYXcgZ2F0ZXdheSBzdGFydGApCiAgICB9CiAgICB3cy5vbmNsb3NlID0gKCkgPT4gewogICAgICBpZiAoc29ja2V0ICE9PSB3cykgcmV0dXJuCiAgICAgIGNvbnN0IHdhc1JlYWR5ID0gcmVhZHkKICAgICAgcmVhZHkgPSBmYWxzZQogICAgICBzb2NrZXQgPSBudWxsCiAgICAgIGZhaWwobGFzdEVycm9yID8/IG5ldyBFcnJvcignVGhlIE9wZW5DbGF3IEdhdGV3YXkgY2xvc2VkIHRoZSBjb25uZWN0aW9uJykpCiAgICAgIGlmICghd2FzUmVhZHkpIGxhc3RFcnJvciA9IGxhc3RFcnJvciA/PyBuZXcgRXJyb3IoYE9wZW5DbGF3J3MgR2F0ZXdheSBpcyBub3QgcnVubmluZyBhdCAke3RhcmdldC51cmx9LiBTdGFydCBpdCB3aXRoOiBvcGVuY2xhdyBnYXRld2F5IHN0YXJ0YCkKICAgICAgc2V0dGxlV2FpdGVycygpCiAgICAgIHNjaGVkdWxlKCkKICAgIH0KICB9CiAgY29uc3Qgc2NoZWR1bGUgPSAoKSA9PiB7CiAgICBpZiAoY2xvc2VkIHx8IHJldHJ5VGltZXIpIHJldHVybgogICAgcmV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICByZXRyeVRpbWVyID0gbnVsbAogICAgICBjb25uZWN0KCkKICAgIH0sIHJldHJ5TXMpCiAgICByZXRyeU1zID0gTWF0aC5taW4ocmV0cnlNcyAqIDIsIFJFVFJZX01BWF9NUykKICB9CiAgY29uc3Qgd2hlblJlYWR5ID0gKCkgPT4KICAgIHJlYWR5CiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKCkKICAgICAgOiBuZXcgUHJvbWlzZSgocmVzb2x2ZVJlYWR5LCByZWplY3QpID0+IHsKICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgIHdhaXRlcnMuZGVsZXRlKGRvbmUpCiAgICAgICAgICAgIHJlamVjdChsYXN0RXJyb3IgPz8gbmV3IEVycm9yKCdPcGVuQ2xhdyBpcyBzdGlsbCBzdGFydGluZyBpdHMgR2F0ZXdheTsgdHJ5IGFnYWluIGluIGEgbWludXRlJykpCiAgICAgICAgICB9LCBDT05ORUNUX1dBSVRfTVMpCiAgICAgICAgICBjb25zdCBkb25lID0gKCkgPT4gewogICAgICAgICAgICAvLyBBIGZhaWxlZCBhdHRlbXB0IGlzIHJlcG9ydGVkIG5vdyByYXRoZXIgdGhhbiBhdCB0aGUgdGltZW91dDsgcmV0cmllcyBjb250aW51ZSBpbiB0aGUgYmFja2dyb3VuZC4KICAgICAgICAgICAgaWYgKCFyZWFkeSAmJiAhbGFzdEVycm9yKSByZXR1cm4KICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKQogICAgICAgICAgICB3YWl0ZXJzLmRlbGV0ZShkb25lKQogICAgICAgICAgICBpZiAocmVhZHkpIHJlc29sdmVSZWFkeSgpCiAgICAgICAgICAgIGVsc2UgcmVqZWN0KGxhc3RFcnJvcikKICAgICAgICAgIH0KICAgICAgICAgIHdhaXRlcnMuYWRkKGRvbmUpCiAgICAgICAgICBpZiAoc29ja2V0KSByZXR1cm4KICAgICAgICAgIC8vIEEgcmVxdWVzdCByZWNvbm5lY3RzIG5vdyBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBiYWNrb2ZmICh0aGUgR2F0ZXdheSBtYXkgaGF2ZSBqdXN0IHJlc3RhcnRlZCkuCiAgICAgICAgICBjbGVhclRpbWVvdXQocmV0cnlUaW1lcikKICAgICAgICAgIHJldHJ5VGltZXIgPSBudWxsCiAgICAgICAgICBsYXN0RXJyb3IgPSBudWxsCiAgICAgICAgICBjb25uZWN0KCkKICAgICAgICB9KQoKICByZXR1cm4gewogICAgc3RhcnQ6ICgpID0+IGNvbm5lY3QoKSwKICAgIGFzeW5jIHJlcXVlc3QobWV0aG9kLCBwYXJhbXMgPSB7fSkgewogICAgICBhd2FpdCB3aGVuUmVhZHkoKQogICAgICByZXR1cm4gY2FsbChtZXRob2QsIHBhcmFtcykKICAgIH0sCiAgICBvbkV2ZW50KGxpc3RlbmVyKSB7CiAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpCiAgICAgIHJldHVybiAoKSA9PiBsaXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKQogICAgfSwKICAgIGdldCByZWFkeSgpIHsKICAgICAgcmV0dXJuIHJlYWR5CiAgICB9LAogICAgY2xvc2UoKSB7CiAgICAgIGNsb3NlZCA9IHRydWUKICAgICAgY2xlYXJUaW1lb3V0KHJldHJ5VGltZXIpCiAgICAgIHNvY2tldD8uY2xvc2UoKQogICAgfSwKICB9Cn0K","server/index.mjs":"Ly8gT3BlbkNsYXcgTUNQIHNlcnZlciBmb3IgdGhpcyBwYWNrOiB0aGUgdXNlcidzIE9wZW5DbGF3IGFnZW50cywgdGhlaXIKLy8gc2Vzc2lvbnMgYW5kIHdoYXQgaXMgcnVubmluZywgYXBwcm92YWxzIHdhaXRpbmcgZm9yIHRoZSB1c2VyLCByZWNlbnQgcnVucywKLy8gc2NoZWR1bGVkIGpvYnMsIGFuZCBjaGF0IGNoYW5uZWxzLCByZWFkIGZyb20gdGhlIE9wZW5DbGF3IEdhdGV3YXkgb24gdGhpcwovLyBjb21wdXRlciAoc2VlIGdhdGV3YXkubWpzKS4gUmVwbGllcywgbmV3IHNlc3Npb25zLCBzdG9wcGluZyBhIHJ1biwgam9icywgYW5kCi8vIGFwcHJvdmFsIGFuc3dlcnMgZ28gdGhyb3VnaCB0aGUgc2FtZSBHYXRld2F5LgppbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nCmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCcKaW1wb3J0IHsgZ2F0ZXdheUNsaWVudCB9IGZyb20gJy4vZ2F0ZXdheS5tanMnCmltcG9ydCB7IGFyZywgc2VydmUgfSBmcm9tICcuL21jcC5tanMnCgpjb25zdCBWRVJTSU9OID0gJzEuMC4wJwpjb25zdCByZWFkID0geyByZWFkT25seUhpbnQ6IHRydWUsIGRlc3RydWN0aXZlSGludDogZmFsc2UsIGlkZW1wb3RlbnRIaW50OiB0cnVlIH0KY29uc3Qgd29yayA9IHsgcmVhZE9ubHlIaW50OiBmYWxzZSwgZGVzdHJ1Y3RpdmVIaW50OiBmYWxzZSwgaWRlbXBvdGVudEhpbnQ6IGZhbHNlIH0KY29uc3QgQUdFTlQgPSAvXltBLVphLXowLTldW0EtWmEtejAtOS5fLV17MCw2M30kLwpjb25zdCBLRVkgPSAvXltBLVphLXowLTldW0EtWmEtejAtOS5fOkArLz0tXXswLDI1NX0kLwpjb25zdCBBUFBST1ZBTCA9IC9eKHBsdWdpbjopP1tBLVphLXowLTldW0EtWmEtejAtOS5fOi1dezAsMTI3fSQvCmNvbnN0IERFQ0lTSU9OUyA9IFsnYWxsb3ctb25jZScsICdhbGxvdy1hbHdheXMnLCAnZGVueSddCi8qKgogKiBBIHdpZGdldCBjb250cm9sIGFuc3dlcnMgdGhlIG9sZGVzdCB3YWl0aW5nIGFwcHJvdmFsLCB3aGljaCB0aGUgcGhvbmUgc2hvd2VkCiAqIGluIGl0cyBjb25maXJtYXRpb24uIFRoZSBwaG9uZSBzZW5kcyBvbmx5IHRoZSBjb250cm9sLCBzbyB0aGUgc2VydmVyIHJlZnVzZXMKICogd2hlbiB0aGF0IGFwcHJvdmFsIGJlY2FtZSB0aGUgb2xkZXN0IHRoaXMgcmVjZW50bHk6IHRoZSBvbmUgdGhlIHVzZXIgcmVhZAogKiBtYXkgaGF2ZSBqdXN0IGJlZW4gYW5zd2VyZWQgZWxzZXdoZXJlLgogKi8KY29uc3QgT0xERVNUX1NUQUJMRV9NUyA9IDEwXzAwMAovKiogQm9hcmQgY29sdW1ucyBmb3IgT3BlbkNsYXcncyBydW4gc3RhdHVzZXMuICovCmNvbnN0IENPTFVNTiA9IHsgcXVldWVkOiAncXVldWVkJywgd2FpdGluZzogJ3F1ZXVlZCcsIHJ1bm5pbmc6ICdydW5uaW5nJywgYmxvY2tlZDogJ2Jsb2NrZWQnLCBjb21wbGV0ZWQ6ICdkb25lJywgc3VjY2VlZGVkOiAnZG9uZScsIGZhaWxlZDogJ2ZhaWxlZCcsIHRpbWVkX291dDogJ2ZhaWxlZCcsIGNhbmNlbGxlZDogJ2ZhaWxlZCcsIGNhbmNlbGVkOiAnZmFpbGVkJywgbG9zdDogJ2ZhaWxlZCcgfQpjb25zdCBLSU5EID0geyBjbGk6ICdydW4nLCBjaGF0OiAnY2hhdCcsIGF1dG9tYXRpb25fcnVuOiAnc2NoZWR1bGVkJywgY3JvbjogJ3NjaGVkdWxlZCcsIHN1YmFnZW50OiAnc3ViYWdlbnQnLCBhY3A6ICdBQ1AnIH0KCmNvbnN0IGlzbyA9IChtcykgPT4gKHR5cGVvZiBtcyA9PT0gJ251bWJlcicgJiYgbXMgPiAwID8gbmV3IERhdGUobXMpLnRvSVNPU3RyaW5nKCkgOiBudWxsKQpjb25zdCBjbGlwID0gKHRleHQsIG1heCkgPT4gKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJyAmJiB0ZXh0LnRyaW0oKSA/ICh0ZXh0Lmxlbmd0aCA+IG1heCA/IGAke3RleHQuc2xpY2UoMCwgbWF4IC0gMSl94oCmYCA6IHRleHQpIDogbnVsbCkKY29uc3Qgb25lTGluZSA9ICh0ZXh0KSA9PiAodHlwZW9mIHRleHQgPT09ICdzdHJpbmcnID8gdGV4dC5yZXBsYWNlKC9ccysvZywgJyAnKS50cmltKCkgOiB0ZXh0KQpjb25zdCBhZ2VudE9mS2V5ID0gKGtleSkgPT4gKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleS5zdGFydHNXaXRoKCdhZ2VudDonKSA/IGtleS5zcGxpdCgnOicpWzFdIHx8IG51bGwgOiBudWxsKQpjb25zdCB3b3JkcyA9IChpZCkgPT4gKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycgPyBpZC5yZXBsYWNlKC9bLV9dKy9nLCAnICcpIDogaWQpCmNvbnN0IHRpdGxlID0gKHRleHQpID0+ICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgJiYgdGV4dCA/IHRleHRbMF0udG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSkgOiB0ZXh0KQpjb25zdCBwbHVyYWwgPSAoY291bnQsIG9uZSwgbWFueSA9IGAke29uZX1zYCkgPT4gYCR7Y291bnR9ICR7Y291bnQgPT09IDEgPyBvbmUgOiBtYW55fWAKCi8qKiAiZXZlcnkgMzBtIiwgImRhaWx5IGF0IDA4OjAwIiwgb3IgdGhlIGNyb24gZXhwcmVzc2lvbiwgZnJvbSBhbiBPcGVuQ2xhdyBzY2hlZHVsZS4gKi8KZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlVGV4dChzY2hlZHVsZSkgewogIGlmICghc2NoZWR1bGUgfHwgdHlwZW9mIHNjaGVkdWxlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGwKICBpZiAoc2NoZWR1bGUua2luZCA9PT0gJ2V2ZXJ5JyAmJiBzY2hlZHVsZS5ldmVyeU1zID4gMCkgewogICAgY29uc3QgbWludXRlcyA9IE1hdGgucm91bmQoc2NoZWR1bGUuZXZlcnlNcyAvIDYwXzAwMCkKICAgIGlmIChtaW51dGVzICUgMTBfMDgwID09PSAwKSByZXR1cm4gbWludXRlcyA9PT0gMTBfMDgwID8gJ2V2ZXJ5IHdlZWsnIDogYGV2ZXJ5ICR7bWludXRlcyAvIDEwXzA4MH0gd2Vla3NgCiAgICBpZiAobWludXRlcyAlIDFfNDQwID09PSAwKSByZXR1cm4gbWludXRlcyA9PT0gMV80NDAgPyAnZXZlcnkgZGF5JyA6IGBldmVyeSAke21pbnV0ZXMgLyAxXzQ0MH0gZGF5c2AKICAgIGlmIChtaW51dGVzICUgNjAgPT09IDApIHJldHVybiBtaW51dGVzID09PSA2MCA/ICdldmVyeSBob3VyJyA6IGBldmVyeSAke21pbnV0ZXMgLyA2MH1oYAogICAgcmV0dXJuIGBldmVyeSAke21pbnV0ZXN9bWAKICB9CiAgaWYgKHNjaGVkdWxlLmtpbmQgPT09ICdhdCcpIHJldHVybiAnb25jZScKICBpZiAoc2NoZWR1bGUua2luZCA9PT0gJ2Nyb24nICYmIHR5cGVvZiBzY2hlZHVsZS5leHByID09PSAnc3RyaW5nJykgewogICAgY29uc3QgW21pbnV0ZSwgaG91ciwgZGF5LCBtb250aCwgd2Vla2RheSwgLi4ucmVzdF0gPSBzY2hlZHVsZS5leHByLnRyaW0oKS5zcGxpdCgvXHMrLykKICAgIGNvbnN0IGF0ID0gL15cZCskLy50ZXN0KG1pbnV0ZSkgJiYgL15cZCskLy50ZXN0KGhvdXIpID8gYCR7aG91ci5wYWRTdGFydCgyLCAnMCcpfToke21pbnV0ZS5wYWRTdGFydCgyLCAnMCcpfWAgOiBudWxsCiAgICBjb25zdCB6b25lID0gc2NoZWR1bGUudHogPyBgICR7c2NoZWR1bGUudHp9YCA6ICcnCiAgICBpZiAoYXQgJiYgIXJlc3QubGVuZ3RoICYmIGRheSA9PT0gJyonICYmIG1vbnRoID09PSAnKicpIHsKICAgICAgaWYgKHdlZWtkYXkgPT09ICcqJykgcmV0dXJuIGBkYWlseSBhdCAke2F0fSR7em9uZX1gCiAgICAgIGlmICh3ZWVrZGF5ID09PSAnMS01JykgcmV0dXJuIGB3ZWVrZGF5cyBhdCAke2F0fSR7em9uZX1gCiAgICB9CiAgICByZXR1cm4gYGNyb24gJHtzY2hlZHVsZS5leHByfSR7em9uZX1gCiAgfQogIHJldHVybiBudWxsCn0KCi8qKiBXaGF0IGFuIGFwcHJvdmFsIGFza3MsIGluIGEgbGluZTogdGhlIGNvbW1hbmQsIG9yIHRoZSBmaWxlIGFuZCB0b29sLiAqLwpmdW5jdGlvbiBhcHByb3ZhbFN1bW1hcnkoa2luZCwgcmVxdWVzdCkgewogIGlmIChraW5kID09PSAnZXhlYycpIHJldHVybiBvbmVMaW5lKHJlcXVlc3Q/LmNvbW1hbmQgPz8gcmVxdWVzdD8uY29tbWFuZFRleHQgPz8gKEFycmF5LmlzQXJyYXkocmVxdWVzdD8uY29tbWFuZEFyZ3YpID8gcmVxdWVzdC5jb21tYW5kQXJndi5qb2luKCcgJykgOiBudWxsKSkKICBsZXQgZGV0YWlsID0gbnVsbAogIHRyeSB7CiAgICBkZXRhaWwgPSBKU09OLnBhcnNlKHJlcXVlc3Q/LmRldGFpbCA/PyAnbnVsbCcpCiAgfSBjYXRjaCB7fQogIGNvbnN0IGZyb21EZXRhaWwgPSBkZXRhaWwgJiYgdHlwZW9mIGRldGFpbCA9PT0gJ29iamVjdCcgPyBkZXRhaWwuY29tbWFuZCA/PyBkZXRhaWwuZmlsZV9wYXRoID8/IGRldGFpbC5wYXRoID8/IGRldGFpbC51cmwgOiBudWxsCiAgcmV0dXJuIG9uZUxpbmUoZnJvbURldGFpbCA/PyBTdHJpbmcocmVxdWVzdD8uZGVzY3JpcHRpb24gPz8gcmVxdWVzdD8udGl0bGUgPz8gJycpLnNwbGl0KCdcbicpWzBdKQp9Cgpjb25zdCBUT09MX1RJVExFUyA9IHsgYmFzaDogJ1J1biBhIGNvbW1hbmQnLCBleGVjOiAnUnVuIGEgY29tbWFuZCcsIHdyaXRlOiAnV3JpdGUgYSBmaWxlJywgZWRpdDogJ0VkaXQgYSBmaWxlJywgcmVhZDogJ1JlYWQgYSBmaWxlJywgd2ViZmV0Y2g6ICdPcGVuIGEgd2ViIHBhZ2UnLCB3ZWJzZWFyY2g6ICdTZWFyY2ggdGhlIHdlYicgfQoKLyoqCiAqIFRoZSBzZXJ2ZXIncyB0b29scy4gYGdhdGV3YXlgIGhhcyBgcmVxdWVzdChtZXRob2QsIHBhcmFtcylgOyBgbm93KClgIGlzIHRoZQogKiBjbG9jay4gS2VlcHMgc21hbGwgaW4tbWVtb3J5IHN0YXRlOiBzZXNzaW9uIHRpdGxlcywgYW5kIHdoZW4gdGhlIG9sZGVzdAogKiBhcHByb3ZhbCBiZWNhbWUgdGhlIG9sZGVzdC4KICovCmV4cG9ydCBmdW5jdGlvbiBvcGVuY2xhd1Rvb2xzKHsgZ2F0ZXdheSwgbm93ID0gKCkgPT4gRGF0ZS5ub3coKSB9KSB7CiAgY29uc3QgdGl0bGVzID0gbmV3IE1hcCgpCiAgbGV0IG9sZGVzdCA9IHsgaWQ6IG51bGwsIHNpbmNlOiAwIH0KCiAgY29uc3QgYWdlbnRzQnlJZCA9IGFzeW5jICgpID0+IHsKICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdhdGV3YXkucmVxdWVzdCgnYWdlbnRzLmxpc3QnLCB7fSkKICAgIHJldHVybiB7IGRlZmF1bHRJZDogcmVzdWx0Py5kZWZhdWx0SWQgPz8gJ21haW4nLCBhZ2VudHM6IEFycmF5LmlzQXJyYXkocmVzdWx0Py5hZ2VudHMpID8gcmVzdWx0LmFnZW50cyA6IFtdIH0KICB9CiAgY29uc3Qga25vd25BZ2VudCA9IGFzeW5jIChpZCkgPT4gewogICAgY29uc3QgeyBhZ2VudHMgfSA9IGF3YWl0IGFnZW50c0J5SWQoKQogICAgaWYgKCFhZ2VudHMuc29tZSgoYWdlbnQpID0+IGFnZW50LmlkID09PSBpZCkpIHRocm93IG5ldyBFcnJvcihgTm8gT3BlbkNsYXcgYWdlbnQgbmFtZWQgJHtpZH0uIGxpc3RfYWdlbnRzIHNob3dzIHRoZW0uYCkKICAgIHJldHVybiBpZAogIH0KICBjb25zdCBjaGFubmVsT2YgPSAocm93KSA9PiByb3cuZGVsaXZlcnlDb250ZXh0Py5jaGFubmVsID8/IHJvdy5sYXN0Q2hhbm5lbCA/PyByb3cuY2hhbm5lbCA/PyByb3cub3JpZ2luPy5wcm92aWRlciA/PyBudWxsCgogIC8qKiBUaXRsZXMgZnJvbSBlYWNoIHNlc3Npb24ncyBmaXJzdCB1c2VyIG1lc3NhZ2UsIGZldGNoZWQgb25jZSBwZXIgc2Vzc2lvbiBhbmQgcmVtZW1iZXJlZC4gKi8KICBjb25zdCBmaWxsVGl0bGVzID0gYXN5bmMgKHJvd3MpID0+IHsKICAgIGNvbnN0IG1pc3NpbmcgPSByb3dzLmZpbHRlcigocm93KSA9PiAhcm93LmxhYmVsICYmICFyb3cuZGlzcGxheU5hbWUgJiYgIXJvdy5kZXJpdmVkVGl0bGUgJiYgdGl0bGVzLmdldChyb3cua2V5KT8uc2Vzc2lvbklkICE9PSByb3cuc2Vzc2lvbklkKS5tYXAoKHJvdykgPT4gcm93LmtleSkKICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybgogICAgdHJ5IHsKICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0KCdzZXNzaW9ucy5wcmV2aWV3JywgeyBrZXlzOiBtaXNzaW5nLnNsaWNlKDAsIDIwKSB9KQogICAgICBmb3IgKGNvbnN0IHByZXZpZXcgb2YgcmVzdWx0Py5wcmV2aWV3cyA/PyBbXSkgewogICAgICAgIGNvbnN0IGZpcnN0ID0gKHByZXZpZXcuaXRlbXMgPz8gW10pLmZpbmQoKGl0ZW0pID0+IGl0ZW0ucm9sZSA9PT0gJ3VzZXInICYmIGl0ZW0udGV4dCkKICAgICAgICBjb25zdCByb3cgPSByb3dzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmtleSA9PT0gcHJldmlldy5rZXkpCiAgICAgICAgaWYgKGZpcnN0ICYmIHJvdykgdGl0bGVzLnNldChwcmV2aWV3LmtleSwgeyBzZXNzaW9uSWQ6IHJvdy5zZXNzaW9uSWQsIHRpdGxlOiBvbmVMaW5lKGZpcnN0LnRleHQpIH0pCiAgICAgIH0KICAgIH0gY2F0Y2ggewogICAgICAvLyBUaXRsZXMgYXJlIGEgbmljZXR5OyB0aGUgbGlzdCBzdGlsbCB3b3JrcyB3aXRoIGZhbGxiYWNrcy4KICAgIH0KICB9CgogIGNvbnN0IHNlc3Npb25Sb3dzID0gYXN5bmMgKHsgYWdlbnQsIGxpbWl0IH0pID0+IHsKICAgIC8vIE5vdCBleGNsdWRlU3lzdGVtOiBpdCBhbHNvIGRyb3BzIGNoYXRzIHN0YXJ0ZWQgd2l0aCBgb3BlbmNsYXcgYWdlbnRgIGZyb20gYSB0ZXJtaW5hbCwgd2hpY2ggYXJlIHRoZSB1c2VyJ3Mgb3duLgogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0KCdzZXNzaW9ucy5saXN0JywgeyBsaW1pdDogTWF0aC5taW4obGltaXQgKiAyLCAyMDApLCBzb3J0Qnk6ICdhY3Rpdml0eScsIGV4Y2x1ZGVDcm9uOiB0cnVlLCByZXF1aXJlTGFzdEludGVyYWN0aW9uOiB0cnVlLCBpbmNsdWRlRGVyaXZlZFRpdGxlczogdHJ1ZSwgaW5jbHVkZUxhc3RNZXNzYWdlOiB0cnVlIH0pCiAgICBjb25zdCByb3dzID0gKEFycmF5LmlzQXJyYXkocmVzdWx0Py5zZXNzaW9ucykgPyByZXN1bHQuc2Vzc2lvbnMgOiBbXSkuZmlsdGVyKChyb3cpID0+ICFyb3cuYXJjaGl2ZWQgJiYgKCFhZ2VudCB8fCAocm93LmFnZW50SWQgPz8gYWdlbnRPZktleShyb3cua2V5KSkgPT09IGFnZW50KSkuc2xpY2UoMCwgbGltaXQpCiAgICBhd2FpdCBmaWxsVGl0bGVzKHJvd3MpCiAgICByZXR1cm4gcm93cy5tYXAoKHJvdykgPT4gewogICAgICBjb25zdCBhZ2VudElkID0gcm93LmFnZW50SWQgPz8gYWdlbnRPZktleShyb3cua2V5KSA/PyAnbWFpbicKICAgICAgY29uc3QgcnVubmluZyA9IHJvdy5oYXNBY3RpdmVSdW4gPT09IHRydWUgfHwgKEFycmF5LmlzQXJyYXkocm93LmFjdGl2ZVJ1bklkcykgJiYgcm93LmFjdGl2ZVJ1bklkcy5sZW5ndGggPiAwKQogICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE9mKHJvdykKICAgICAgY29uc3QgbmFtZWQgPSByb3cubGFiZWwgfHwgcm93LmRpc3BsYXlOYW1lIHx8IHJvdy5kZXJpdmVkVGl0bGUgfHwgdGl0bGVzLmdldChyb3cua2V5KT8udGl0bGUKICAgICAgcmV0dXJuIHsKICAgICAgICBzZXNzaW9uX2tleTogcm93LmtleSwKICAgICAgICBhZ2VudDogYWdlbnRJZCwKICAgICAgICB0aXRsZTogY2xpcChvbmVMaW5lKG5hbWVkKSwgOTApID8/IChyb3cuaXNNYWluID8gYCR7YWdlbnRJZH06IG1haW4gY2hhdGAgOiBgJHthZ2VudElkfTogdW50aXRsZWQgY2hhdGApLAogICAgICAgIGNoYW5uZWwsCiAgICAgICAgd2hlcmU6IFthZ2VudElkLCBjaGFubmVsID8gdGl0bGUod29yZHMoY2hhbm5lbCkpIDogbnVsbF0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyDCtyAnKSwKICAgICAgICBzdGF0ZTogcnVubmluZyA/ICdydW5uaW5nJyA6ICdpZGxlJywKICAgICAgICAvKiogInJ1bm5pbmciIHdoaWxlIGl0IHdvcmtzLCBlbXB0eSBvdGhlcndpc2U6IGEgd2lkZ2V0IHNob3dzIGEgc3RhdHVzIG9ubHkgd2hlbiB0aGVyZSBpcyBuZXdzLiAqLwogICAgICAgIGFjdGl2aXR5OiBydW5uaW5nID8gJ3J1bm5pbmcnIDogJycsCiAgICAgICAgdW5yZWFkOiByb3cudW5yZWFkID09PSB0cnVlLAogICAgICAgIG1vZGVsOiByb3cubW9kZWwgPz8gbnVsbCwKICAgICAgICBsYXN0QWN0aXZpdHlBdDogaXNvKE1hdGgubWluKHJvdy5sYXN0QWN0aXZpdHlBdCA/PyByb3cudXBkYXRlZEF0ID8/IDAsIG5vdygpKSB8fCBudWxsKSwKICAgICAgICBwcmV2aWV3OiBjbGlwKG9uZUxpbmUocm93Lmxhc3RNZXNzYWdlUHJldmlldyksIDE2MCksCiAgICAgIH0KICAgIH0pCiAgfQoKICBjb25zdCBhcHByb3ZhbExpc3QgPSBhc3luYyAoKSA9PiB7CiAgICBjb25zdCBbZXhlYywgcGx1Z2luXSA9IGF3YWl0IFByb21pc2UuYWxsKFtnYXRld2F5LnJlcXVlc3QoJ2V4ZWMuYXBwcm92YWwubGlzdCcsIHt9KSwgZ2F0ZXdheS5yZXF1ZXN0KCdwbHVnaW4uYXBwcm92YWwubGlzdCcsIHt9KV0pCiAgICBjb25zdCBlbnRyaWVzID0gWy4uLihBcnJheS5pc0FycmF5KGV4ZWMpID8gZXhlYyA6IFtdKS5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwga2luZDogJ2V4ZWMnIH0pKSwgLi4uKEFycmF5LmlzQXJyYXkocGx1Z2luKSA/IHBsdWdpbiA6IFtdKS5tYXAoKGVudHJ5KSA9PiAoeyAuLi5lbnRyeSwga2luZDogJ3BsdWdpbicgfSkpXQogICAgY29uc3QgYXBwcm92YWxzID0gZW50cmllcwogICAgICAubWFwKChlbnRyeSkgPT4gewogICAgICAgIGNvbnN0IHJlcXVlc3QgPSBlbnRyeS5yZXF1ZXN0ID8/IHt9CiAgICAgICAgY29uc3QgdG9vbCA9IFN0cmluZyhyZXF1ZXN0LnRvb2xOYW1lID8/IChlbnRyeS5raW5kID09PSAnZXhlYycgPyAnZXhlYycgOiAndG9vbCcpKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpZDogZW50cnkuaWQsCiAgICAgICAgICBraW5kOiBlbnRyeS5raW5kLAogICAgICAgICAgYWdlbnQ6IHJlcXVlc3QuYWdlbnRJZCA/PyBhZ2VudE9mS2V5KHJlcXVlc3Quc2Vzc2lvbktleSkgPz8gJ21haW4nLAogICAgICAgICAgdG9vbCwKICAgICAgICAgIHRpdGxlOiBUT09MX1RJVExFU1t0b29sLnRvTG93ZXJDYXNlKCldID8/IGNsaXAocmVxdWVzdC50aXRsZSwgNjApID8/IGBVc2UgJHt0b29sfWAsCiAgICAgICAgICBzdW1tYXJ5OiBjbGlwKGFwcHJvdmFsU3VtbWFyeShlbnRyeS5raW5kLCByZXF1ZXN0KSwgMjAwKSA/PyAnTm8gZGV0YWlscyBnaXZlbicsCiAgICAgICAgICBzZXNzaW9uX2tleTogcmVxdWVzdC5zZXNzaW9uS2V5ID8/IG51bGwsCiAgICAgICAgICBkZWNpc2lvbnM6IEFycmF5LmlzQXJyYXkocmVxdWVzdC5hbGxvd2VkRGVjaXNpb25zKSA/IHJlcXVlc3QuYWxsb3dlZERlY2lzaW9ucy5maWx0ZXIoKGRlY2lzaW9uKSA9PiBERUNJU0lPTlMuaW5jbHVkZXMoZGVjaXNpb24pKSA6IERFQ0lTSU9OUywKICAgICAgICAgIGNyZWF0ZWRBdDogaXNvKGVudHJ5LmNyZWF0ZWRBdE1zKSwKICAgICAgICAgIGV4cGlyZXNBdDogaXNvKGVudHJ5LmV4cGlyZXNBdE1zKSwKICAgICAgICB9CiAgICAgIH0pCiAgICAgIC5zb3J0KChhLCBiKSA9PiBEYXRlLnBhcnNlKGEuY3JlYXRlZEF0ID8/IDApIC0gRGF0ZS5wYXJzZShiLmNyZWF0ZWRBdCA/PyAwKSkKICAgIGNvbnN0IGZpcnN0ID0gYXBwcm92YWxzWzBdPy5pZCA/PyBudWxsCiAgICBpZiAoZmlyc3QgIT09IG9sZGVzdC5pZCkgb2xkZXN0ID0geyBpZDogZmlyc3QsIHNpbmNlOiBub3coKSB9CiAgICByZXR1cm4gYXBwcm92YWxzCiAgfQoKICBjb25zdCB0YXNrUm93cyA9IGFzeW5jIChsaW1pdCkgPT4gewogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0KCd0YXNrcy5saXN0Jywge30pCiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkocmVzdWx0Py50YXNrcykgPyByZXN1bHQudGFza3MgOiBbXSkKICAgICAgLmZpbHRlcigodGFzaykgPT4gISh0YXNrLnJ1bnRpbWUgPT09ICdjcm9uJyAmJiAvXGJza2lwcGVkXGIvLnRlc3QoU3RyaW5nKHRhc2suZXJyb3IgPz8gJycpKSkpCiAgICAgIC5tYXAoKHRhc2spID0+IHsKICAgICAgICBjb25zdCBraW5kID0gS0lORFt0YXNrLmtpbmRdID8/IEtJTkRbdGFzay5ydW50aW1lXSA/PyB3b3Jkcyh0YXNrLmtpbmQgPz8gJ3J1bicpCiAgICAgICAgY29uc3QgYWdlbnQgPSB0YXNrLmFnZW50SWQgPz8gYWdlbnRPZktleSh0YXNrLnNlc3Npb25LZXkpID8/ICdtYWluJwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpZDogdGFzay5pZCA/PyB0YXNrLnRhc2tJZCwKICAgICAgICAgIHRpdGxlOiBjbGlwKG9uZUxpbmUodGFzay50aXRsZSksIDkwKSA/PyAnUnVuJywKICAgICAgICAgIGFnZW50LAogICAgICAgICAga2luZCwKICAgICAgICAgIHdoZXJlOiBgJHthZ2VudH0gwrcgJHtraW5kfWAsCiAgICAgICAgICBzdGF0dXM6IHRhc2suc3RhdHVzID8/ICd1bmtub3duJywKICAgICAgICAgIGNvbHVtbjogQ09MVU1OW3Rhc2suc3RhdHVzXSA/PyAnb3RoZXInLAogICAgICAgICAgc2Vzc2lvbl9rZXk6IHRhc2suY2hpbGRTZXNzaW9uS2V5IHx8IHRhc2suc2Vzc2lvbktleSB8fCBudWxsLAogICAgICAgICAgYWN0aXZpdHk6IGNsaXAob25lTGluZSh0YXNrLmxhc3RBY3Rpdml0eSA/PyB0YXNrLnByb2dyZXNzU3VtbWFyeSksIDEyMCksCiAgICAgICAgICBlcnJvcjogY2xpcChvbmVMaW5lKHRhc2suZXJyb3IpLCAyMDApLAogICAgICAgICAgc3RhcnRlZEF0OiBpc28odGFzay5zdGFydGVkQXQpLAogICAgICAgICAgdXBkYXRlZEF0OiBpc28oTWF0aC5taW4odGFzay5lbmRlZEF0ID8/IHRhc2sudXBkYXRlZEF0ID8/IHRhc2suY3JlYXRlZEF0ID8/IDAsIG5vdygpKSB8fCBudWxsKSwKICAgICAgICB9CiAgICAgIH0pCiAgICAgIC5zb3J0KChhLCBiKSA9PiBEYXRlLnBhcnNlKGIudXBkYXRlZEF0ID8/IDApIC0gRGF0ZS5wYXJzZShhLnVwZGF0ZWRBdCA/PyAwKSkKICAgICAgLnNsaWNlKDAsIGxpbWl0KQogIH0KCiAgY29uc3QgcmVzb2x2ZUFwcHJvdmFsID0gYXN5bmMgKGFwcHJvdmFsLCBkZWNpc2lvbikgPT4gewogICAgaWYgKCFhcHByb3ZhbC5kZWNpc2lvbnMuaW5jbHVkZXMoZGVjaXNpb24pKSB0aHJvdyBuZXcgRXJyb3IoYE9wZW5DbGF3IGFsbG93cyBvbmx5ICR7YXBwcm92YWwuZGVjaXNpb25zLmpvaW4oJywgJyl9IGZvciB0aGlzIHJlcXVlc3RgKQogICAgYXdhaXQgZ2F0ZXdheS5yZXF1ZXN0KGFwcHJvdmFsLmtpbmQgPT09ICdwbHVnaW4nID8gJ3BsdWdpbi5hcHByb3ZhbC5yZXNvbHZlJyA6ICdleGVjLmFwcHJvdmFsLnJlc29sdmUnLCB7IGlkOiBhcHByb3ZhbC5pZCwgZGVjaXNpb24gfSkKICAgIHJldHVybiB7IGFuc3dlcmVkOiB0cnVlLCBpZDogYXBwcm92YWwuaWQsIGRlY2lzaW9uLCBhZ2VudDogYXBwcm92YWwuYWdlbnQsIHN1bW1hcnk6IGFwcHJvdmFsLnN1bW1hcnkgfQogIH0KCiAgcmV0dXJuIFsKICAgIHsKICAgICAgbmFtZTogJ2xpc3RfYWdlbnRzJywKICAgICAgZGVzY3JpcHRpb246ICJUaGUgdXNlcidzIE9wZW5DbGF3IGFnZW50czogaWQsIG5hbWUsIG1vZGVsLCB3aGV0aGVyIGl0IGlzIHdvcmtpbmcgbm93LCBob3cgbWFueSBzZXNzaW9ucyBpdCBoYXMsIGFuZCBpdHMgbGFzdCBhY3Rpdml0eS4iLAogICAgICBpbnB1dFNjaGVtYTogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczoge30gfSwKICAgICAgYW5ub3RhdGlvbnM6IHJlYWQsCiAgICAgIHJ1bjogYXN5bmMgKCkgPT4gewogICAgICAgIGNvbnN0IFt7IGRlZmF1bHRJZCwgYWdlbnRzIH0sIHNlc3Npb25zXSA9IGF3YWl0IFByb21pc2UuYWxsKFthZ2VudHNCeUlkKCksIHNlc3Npb25Sb3dzKHsgbGltaXQ6IDIwMCB9KV0pCiAgICAgICAgY29uc3QgbGlzdCA9IGFnZW50cy5tYXAoKGFnZW50KSA9PiB7CiAgICAgICAgICBjb25zdCBvd24gPSBzZXNzaW9ucy5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uYWdlbnQgPT09IGFnZW50LmlkKQogICAgICAgICAgY29uc3Qgd29ya2luZyA9IG93bi5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uc3RhdGUgPT09ICdydW5uaW5nJykubGVuZ3RoCiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBpZDogYWdlbnQuaWQsCiAgICAgICAgICAgIG5hbWU6IGFnZW50LmlkZW50aXR5Py5uYW1lIHx8IGFnZW50Lm5hbWUgfHwgYWdlbnQuaWQsCiAgICAgICAgICAgIGVtb2ppOiBhZ2VudC5pZGVudGl0eT8uZW1vamkgPz8gbnVsbCwKICAgICAgICAgICAgbW9kZWw6IHR5cGVvZiBhZ2VudC5tb2RlbCA9PT0gJ3N0cmluZycgPyBhZ2VudC5tb2RlbCA6IGFnZW50Lm1vZGVsPy5wcmltYXJ5ID8/IG51bGwsCiAgICAgICAgICAgIGlzRGVmYXVsdDogYWdlbnQuaWQgPT09IGRlZmF1bHRJZCwKICAgICAgICAgICAgd29ya2luZ1Nlc3Npb25zOiB3b3JraW5nLAogICAgICAgICAgICBzdGF0ZTogd29ya2luZyA/ICd3b3JraW5nJyA6ICdpZGxlJywKICAgICAgICAgICAgYWN0aXZpdHk6IHdvcmtpbmcgPyAnd29ya2luZycgOiAnJywKICAgICAgICAgICAgc2Vzc2lvbnM6IG93bi5sZW5ndGgsCiAgICAgICAgICAgIGxhc3RBY3RpdmVBdDogb3duLm1hcCgoc2Vzc2lvbikgPT4gc2Vzc2lvbi5sYXN0QWN0aXZpdHlBdCkuZmlsdGVyKEJvb2xlYW4pLnNvcnQoKS5hdCgtMSkgPz8gbnVsbCwKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIHJldHVybiB7IGNvdW50OiBsaXN0Lmxlbmd0aCwgd29ya2luZzogbGlzdC5maWx0ZXIoKGFnZW50KSA9PiBhZ2VudC53b3JraW5nU2Vzc2lvbnMgPiAwKS5sZW5ndGgsIGFnZW50czogbGlzdCB9CiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAnbGlzdF9zZXNzaW9ucycsCiAgICAgIGRlc2NyaXB0aW9uOiAiUmVjZW50IE9wZW5DbGF3IHNlc3Npb25zIChjaGF0cyB3aXRoIGFuIGFnZW50LCBmcm9tIGFueSBjaGFubmVsIG9yIHRoZSBkYXNoYm9hcmQpLCBuZXdlc3QgYWN0aXZpdHkgZmlyc3Q6IHNlc3Npb25fa2V5LCBhZ2VudCwgdGl0bGUsIGNoYW5uZWwsIHdoZXRoZXIgYSBydW4gaXMgZ29pbmcgbm93LCBhbmQgdGhlIGxhc3QgbWVzc2FnZSBwcmV2aWV3LiBQYXNzIHNlc3Npb25fa2V5IHRvIHJlYWRfc2Vzc2lvbiwgc2VuZF9tZXNzYWdlLCBvciBzdG9wX3Nlc3Npb24uIiwKICAgICAgaW5wdXRTY2hlbWE6IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgYWdlbnQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnQWdlbnQgaWQ7IG9taXQgZm9yIGFsbCcgfSwgbGltaXQ6IHsgdHlwZTogJ2ludGVnZXInLCBtaW5pbXVtOiAxLCBtYXhpbXVtOiAxMDAsIGRlZmF1bHQ6IDIwIH0gfSB9LAogICAgICBhbm5vdGF0aW9uczogcmVhZCwKICAgICAgcnVuOiBhc3luYyAoYXJncykgPT4gewogICAgICAgIGNvbnN0IGFnZW50ID0gYXJncy5hZ2VudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogYXJnLnN0cmluZyhhcmdzLCAnYWdlbnQnLCB7IHBhdHRlcm46IEFHRU5UIH0pCiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBhd2FpdCBzZXNzaW9uUm93cyh7IGFnZW50LCBsaW1pdDogYXJnLmludGVnZXIoYXJncywgJ2xpbWl0JywgeyBtaW46IDEsIG1heDogMTAwLCBmYWxsYmFjazogMjAgfSkgfSkKICAgICAgICByZXR1cm4geyBjb3VudDogc2Vzc2lvbnMubGVuZ3RoLCBydW5uaW5nOiBzZXNzaW9ucy5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uc3RhdGUgPT09ICdydW5uaW5nJykubGVuZ3RoLCBzZXNzaW9ucyB9CiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAncmVhZF9zZXNzaW9uJywKICAgICAgZGVzY3JpcHRpb246ICJUaGUgbGF0ZXN0IG1lc3NhZ2VzIG9mIG9uZSBPcGVuQ2xhdyBzZXNzaW9uLCBvbGRlc3QgZmlyc3Q6IHRoZSB1c2VyJ3MgYW5kIHRoZSBhZ2VudCdzIHdvcmRzICh0b29sIGNhbGxzIGxlZnQgb3V0KS4iLAogICAgICBpbnB1dFNjaGVtYTogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBzZXNzaW9uX2tleTogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdGcm9tIGxpc3Rfc2Vzc2lvbnMsIGxpc3RfcnVucywgb3IgbGlzdF9hcHByb3ZhbHMnIH0sIGxpbWl0OiB7IHR5cGU6ICdpbnRlZ2VyJywgbWluaW11bTogMSwgbWF4aW11bTogNTAsIGRlZmF1bHQ6IDIwIH0gfSwgcmVxdWlyZWQ6IFsnc2Vzc2lvbl9rZXknXSB9LAogICAgICBhbm5vdGF0aW9uczogcmVhZCwKICAgICAgcnVuOiBhc3luYyAoYXJncykgPT4gewogICAgICAgIGNvbnN0IGtleSA9IGFyZy5zdHJpbmcoYXJncywgJ3Nlc3Npb25fa2V5JywgeyBwYXR0ZXJuOiBLRVkgfSkKICAgICAgICBjb25zdCBsaW1pdCA9IGFyZy5pbnRlZ2VyKGFyZ3MsICdsaW1pdCcsIHsgbWluOiAxLCBtYXg6IDUwLCBmYWxsYmFjazogMjAgfSkKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRld2F5LnJlcXVlc3QoJ2NoYXQuaGlzdG9yeScsIHsgc2Vzc2lvbktleToga2V5LCBsaW1pdDogbGltaXQgKiAzIH0pCiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSAoQXJyYXkuaXNBcnJheShyZXN1bHQ/Lm1lc3NhZ2VzKSA/IHJlc3VsdC5tZXNzYWdlcyA6IFtdKQogICAgICAgICAgLmZpbHRlcigobWVzc2FnZSkgPT4gbWVzc2FnZS5yb2xlID09PSAndXNlcicgfHwgbWVzc2FnZS5yb2xlID09PSAnYXNzaXN0YW50JykKICAgICAgICAgIC5tYXAoKG1lc3NhZ2UpID0+IHsKICAgICAgICAgICAgY29uc3QgdGV4dCA9IHR5cGVvZiBtZXNzYWdlLmNvbnRlbnQgPT09ICdzdHJpbmcnID8gbWVzc2FnZS5jb250ZW50IDogKEFycmF5LmlzQXJyYXkobWVzc2FnZS5jb250ZW50KSA/IG1lc3NhZ2UuY29udGVudCA6IFtdKS5maWx0ZXIoKGJsb2NrKSA9PiBibG9jaz8udHlwZSA9PT0gJ3RleHQnICYmIGJsb2NrLnRleHQpLm1hcCgoYmxvY2spID0+IGJsb2NrLnRleHQpLmpvaW4oJ1xuJykKICAgICAgICAgICAgcmV0dXJuIHsgcm9sZTogbWVzc2FnZS5yb2xlLCBjb250ZW50OiBjbGlwKHRleHQsIDJfMDAwKSwgYXQ6IGlzbyhtZXNzYWdlLnRpbWVzdGFtcCkgfQogICAgICAgICAgfSkKICAgICAgICAgIC5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UuY29udGVudCkKICAgICAgICAgIC5zbGljZSgtbGltaXQpCiAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbl9rZXk6IGtleSwgYWdlbnQ6IGFnZW50T2ZLZXkoa2V5KSwgY291bnQ6IG1lc3NhZ2VzLmxlbmd0aCwgbWVzc2FnZXMgfQogICAgICB9LAogICAgfSwKICAgIHsKICAgICAgbmFtZTogJ2xpc3RfYXBwcm92YWxzJywKICAgICAgZGVzY3JpcHRpb246ICdSZXF1ZXN0cyBmcm9tIE9wZW5DbGF3IGFnZW50cyB3YWl0aW5nIGZvciB0aGUgdXNlciwgb2xkZXN0IGZpcnN0OiBydW5uaW5nIGEgY29tbWFuZCwgZWRpdGluZyBhIGZpbGUsIG9yIHVzaW5nIGEgdG9vbC4gRWFjaCBoYXMgYW4gaWQsIHRoZSBhZ2VudCwgd2hhdCBpdCB3YW50cyAoc3VtbWFyeSksIHRoZSBkZWNpc2lvbnMgaXQgYWxsb3dzLCBhbmQgd2hlbiBpdCBleHBpcmVzOyB0aGUgYWdlbnQgaXMgcGF1c2VkIHVudGlsIGl0IGlzIGFuc3dlcmVkIG9yIGl0IGV4cGlyZXMuJywKICAgICAgaW5wdXRTY2hlbWE6IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHt9IH0sCiAgICAgIGFubm90YXRpb25zOiByZWFkLAogICAgICBydW46IGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBhcHByb3ZhbHMgPSBhd2FpdCBhcHByb3ZhbExpc3QoKQogICAgICAgIHJldHVybiB7IGNvdW50OiBhcHByb3ZhbHMubGVuZ3RoLCBhcHByb3ZhbHMsIG5leHQ6IGFwcHJvdmFscy5zbGljZSgwLCAxKSB9CiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAncmVzcG9uZF90b19hcHByb3ZhbCcsCiAgICAgIGRlc2NyaXB0aW9uOiAiQW5zd2VyIG9uZSB3YWl0aW5nIE9wZW5DbGF3IGFwcHJvdmFsIHdpdGggdGhlIHVzZXIncyBkZWNpc2lvbjogYWxsb3ctb25jZSwgYWxsb3ctYWx3YXlzIChvbmx5IHdoZW4gdGhlIHVzZXIgc2F5cyB0byBhbHdheXMgYWxsb3cgaXQpLCBvciBkZW55LiBPbmx5IHdpdGggdGhlIHVzZXIncyBleHBsaWNpdCBkZWNpc2lvbi4iLAogICAgICBpbnB1dFNjaGVtYTogewogICAgICAgIHR5cGU6ICdvYmplY3QnLAogICAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAgIGlkOiB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0Zyb20gbGlzdF9hcHByb3ZhbHMnIH0sCiAgICAgICAgICBkZWNpc2lvbjogeyB0eXBlOiAnc3RyaW5nJywgZW51bTogREVDSVNJT05TIH0sCiAgICAgICAgICBleHBlY3Rfb2xkZXN0OiB7IHR5cGU6ICdib29sZWFuJywgZGVzY3JpcHRpb246ICdSZWZ1c2UgdW5sZXNzIHRoaXMgaXMgc3RpbGwgdGhlIG9sZGVzdCB3YWl0aW5nIHJlcXVlc3QgYW5kIGhhcyBiZWVuIGZvciBhIGZldyBzZWNvbmRzICh1c2VkIGJ5IHRoZSB3aWRnZXQpJyB9LAogICAgICAgIH0sCiAgICAgICAgcmVxdWlyZWQ6IFsnaWQnLCAnZGVjaXNpb24nXSwKICAgICAgfSwKICAgICAgYW5ub3RhdGlvbnM6IHdvcmssCiAgICAgIHJ1bjogYXN5bmMgKGFyZ3MpID0+IHsKICAgICAgICBjb25zdCBpZCA9IGFyZy5zdHJpbmcoYXJncywgJ2lkJywgeyBwYXR0ZXJuOiBBUFBST1ZBTCB9KQogICAgICAgIGNvbnN0IGRlY2lzaW9uID0gYXJnLm9uZU9mKGFyZ3MsICdkZWNpc2lvbicsIERFQ0lTSU9OUykKICAgICAgICBjb25zdCBndWFyZCA9IGFyZy5ib29sZWFuKGFyZ3MsICdleHBlY3Rfb2xkZXN0JywgZmFsc2UpCiAgICAgICAgY29uc3QgYXBwcm92YWxzID0gYXdhaXQgYXBwcm92YWxMaXN0KCkKICAgICAgICBjb25zdCBhcHByb3ZhbCA9IGFwcHJvdmFscy5maW5kKChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pZCA9PT0gaWQpCiAgICAgICAgaWYgKCFhcHByb3ZhbCkgdGhyb3cgbmV3IEVycm9yKCdUaGF0IHJlcXVlc3QgaXMgbm8gbG9uZ2VyIHdhaXRpbmc6IGl0IHdhcyBhbnN3ZXJlZCBvciBleHBpcmVkJykKICAgICAgICBpZiAoZ3VhcmQgJiYgKGFwcHJvdmFsc1swXT8uaWQgIT09IGlkIHx8IG5vdygpIC0gb2xkZXN0LnNpbmNlIDwgT0xERVNUX1NUQUJMRV9NUykpIHRocm93IG5ldyBFcnJvcignVGhlIHdhaXRpbmcgcmVxdWVzdCBjaGFuZ2VkIGEgbW9tZW50IGFnby4gTG9vayBhdCBpdCBhZ2FpbiBiZWZvcmUgYW5zd2VyaW5nLicpCiAgICAgICAgcmV0dXJuIHJlc29sdmVBcHByb3ZhbChhcHByb3ZhbCwgZGVjaXNpb24pCiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAnbGlzdF9ydW5zJywKICAgICAgZGVzY3JpcHRpb246ICJPcGVuQ2xhdydzIHJlY2VudCBydW5zLCBuZXdlc3QgZmlyc3Q6IGNoYXQgdHVybnMsIENMSSBydW5zLCBzY2hlZHVsZWQgam9icywgYW5kIHN1YmFnZW50cywgd2l0aCBzdGF0dXMgKHF1ZXVlZCwgcnVubmluZywgYmxvY2tlZCwgc3VjY2VlZGVkLCBmYWlsZWTigKYpLCBhZ2VudCwgbGFzdCBhY3Rpdml0eSwgYW5kIGVycm9yLiBBIHJ1bidzIHNlc3Npb25fa2V5IG9wZW5zIGl0IHdpdGggcmVhZF9zZXNzaW9uLiIsCiAgICAgIGlucHV0U2NoZW1hOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGxpbWl0OiB7IHR5cGU6ICdpbnRlZ2VyJywgbWluaW11bTogMSwgbWF4aW11bTogMTAwLCBkZWZhdWx0OiA0MCB9IH0gfSwKICAgICAgYW5ub3RhdGlvbnM6IHJlYWQsCiAgICAgIHJ1bjogYXN5bmMgKGFyZ3MpID0+IHsKICAgICAgICBjb25zdCBydW5zID0gYXdhaXQgdGFza1Jvd3MoYXJnLmludGVnZXIoYXJncywgJ2xpbWl0JywgeyBtaW46IDEsIG1heDogMTAwLCBmYWxsYmFjazogNDAgfSkpCiAgICAgICAgcmV0dXJuIHsgY291bnQ6IHJ1bnMubGVuZ3RoLCBydW5uaW5nOiBydW5zLmZpbHRlcigocnVuKSA9PiBydW4uY29sdW1uID09PSAncnVubmluZycpLmxlbmd0aCwgZmFpbGVkOiBydW5zLmZpbHRlcigocnVuKSA9PiBydW4uY29sdW1uID09PSAnZmFpbGVkJykubGVuZ3RoLCBydW5zIH0KICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICdsaXN0X3NjaGVkdWxlZF9qb2JzJywKICAgICAgZGVzY3JpcHRpb246ICJPcGVuQ2xhdydzIHNjaGVkdWxlZCBqb2JzIChjcm9uKTogbmFtZSwgYWdlbnQsIHNjaGVkdWxlLCB3aGV0aGVyIGl0IGlzIG9uLCBuZXh0IGFuZCBsYXN0IHJ1biwgYW5kIHRoZSBsYXN0IGVycm9yLiBPcGVuQ2xhdydzIG93biB1cGtlZXAgam9icyAoaGVhcnRiZWF0LCBtZW1vcnksIHNraWxsIHJldmlldykgYXJlIGxlZnQgb3V0IHVubGVzcyBpbmNsdWRlX3Vwa2VlcCBpcyB0cnVlLiIsCiAgICAgIGlucHV0U2NoZW1hOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGluY2x1ZGVfdXBrZWVwOiB7IHR5cGU6ICdib29sZWFuJywgZGVmYXVsdDogZmFsc2UgfSB9IH0sCiAgICAgIGFubm90YXRpb25zOiByZWFkLAogICAgICBydW46IGFzeW5jIChhcmdzKSA9PiB7CiAgICAgICAgY29uc3QgdXBrZWVwID0gYXJnLmJvb2xlYW4oYXJncywgJ2luY2x1ZGVfdXBrZWVwJywgZmFsc2UpCiAgICAgICAgLy8gRGlzYWJsZWQgam9icyB0b28sIHNvIGEgam9iIHR1cm5lZCBvZmYgY2FuIGJlIGZvdW5kIGFuZCB0dXJuZWQgYmFjayBvbi4KICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRld2F5LnJlcXVlc3QoJ2Nyb24ubGlzdCcsIHsgaW5jbHVkZURpc2FibGVkOiB0cnVlIH0pCiAgICAgICAgY29uc3QgYWxsID0gQXJyYXkuaXNBcnJheShyZXN1bHQ/LmpvYnMpID8gcmVzdWx0LmpvYnMgOiBbXQogICAgICAgIGNvbnN0IGpvYnMgPSBhbGwKICAgICAgICAgIC5maWx0ZXIoKGpvYikgPT4gdXBrZWVwIHx8ICFqb2IuZGVjbGFyYXRpb25LZXkpCiAgICAgICAgICAubWFwKChqb2IpID0+IHsKICAgICAgICAgICAgY29uc3QgbGFzdFN0YXR1cyA9IGpvYi5sYXN0UnVuU3RhdHVzID8/IGpvYi5zdGF0ZT8ubGFzdFJ1blN0YXR1cyA/PyBudWxsCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgaWQ6IGpvYi5pZCwKICAgICAgICAgICAgICBuYW1lOiBjbGlwKGpvYi5kaXNwbGF5TmFtZSB8fCBqb2IubmFtZSwgNjApID8/ICdTY2hlZHVsZWQgam9iJywKICAgICAgICAgICAgICBhZ2VudDogam9iLmFnZW50SWQgPz8gam9iLmVmZmVjdGl2ZUFnZW50SWQgPz8gJ21haW4nLAogICAgICAgICAgICAgIHNjaGVkdWxlOiBzY2hlZHVsZVRleHQoam9iLnNjaGVkdWxlKSwKICAgICAgICAgICAgICBlbmFibGVkOiBqb2IuZW5hYmxlZCAhPT0gZmFsc2UsCiAgICAgICAgICAgICAgLyoqICJvZmYiIGZvciBhIHBhdXNlZCBqb2IsIHRoZSBsYXN0IHJ1bidzIHN0YXR1cyBvdGhlcndpc2UgKGVtcHR5IGJlZm9yZSBpdHMgZmlyc3QgcnVuKS4gKi8KICAgICAgICAgICAgICBzdGF0dXM6IGpvYi5lbmFibGVkID09PSBmYWxzZSA/ICdvZmYnIDogbGFzdFN0YXR1cyA9PT0gJ29rJyA/ICdvaycgOiBsYXN0U3RhdHVzID8/ICcnLAogICAgICAgICAgICAgIG5leHRSdW5BdDogam9iLmVuYWJsZWQgPT09IGZhbHNlID8gbnVsbCA6IGlzbyhqb2IubmV4dFJ1bkF0TXMgPz8gam9iLnN0YXRlPy5uZXh0UnVuQXRNcyksCiAgICAgICAgICAgICAgbGFzdFJ1bkF0OiBpc28oam9iLmxhc3RSdW5BdE1zID8/IGpvYi5zdGF0ZT8ubGFzdFJ1bkF0TXMpLAogICAgICAgICAgICAgIGxhc3RFcnJvcjogY2xpcChvbmVMaW5lKGpvYi5sYXN0UnVuRXJyb3IgPz8gam9iLnN0YXRlPy5sYXN0RXJyb3IpLCAyMDApLAogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChhLm5leHRSdW5BdCA/PyAnOScpLmxvY2FsZUNvbXBhcmUoYi5uZXh0UnVuQXQgPz8gJzknKSkKICAgICAgICByZXR1cm4geyBjb3VudDogam9icy5sZW5ndGgsIGVuYWJsZWQ6IGpvYnMuZmlsdGVyKChqb2IpID0+IGpvYi5lbmFibGVkKS5sZW5ndGgsIHVwa2VlcDogYWxsLmxlbmd0aCAtIGFsbC5maWx0ZXIoKGpvYikgPT4gIWpvYi5kZWNsYXJhdGlvbktleSkubGVuZ3RoLCBqb2JzIH0KICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICdsaXN0X2NoYW5uZWxzJywKICAgICAgZGVzY3JpcHRpb246ICdUaGUgY2hhdCBjaGFubmVscyBPcGVuQ2xhdyBpcyBsaW5rZWQgdG8gKFdoYXRzQXBwLCBUZWxlZ3JhbSwgRGlzY29yZCwgaU1lc3NhZ2XigKYpOiBlYWNoIGFjY291bnQsIHdoZXRoZXIgaXQgaXMgY29ubmVjdGVkLCBhbmQgaXRzIGxhc3QgbWVzc2FnZSB0aW1lcyBhbmQgZXJyb3IuJywKICAgICAgaW5wdXRTY2hlbWE6IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHt9IH0sCiAgICAgIGFubm90YXRpb25zOiByZWFkLAogICAgICBydW46IGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRld2F5LnJlcXVlc3QoJ2NoYW5uZWxzLnN0YXR1cycsIHt9KQogICAgICAgIGNvbnN0IGFjY291bnRzID0gcmVzdWx0Py5jaGFubmVsQWNjb3VudHMgPz8ge30KICAgICAgICBjb25zdCBvcmRlciA9IEFycmF5LmlzQXJyYXkocmVzdWx0Py5jaGFubmVsT3JkZXIpICYmIHJlc3VsdC5jaGFubmVsT3JkZXIubGVuZ3RoID8gcmVzdWx0LmNoYW5uZWxPcmRlciA6IE9iamVjdC5rZXlzKGFjY291bnRzKQogICAgICAgIGNvbnN0IGNoYW5uZWxzID0gb3JkZXIuZmxhdE1hcCgoY2hhbm5lbCkgPT4KICAgICAgICAgIChBcnJheS5pc0FycmF5KGFjY291bnRzW2NoYW5uZWxdKSA/IGFjY291bnRzW2NoYW5uZWxdIDogW10pLm1hcCgoYWNjb3VudCkgPT4gewogICAgICAgICAgICBjb25zdCBzdGF0ZSA9IGFjY291bnQubGFzdEVycm9yICYmICFhY2NvdW50LmNvbm5lY3RlZCA/ICdlcnJvcicgOiBhY2NvdW50LmNvbm5lY3RlZCA/ICdjb25uZWN0ZWQnIDogYWNjb3VudC5saW5rZWQgPT09IGZhbHNlIHx8IGFjY291bnQuY29uZmlndXJlZCA9PT0gZmFsc2UgPyAnbm90IGxpbmtlZCcgOiBhY2NvdW50LmVuYWJsZWQgPT09IGZhbHNlID8gJ29mZicgOiBhY2NvdW50LnJ1bm5pbmcgPyAnY29ubmVjdGluZycgOiAnc3RvcHBlZCcKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBjaGFubmVsLAogICAgICAgICAgICAgIG5hbWU6IHJlc3VsdD8uY2hhbm5lbExhYmVscz8uW2NoYW5uZWxdID8/IHRpdGxlKHdvcmRzKGNoYW5uZWwpKSwKICAgICAgICAgICAgICBhY2NvdW50OiBhY2NvdW50Lm5hbWUgfHwgYWNjb3VudC5hY2NvdW50SWQsCiAgICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgICAgY29ubmVjdGVkOiBhY2NvdW50LmNvbm5lY3RlZCA9PT0gdHJ1ZSwKICAgICAgICAgICAgICBsYXN0TWVzc2FnZUF0OiBpc28oTWF0aC5tYXgoYWNjb3VudC5sYXN0SW5ib3VuZEF0ID8/IDAsIGFjY291bnQubGFzdE91dGJvdW5kQXQgPz8gMCkgfHwgbnVsbCksCiAgICAgICAgICAgICAgZXJyb3I6IGNsaXAob25lTGluZShhY2NvdW50Lmxhc3RFcnJvciksIDIwMCksCiAgICAgICAgICAgIH0KICAgICAgICAgIH0pCiAgICAgICAgKQogICAgICAgIHJldHVybiB7IGNvdW50OiBjaGFubmVscy5sZW5ndGgsIGNvbm5lY3RlZDogY2hhbm5lbHMuZmlsdGVyKChjaGFubmVsKSA9PiBjaGFubmVsLmNvbm5lY3RlZCkubGVuZ3RoLCBjaGFubmVscyB9CiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAnZ2V0X292ZXJ2aWV3JywKICAgICAgZGVzY3JpcHRpb246ICdPbmUgbGluZSBvZiBPcGVuQ2xhdyBhdCBhIGdsYW5jZTogYWdlbnRzLCBob3cgbWFueSBhcmUgd29ya2luZywgYXBwcm92YWxzIHdhaXRpbmcsIHJ1bnMgZ29pbmcsIHNjaGVkdWxlZCBqb2JzLCBhbmQgY29ubmVjdGVkIGNoYW5uZWxzLicsCiAgICAgIGlucHV0U2NoZW1hOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7fSB9LAogICAgICBhbm5vdGF0aW9uczogcmVhZCwKICAgICAgcnVuOiBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgW3sgYWdlbnRzIH0sIHNlc3Npb25zLCBhcHByb3ZhbHMsIHJ1bnMsIGNyb24sIGNoYW5uZWxzXSA9IGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgIGFnZW50c0J5SWQoKSwKICAgICAgICAgIHNlc3Npb25Sb3dzKHsgbGltaXQ6IDEwMCB9KSwKICAgICAgICAgIGFwcHJvdmFsTGlzdCgpLAogICAgICAgICAgdGFza1Jvd3MoMTAwKSwKICAgICAgICAgIGdhdGV3YXkucmVxdWVzdCgnY3Jvbi5saXN0Jywge30pLAogICAgICAgICAgZ2F0ZXdheS5yZXF1ZXN0KCdjaGFubmVscy5zdGF0dXMnLCB7fSksCiAgICAgICAgXSkKICAgICAgICBjb25zdCB3b3JraW5nID0gbmV3IFNldChzZXNzaW9ucy5maWx0ZXIoKHNlc3Npb24pID0+IHNlc3Npb24uc3RhdGUgPT09ICdydW5uaW5nJykubWFwKChzZXNzaW9uKSA9PiBzZXNzaW9uLmFnZW50KSkuc2l6ZQogICAgICAgIGNvbnN0IGpvYnMgPSAoQXJyYXkuaXNBcnJheShjcm9uPy5qb2JzKSA/IGNyb24uam9icyA6IFtdKS5maWx0ZXIoKGpvYikgPT4gIWpvYi5kZWNsYXJhdGlvbktleSAmJiBqb2IuZW5hYmxlZCAhPT0gZmFsc2UpLmxlbmd0aAogICAgICAgIGNvbnN0IGxpbmtlZCA9IE9iamVjdC52YWx1ZXMoY2hhbm5lbHM/LmNoYW5uZWxBY2NvdW50cyA/PyB7fSkuZmxhdCgpLmZpbHRlcigoYWNjb3VudCkgPT4gYWNjb3VudD8uY29ubmVjdGVkKS5sZW5ndGgKICAgICAgICBjb25zdCBydW5uaW5nID0gcnVucy5maWx0ZXIoKHJ1bikgPT4gcnVuLmNvbHVtbiA9PT0gJ3J1bm5pbmcnKS5sZW5ndGgKICAgICAgICBjb25zdCBzdW1tYXJ5ID0gW3BsdXJhbChhZ2VudHMubGVuZ3RoLCAnYWdlbnQnKSwgYCR7d29ya2luZ30gd29ya2luZ2AsIGAke2FwcHJvdmFscy5sZW5ndGh9IHdhaXRpbmcgb24geW91YCwgcGx1cmFsKGpvYnMsICdqb2InKSwgbGlua2VkID8gcGx1cmFsKGxpbmtlZCwgJ2NoYW5uZWwnKSA6ICdubyBjaGFubmVscyddLmpvaW4oJyDCtyAnKQogICAgICAgIHJldHVybiB7IGFnZW50czogYWdlbnRzLmxlbmd0aCwgd29ya2luZywgYXBwcm92YWxzOiBhcHByb3ZhbHMubGVuZ3RoLCBydW5uaW5nLCBqb2JzLCBjaGFubmVsczogbGlua2VkLCBzdW1tYXJ5IH0KICAgICAgfSwKICAgIH0sCiAgICB7CiAgICAgIG5hbWU6ICdzZW5kX21lc3NhZ2UnLAogICAgICBkZXNjcmlwdGlvbjogIlNlbmQgdGhlIHVzZXIncyBtZXNzYWdlIHRvIGFuIE9wZW5DbGF3IHNlc3Npb24sIGNvbnRpbnVpbmcgdGhhdCBjaGF0IHdpdGggaXRzIGFnZW50LiBSZXR1cm5zIG9uY2UgT3BlbkNsYXcgYWNjZXB0cyBpdDsgdGhlIGFnZW50J3MgcmVwbHkgbGFuZHMgaW4gdGhlIHNlc3Npb24gKHJlYWRfc2Vzc2lvbikuIiwKICAgICAgaW5wdXRTY2hlbWE6IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgc2Vzc2lvbl9rZXk6IHsgdHlwZTogJ3N0cmluZycgfSwgbWVzc2FnZTogeyB0eXBlOiAnc3RyaW5nJyB9IH0sIHJlcXVpcmVkOiBbJ3Nlc3Npb25fa2V5JywgJ21lc3NhZ2UnXSB9LAogICAgICBhbm5vdGF0aW9uczogd29yaywKICAgICAgcnVuOiBhc3luYyAoYXJncykgPT4gewogICAgICAgIGNvbnN0IGtleSA9IGFyZy5zdHJpbmcoYXJncywgJ3Nlc3Npb25fa2V5JywgeyBwYXR0ZXJuOiBLRVkgfSkKICAgICAgICBjb25zdCBtZXNzYWdlID0gYXJnLnN0cmluZyhhcmdzLCAnbWVzc2FnZScsIHsgbWF4OiAyMF8wMDAgfSkKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRld2F5LnJlcXVlc3QoJ3Nlc3Npb25zLnNlbmQnLCB7IGtleSwgbWVzc2FnZSwgaWRlbXBvdGVuY3lLZXk6IHJhbmRvbVVVSUQoKSB9KQogICAgICAgIHJldHVybiB7IHNlbnQ6IHRydWUsIHNlc3Npb25fa2V5OiBrZXksIHJ1bl9pZDogcmVzdWx0Py5ydW5JZCA/PyBudWxsLCBub3RlOiAnT3BlbkNsYXcgaXMgd29ya2luZyBvbiBpdDsgcmVhZF9zZXNzaW9uIHNob3dzIHRoZSByZXBseSB3aGVuIGl0IGZpbmlzaGVzLicgfQogICAgICB9LAogICAgfSwKICAgIHsKICAgICAgbmFtZTogJ3N0YXJ0X3Nlc3Npb24nLAogICAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0IGEgbmV3IE9wZW5DbGF3IHNlc3Npb24gd2l0aCBvbmUgYWdlbnQgYW5kIGEgZmlyc3QgbWVzc2FnZS4gUmV0dXJucyB0aGUgbmV3IHNlc3Npb25fa2V5OyB0aGUgYWdlbnQga2VlcHMgd29ya2luZyBpbiB0aGUgYmFja2dyb3VuZC4nLAogICAgICBpbnB1dFNjaGVtYTogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBhZ2VudDogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdBZ2VudCBpZCBmcm9tIGxpc3RfYWdlbnRzOyBkZWZhdWx0OiB0aGUgZGVmYXVsdCBhZ2VudCcgfSwgbWVzc2FnZTogeyB0eXBlOiAnc3RyaW5nJyB9LCB0aXRsZTogeyB0eXBlOiAnc3RyaW5nJywgZGVzY3JpcHRpb246ICdPcHRpb25hbCBzaG9ydCB0aXRsZScgfSB9LCByZXF1aXJlZDogWydtZXNzYWdlJ10gfSwKICAgICAgYW5ub3RhdGlvbnM6IHdvcmssCiAgICAgIHJ1bjogYXN5bmMgKGFyZ3MpID0+IHsKICAgICAgICBjb25zdCB7IGRlZmF1bHRJZCB9ID0gYXdhaXQgYWdlbnRzQnlJZCgpCiAgICAgICAgY29uc3QgYWdlbnQgPSBhd2FpdCBrbm93bkFnZW50KGFyZy5zdHJpbmcoYXJncywgJ2FnZW50JywgeyBwYXR0ZXJuOiBBR0VOVCwgZmFsbGJhY2s6IGRlZmF1bHRJZCB9KSkKICAgICAgICBjb25zdCBtZXNzYWdlID0gYXJnLnN0cmluZyhhcmdzLCAnbWVzc2FnZScsIHsgbWF4OiAyMF8wMDAgfSkKICAgICAgICBjb25zdCBuYW1lID0gYXJnLm9wdGlvbmFsU3RyaW5nKGFyZ3MsICd0aXRsZScsIHsgbWF4OiAyMDAgfSkKICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnYXRld2F5LnJlcXVlc3QoJ3Nlc3Npb25zLmNyZWF0ZScsIHsgYWdlbnRJZDogYWdlbnQsIG1lc3NhZ2UsIC4uLihuYW1lID8geyBkaXNwbGF5TmFtZTogbmFtZSB9IDoge30pLCBpZGVtcG90ZW5jeUtleTogcmFuZG9tVVVJRCgpIH0pCiAgICAgICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSwgc2Vzc2lvbl9rZXk6IHJlc3VsdD8ua2V5ID8/IG51bGwsIGFnZW50LCBydW5fc3RhcnRlZDogcmVzdWx0Py5ydW5TdGFydGVkID8/IG51bGwgfQogICAgICB9LAogICAgfSwKICAgIHsKICAgICAgbmFtZTogJ3N0b3Bfc2Vzc2lvbicsCiAgICAgIGRlc2NyaXB0aW9uOiAnU3RvcCB0aGUgcnVuIGdvaW5nIGluIG9uZSBPcGVuQ2xhdyBzZXNzaW9uICh0aGUgYWdlbnQgc3RvcHMgd2hhdCBpdCBpcyBkb2luZzsgdGhlIGNoYXQgc3RheXMgYW5kIGNhbiBjb250aW51ZSB3aXRoIHNlbmRfbWVzc2FnZSkuJywKICAgICAgaW5wdXRTY2hlbWE6IHsgdHlwZTogJ29iamVjdCcsIHByb3BlcnRpZXM6IHsgc2Vzc2lvbl9rZXk6IHsgdHlwZTogJ3N0cmluZycgfSB9LCByZXF1aXJlZDogWydzZXNzaW9uX2tleSddIH0sCiAgICAgIGFubm90YXRpb25zOiB3b3JrLAogICAgICBydW46IGFzeW5jIChhcmdzKSA9PiB7CiAgICAgICAgY29uc3Qga2V5ID0gYXJnLnN0cmluZyhhcmdzLCAnc2Vzc2lvbl9rZXknLCB7IHBhdHRlcm46IEtFWSB9KQogICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdhdGV3YXkucmVxdWVzdCgnc2Vzc2lvbnMuYWJvcnQnLCB7IGtleSB9KQogICAgICAgIHJldHVybiB7IHN0b3BwZWQ6IHRydWUsIHNlc3Npb25fa2V5OiBrZXksIHJlc3VsdDogcmVzdWx0ID8/IG51bGwgfQogICAgICB9LAogICAgfSwKICAgIHsKICAgICAgbmFtZTogJ3J1bl9zY2hlZHVsZWRfam9iJywKICAgICAgZGVzY3JpcHRpb246ICdSdW4gb25lIE9wZW5DbGF3IHNjaGVkdWxlZCBqb2Igbm93LCBvdXRzaWRlIGl0cyBzY2hlZHVsZS4nLAogICAgICBpbnB1dFNjaGVtYTogeyB0eXBlOiAnb2JqZWN0JywgcHJvcGVydGllczogeyBqb2JfaWQ6IHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnRnJvbSBsaXN0X3NjaGVkdWxlZF9qb2JzJyB9IH0sIHJlcXVpcmVkOiBbJ2pvYl9pZCddIH0sCiAgICAgIGFubm90YXRpb25zOiB3b3JrLAogICAgICBydW46IGFzeW5jIChhcmdzKSA9PiB7CiAgICAgICAgY29uc3QgaWQgPSBhcmcuc3RyaW5nKGFyZ3MsICdqb2JfaWQnLCB7IHBhdHRlcm46IEtFWSB9KQogICAgICAgIGF3YWl0IGdhdGV3YXkucmVxdWVzdCgnY3Jvbi5ydW4nLCB7IGlkLCBtb2RlOiAnZm9yY2UnIH0pCiAgICAgICAgcmV0dXJuIHsgc3RhcnRlZDogdHJ1ZSwgam9iX2lkOiBpZCB9CiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAnc2V0X3NjaGVkdWxlZF9qb2JfZW5hYmxlZCcsCiAgICAgIGRlc2NyaXB0aW9uOiAnVHVybiBvbmUgT3BlbkNsYXcgc2NoZWR1bGVkIGpvYiBvZmYgKGl0IHN0b3BzIHJ1bm5pbmcgb24gaXRzIHNjaGVkdWxlKSBvciBiYWNrIG9uLicsCiAgICAgIGlucHV0U2NoZW1hOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7IGpvYl9pZDogeyB0eXBlOiAnc3RyaW5nJyB9LCBlbmFibGVkOiB7IHR5cGU6ICdib29sZWFuJyB9IH0sIHJlcXVpcmVkOiBbJ2pvYl9pZCcsICdlbmFibGVkJ10gfSwKICAgICAgYW5ub3RhdGlvbnM6IHdvcmssCiAgICAgIHJ1bjogYXN5bmMgKGFyZ3MpID0+IHsKICAgICAgICBjb25zdCBpZCA9IGFyZy5zdHJpbmcoYXJncywgJ2pvYl9pZCcsIHsgcGF0dGVybjogS0VZIH0pCiAgICAgICAgY29uc3QgZW5hYmxlZCA9IGFyZy5ib29sZWFuKGFyZ3MsICdlbmFibGVkJykKICAgICAgICBhd2FpdCBnYXRld2F5LnJlcXVlc3QoJ2Nyb24udXBkYXRlJywgeyBpZCwgcGF0Y2g6IHsgZW5hYmxlZCB9IH0pCiAgICAgICAgcmV0dXJuIHsgam9iX2lkOiBpZCwgZW5hYmxlZCB9CiAgICAgIH0sCiAgICB9LAogICAgewogICAgICBuYW1lOiAnZGVueV9hbGxfYXBwcm92YWxzJywKICAgICAgZGVzY3JpcHRpb246ICdEZW55IGV2ZXJ5IE9wZW5DbGF3IHJlcXVlc3Qgd2FpdGluZyBmb3IgdGhlIHVzZXIgKGF0IG1vc3QgMjApLiBPbmx5IHdoZW4gdGhlIHVzZXIgYXNrcyB0byBkZW55IHRoZW0gYWxsLicsCiAgICAgIGlucHV0U2NoZW1hOiB7IHR5cGU6ICdvYmplY3QnLCBwcm9wZXJ0aWVzOiB7fSB9LAogICAgICBhbm5vdGF0aW9uczogd29yaywKICAgICAgcnVuOiBhc3luYyAoKSA9PiB7CiAgICAgICAgY29uc3QgYXBwcm92YWxzID0gKGF3YWl0IGFwcHJvdmFsTGlzdCgpKS5zbGljZSgwLCAyMCkKICAgICAgICBmb3IgKGNvbnN0IGFwcHJvdmFsIG9mIGFwcHJvdmFscykgYXdhaXQgcmVzb2x2ZUFwcHJvdmFsKGFwcHJvdmFsLCAnZGVueScpCiAgICAgICAgcmV0dXJuIHsgZGVuaWVkOiBhcHByb3ZhbHMubGVuZ3RoLCBub3RlOiBhcHByb3ZhbHMubGVuZ3RoID8gYERlbmllZCAke3BsdXJhbChhcHByb3ZhbHMubGVuZ3RoLCAncmVxdWVzdCcpfS5gIDogJ05vdGhpbmcgd2FzIHdhaXRpbmcuJyB9CiAgICAgIH0sCiAgICB9LAogIF0KfQoKaWYgKGltcG9ydC5tZXRhLnVybCA9PT0gcGF0aFRvRmlsZVVSTChwcm9jZXNzLmFyZ3ZbMV0gPz8gJycpLmhyZWYpIHsKICBjb25zdCBnYXRld2F5ID0gZ2F0ZXdheUNsaWVudCh7IHZlcnNpb246IFZFUlNJT04sIGxvZzogKGxpbmUpID0+IHByb2Nlc3Muc3RkZXJyLndyaXRlKGBvcGVuY2xhdyBwYWNrOiAke2xpbmV9XG5gKSB9KQogIC8vIENvbm5lY3Qgbm93LCBub3QgYXQgdGhlIGZpcnN0IGNhbGw6IHdoaWxlIHRoaXMgc2VydmVyIHJ1bnMsIE9wZW5DbGF3IGhhcyBhbiBhcHByb3Zlciwgc28gcmVxdWVzdHMgd2FpdCBmb3IgdGhlIHVzZXIuCiAgZ2F0ZXdheS5zdGFydCgpCiAgc2VydmUoeyBuYW1lOiAnc2lkZWJ1ZC1wYWNrLW9wZW5jbGF3JywgdmVyc2lvbjogVkVSU0lPTiwgdG9vbHM6IG9wZW5jbGF3VG9vbHMoeyBnYXRld2F5IH0pIH0pCn0K","server/mcp.mjs":"Ly8gQSBtaW5pbWFsIE1DUCBzZXJ2ZXIgb3ZlciBzdGRpbzogbmV3bGluZS1kZWxpbWl0ZWQgSlNPTi1SUEMgMi4wIHdpdGggdGhlCi8vIGluaXRpYWxpemUsIHBpbmcsIHRvb2xzL2xpc3QsIGFuZCB0b29scy9jYWxsIG1ldGhvZHMuIE5vIGRlcGVuZGVuY2llcywgc28gYQovLyBwYWNrJ3Mgc2VydmVyIHJ1bnMgd2l0aCBwbGFpbiBgbm9kZWAgYW5kIG5vdGhpbmcgdG8gaW5zdGFsbC4gQ29weSB0aGlzIGZpbGUKLy8gaW50byBhbnkgcGFjayB0aGF0IHNoaXBzIGl0cyBvd24gc2VydmVyLgppbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lJwoKLyoqCiAqIEVhY2ggdG9vbCBpcyBgeyBuYW1lLCBkZXNjcmlwdGlvbiwgaW5wdXRTY2hlbWEsIGFubm90YXRpb25zLCBydW4gfWAsIHdoZXJlCiAqIGBydW4oYXJncylgIHJldHVybnMgSlNPTiBkYXRhIChzZW50IGFzIHN0cnVjdHVyZWQgY29udGVudCBhbmQgYXMgdGV4dCkgb3IKICogdGhyb3dzIGFuIEVycm9yIHdob3NlIG1lc3NhZ2UgdGhlIGNhbGxlciBzZWVzLgogKi8KZXhwb3J0IGZ1bmN0aW9uIHNlcnZlKHsgbmFtZSwgdmVyc2lvbiwgdG9vbHMgfSkgewogIGNvbnN0IHNlbmQgPSAobWVzc2FnZSkgPT4gcHJvY2Vzcy5zdGRvdXQud3JpdGUoYCR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSl9XG5gKQogIGNvbnN0IGhhbmRsZXJzID0gewogICAgaW5pdGlhbGl6ZTogKHBhcmFtcykgPT4gKHsgcHJvdG9jb2xWZXJzaW9uOiBwYXJhbXM/LnByb3RvY29sVmVyc2lvbiA/PyAnMjAyNS0wNi0xOCcsIGNhcGFiaWxpdGllczogeyB0b29sczoge30gfSwgc2VydmVySW5mbzogeyBuYW1lLCB2ZXJzaW9uIH0gfSksCiAgICBwaW5nOiAoKSA9PiAoe30pLAogICAgJ3Rvb2xzL2xpc3QnOiAoKSA9PiAoeyB0b29sczogdG9vbHMubWFwKCh7IHJ1bjogX3J1biwgLi4udG9vbCB9KSA9PiB0b29sKSB9KSwKICAgICd0b29scy9jYWxsJzogKHBhcmFtcykgPT4gY2FsbFRvb2wodG9vbHMsIHBhcmFtcz8ubmFtZSwgcGFyYW1zPy5hcmd1bWVudHMgPz8ge30pLAogIH0KICBjb25zdCBpbnB1dCA9IGNyZWF0ZUludGVyZmFjZSh7IGlucHV0OiBwcm9jZXNzLnN0ZGluIH0pCiAgaW5wdXQub24oJ2xpbmUnLCBhc3luYyAobGluZSkgPT4gewogICAgbGV0IG1lc3NhZ2UKICAgIHRyeSB7CiAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKGxpbmUpCiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuCiAgICB9CiAgICAvLyBOb3RpZmljYXRpb25zIChubyBpZCkgbmVlZCBubyByZXBseS4KICAgIGlmIChtZXNzYWdlPy5pZCA9PT0gdW5kZWZpbmVkIHx8IG1lc3NhZ2UuaWQgPT09IG51bGwpIHJldHVybgogICAgY29uc3QgaGFuZGxlciA9IGhhbmRsZXJzW21lc3NhZ2UubWV0aG9kXQogICAgaWYgKCFoYW5kbGVyKSByZXR1cm4gc2VuZCh7IGpzb25ycGM6ICcyLjAnLCBpZDogbWVzc2FnZS5pZCwgZXJyb3I6IHsgY29kZTogLTMyNjAxLCBtZXNzYWdlOiBgTWV0aG9kIG5vdCBmb3VuZDogJHttZXNzYWdlLm1ldGhvZH1gIH0gfSkKICAgIHRyeSB7CiAgICAgIHNlbmQoeyBqc29ucnBjOiAnMi4wJywgaWQ6IG1lc3NhZ2UuaWQsIHJlc3VsdDogYXdhaXQgaGFuZGxlcihtZXNzYWdlLnBhcmFtcykgfSkKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIHNlbmQoeyBqc29ucnBjOiAnMi4wJywgaWQ6IG1lc3NhZ2UuaWQsIGVycm9yOiB7IGNvZGU6IC0zMjYwMywgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpIH0gfSkKICAgIH0KICB9KQogIGlucHV0Lm9uKCdjbG9zZScsICgpID0+IHByb2Nlc3MuZXhpdCgwKSkKfQoKLyoqIFJ1bnMgb25lIHRvb2w7IGZhaWx1cmVzIGJlY29tZSBhbiBlcnJvciByZXN1bHQgdGhlIGFnZW50IGNhbiByZWFkLCBuZXZlciBhIGNyYXNoLiAqLwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2FsbFRvb2wodG9vbHMsIG5hbWUsIGFyZ3MpIHsKICBjb25zdCB0b29sID0gdG9vbHMuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSkKICBpZiAoIXRvb2wpIHJldHVybiB7IGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYFVua25vd24gdG9vbCAke25hbWV9YCB9XSwgaXNFcnJvcjogdHJ1ZSB9CiAgdHJ5IHsKICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0b29sLnJ1bihhcmdzKQogICAgcmV0dXJuIHsgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBKU09OLnN0cmluZ2lmeShkYXRhKSB9XSwgc3RydWN0dXJlZENvbnRlbnQ6IGRhdGEgfQogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICByZXR1cm4geyBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSB9XSwgaXNFcnJvcjogdHJ1ZSB9CiAgfQp9CgovKiogQXJndW1lbnQgY2hlY2tzIHRoYXQgdGhyb3cgYSByZWFkYWJsZSBtZXNzYWdlOyBlYWNoIHJldHVybnMgdGhlIHZhbHVlIG9yIGl0cyBkZWZhdWx0LiAqLwpleHBvcnQgY29uc3QgYXJnID0gewogIHN0cmluZyhhcmdzLCBrZXksIHsgbWF4ID0gNTAwLCBwYXR0ZXJuLCBmYWxsYmFjayB9ID0ge30pIHsKICAgIGNvbnN0IHZhbHVlID0gYXJnc1trZXldID8/IGZhbGxiYWNrCiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJyB8fCAhdmFsdWUubGVuZ3RoIHx8IHZhbHVlLmxlbmd0aCA+IG1heCB8fCAocGF0dGVybiAmJiAhcGF0dGVybi50ZXN0KHZhbHVlKSkpIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGlzIG1pc3Npbmcgb3IgaW52YWxpZGApCiAgICByZXR1cm4gdmFsdWUKICB9LAogIG9wdGlvbmFsU3RyaW5nKGFyZ3MsIGtleSwgeyBtYXggPSAyXzAwMCB9ID0ge30pIHsKICAgIGNvbnN0IHZhbHVlID0gYXJnc1trZXldCiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZAogICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUubGVuZ3RoID4gbWF4KSB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBpcyBpbnZhbGlkYCkKICAgIHJldHVybiB2YWx1ZQogIH0sCiAgaW50ZWdlcihhcmdzLCBrZXksIHsgbWluLCBtYXgsIGZhbGxiYWNrIH0pIHsKICAgIGNvbnN0IHZhbHVlID0gYXJnc1trZXldID8/IGZhbGxiYWNrCiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodmFsdWUpIHx8IHZhbHVlIDwgbWluIHx8IHZhbHVlID4gbWF4KSB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyIGZyb20gJHttaW59IHRvICR7bWF4fWApCiAgICByZXR1cm4gdmFsdWUKICB9LAogIGJvb2xlYW4oYXJncywga2V5LCBmYWxsYmFjaykgewogICAgY29uc3QgdmFsdWUgPSBhcmdzW2tleV0gPz8gZmFsbGJhY2sKICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gbXVzdCBiZSB0cnVlIG9yIGZhbHNlYCkKICAgIHJldHVybiB2YWx1ZQogIH0sCiAgb25lT2YoYXJncywga2V5LCBvcHRpb25zLCBmYWxsYmFjaykgewogICAgY29uc3QgdmFsdWUgPSBhcmdzW2tleV0gPz8gZmFsbGJhY2sKICAgIGlmICghb3B0aW9ucy5pbmNsdWRlcyh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IG11c3QgYmUgb25lIG9mICR7b3B0aW9ucy5qb2luKCcsICcpfWApCiAgICByZXR1cm4gdmFsdWUKICB9LAogIGxpc3QoYXJncywga2V5LCB7IG1pbiA9IDAsIG1heCA9IDIwLCBpdGVtIH0pIHsKICAgIGNvbnN0IHZhbHVlID0gYXJnc1trZXldCiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHZhbHVlLmxlbmd0aCA8IG1pbiB8fCB2YWx1ZS5sZW5ndGggPiBtYXggfHwgIXZhbHVlLmV2ZXJ5KGl0ZW0pKSB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBpcyBtaXNzaW5nIG9yIGludmFsaWRgKQogICAgcmV0dXJuIHZhbHVlCiAgfSwKICBkYXRlVGltZShhcmdzLCBrZXksIGZhbGxiYWNrKSB7CiAgICBjb25zdCB2YWx1ZSA9IGFyZ3Nba2V5XSA/PyBmYWxsYmFjawogICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQKICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICEvXlxkezR9LVxkezJ9LVxkezJ9VFxkezJ9OlxkezJ9KDpcZHsyfShcLlxkKyk/KT8oWnxbKy1dXGR7Mn06XGR7Mn0pJC8udGVzdCh2YWx1ZSkpIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IG11c3QgYmUgYW4gSVNPIGRhdGUtdGltZSB3aXRoIGEgdGltZSB6b25lYCkKICAgIHJldHVybiB2YWx1ZQogIH0sCn0K","SKILL.md":"LS0tCm5hbWU6IE9wZW5DbGF3CmRlc2NyaXB0aW9uOiBTZWUgYW5kIGRpcmVjdCB0aGUgdXNlcidzIE9wZW5DbGF3IGFnZW50czogdGhlaXIgc2Vzc2lvbnMgYW5kIHdoYXQgaXMgcnVubmluZywgcmVxdWVzdHMgd2FpdGluZyBmb3IgdGhlIHVzZXIncyBhcHByb3ZhbCwgcmVjZW50IHJ1bnMsIHNjaGVkdWxlZCBqb2JzLCBhbmQgbGlua2VkIGNoYXQgY2hhbm5lbHMuCi0tLQoKIyBPcGVuQ2xhdwoKT3BlbkNsYXcgaXMgYSBwZXJzb25hbCBhZ2VudCB0aGUgdXNlciB0YWxrcyB0byBmcm9tIGNoYXQgYXBwcyAoV2hhdHNBcHAsIFRlbGVncmFtLCBEaXNjb3JkLCBpTWVzc2FnZSwgYW5kIG90aGVycykgb3IgaXRzIGRhc2hib2FyZCwgcnVuIGJ5IHRoZSBPcGVuQ2xhdyBHYXRld2F5IG9uIHRoaXMgY29tcHV0ZXIuIFRoaXMgcGFjayByZWFjaGVzIHRoZSBHYXRld2F5IHRocm91Z2ggYSBzbWFsbCBzZXJ2ZXIgdGhhdCBzaWducyBpbiB3aXRoIHRoZSBHYXRld2F5J3Mgb3duIHRva2VuIGZyb20gT3BlbkNsYXcncyBjb25maWc7IG5vdGhpbmcgaXMgY29waWVkIGludG8gU2lkZWJ1ZC4gVG9vbCBuYW1lcyBiZWxvdyBhcmUgdGhlIHNlcnZlcidzIG93bjsgeW91ciBNQ1AgY2xpZW50IG1heSBzaG93IHRoZW0gd2l0aCB0aGlzIGludGVncmF0aW9uJ3MgcHJlZml4IChmb3IgZXhhbXBsZSBgb3BlbmNsYXdfX2xpc3Rfc2Vzc2lvbnNgKS4gUmVzdWx0cyBhcmUgSlNPTi4KCiMjIFRlcm1zCgotICoqQWdlbnQqKjogYW4gT3BlbkNsYXcgYWdlbnQgc3VjaCBhcyBgbWFpbmAgb3IgYHJlc2VhcmNoZXJgLCB3aXRoIGl0cyBvd24gbW9kZWwsIHdvcmtzcGFjZSwgYW5kIG1lbW9yeS4gYGxpc3RfYWdlbnRzYCBsaXN0cyB0aGVtLiBXaGVuIHRoZSB1c2VyIG5hbWVzIGFuIE9wZW5DbGF3IGFnZW50LCBpdCBpcyBvbmUgb2YgdGhlc2UuCi0gKipTZXNzaW9uKio6IG9uZSBjb252ZXJzYXRpb24gd2l0aCBvbmUgYWdlbnQgKGBzZXNzaW9uX2tleWAsIGBhZ2VudGAsIGB0aXRsZWAsIGBjaGFubmVsYCwgYHN0YXRlYCBydW5uaW5nIG9yIGlkbGUpLiBBIHNlc3Npb24gZnJvbSBhIGNoYXQgYXBwIGhhcyBpdHMgYGNoYW5uZWxgIChmb3IgZXhhbXBsZSBgdGVsZWdyYW1gKTsgZGFzaGJvYXJkIGFuZCB0ZXJtaW5hbCBjaGF0cyBoYXZlIG5vbmUuIE9wZW5DbGF3J3MgZXF1aXZhbGVudCBvZiBhIHRocmVhZC4KLSAqKkFwcHJvdmFsKio6IGEgcmVxdWVzdCBmcm9tIGFuIGFnZW50IHRvIHJ1biBhIGNvbW1hbmQsIGVkaXQgYSBmaWxlLCBvciB1c2UgYSB0b29sLCB3YWl0aW5nIGZvciB0aGUgdXNlciAoYGlkYCwgYGFnZW50YCwgYHRpdGxlYCwgYHN1bW1hcnlgIG9mIHdoYXQgaXQgd2FudHMsIHRoZSBgZGVjaXNpb25zYCBpdCBhbGxvd3MsIGBleHBpcmVzQXRgKS4gVGhlIGFnZW50IGlzIHBhdXNlZCB1bnRpbCBpdCBpcyBhbnN3ZXJlZCBvciBleHBpcmVzLCBvZnRlbiB3aXRoaW4gdHdvIG1pbnV0ZXMuCi0gKipSdW4qKjogb25lIHBpZWNlIG9mIHdvcms6IGEgY2hhdCB0dXJuLCBhIHRlcm1pbmFsIHJ1biwgYSBzY2hlZHVsZWQgam9iLCBvciBhIHN1YmFnZW50LCB3aXRoIGEgc3RhdHVzIChxdWV1ZWQsIHJ1bm5pbmcsIGJsb2NrZWQsIHN1Y2NlZWRlZCwgZmFpbGVk4oCmKS4KLSAqKlNjaGVkdWxlZCBqb2IqKjogd29yayBPcGVuQ2xhdyBydW5zIG9uIGEgc2NoZWR1bGUgKGl0cyBjcm9uKS4gT3BlbkNsYXcncyBvd24gdXBrZWVwIGpvYnMgYXJlIGhpZGRlbiB1bmxlc3MgYXNrZWQgZm9yLgotICoqQ2hhbm5lbCoqOiBhIGNoYXQgYXBwIGFjY291bnQgT3BlbkNsYXcgaXMgbGlua2VkIHRvLgoKIyMgRmluZGluZyB0aGluZ3MgZnJvbSB0aGUgdXNlcidzIHdvcmRzCgoxLiBgbGlzdF9zZXNzaW9uc2AgKG9wdGlvbmFsbHkgd2l0aCBgYWdlbnRgKSBsaXN0cyBzZXNzaW9ucyBuZXdlc3QgZmlyc3Q7IG1hdGNoIHRoZSB1c2VyJ3Mgd29yZHMgYWdhaW5zdCB0aXRsZXMsIGFnZW50cywgYW5kIGNoYW5uZWxzICgibXkgVGVsZWdyYW0gY2hhdCIsICJ3aGF0IHRoZSByZXNlYXJjaGVyIGRpZCIpLgoyLiBgbGlzdF9ydW5zYCBmb3IgIndoYXQgcmFuIiBvciAid2hhdCBmYWlsZWQiOyBgbGlzdF9zY2hlZHVsZWRfam9ic2AgZm9yIGpvYnM7IGBsaXN0X2NoYW5uZWxzYCBmb3IgY2hhdCBhcHBzOyBgZ2V0X292ZXJ2aWV3YCBmb3IgYSBvbmUtbGluZSBzdW1tYXJ5LgozLiBQaWNrIG9uZSBzZXNzaW9uIG9yIGpvYi4gSWYgbm9uZSBvciBzZXZlcmFsIGZpdCwgc2F5IHdoaWNoIG9uZXMgeW91IGZvdW5kIGFuZCBhc2suCjQuIFJlZmVyIHRvIHRoaW5ncyBieSB0aXRsZSwgYWdlbnQsIGFuZCBjaGFubmVsLCBuZXZlciBieSBrZXkgb3IgaWQuCgojIyBSZWFkaW5nIGZvciB2b2ljZQoKYHJlYWRfc2Vzc2lvbmAgd2l0aCBhIGBzZXNzaW9uX2tleWAgZ2l2ZXMgaXRzIGxhdGVzdCBtZXNzYWdlcy4gU3VtbWFyaXplIHdoYXQgbWF0dGVycyBpbiBvbmUgb3IgdHdvIHNlbnRlbmNlczsgbmV2ZXIgcmVhZCBrZXlzLCBpZHMsIG9yIGxvbmcgbWVzc2FnZXMgYWxvdWQuIEZvciBhcHByb3ZhbHMsIHNheSB3aGljaCBhZ2VudCB3YW50cyB0byBkbyB3aGF0IGluIHBsYWluIHdvcmRzICgidGhlIHJlc2VhcmNoZXIgd2FudHMgdG8gbGlzdCB5b3VyIERlc2t0b3AgZm9sZGVyIikuCgojIyBDaGFuZ2luZyB0aGluZ3MKCi0gKipGb2xsb3ctdXAgb24gZXhpc3Rpbmcgd29yayoqOiBgc2VuZF9tZXNzYWdlYCB3aXRoIHRoZSBzZXNzaW9uJ3MgYHNlc3Npb25fa2V5YC4gSXQgcmV0dXJucyBvbmNlIE9wZW5DbGF3IGFjY2VwdHMgaXQgYW5kIHRoZSBhZ2VudCByZXBsaWVzIGluIHRoYXQgc2Vzc2lvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuIHRoZSB1c2VyIHJlZmVycyB0byBhIGNoYXQgdGhleSBhbHJlYWR5IGhhdmUuCi0gKipBIG5ldyBjb252ZXJzYXRpb24qKjogYHN0YXJ0X3Nlc3Npb25gIHdpdGggYGFnZW50YCBhbmQgdGhlIGBtZXNzYWdlYCAob3B0aW9uYWxseSBhIHNob3J0IGB0aXRsZWApLCBvbmx5IHdoZW4gdGhlIHVzZXIgYXNrcyBmb3Igc29tZXRoaW5nIG5ldy4KLSAqKkFwcHJvdmFscyoqOiBgbGlzdF9hcHByb3ZhbHNgLCB0aGVuIGByZXNwb25kX3RvX2FwcHJvdmFsYCB3aXRoIHRoZSBgaWRgIGFuZCB0aGUgdXNlcidzIGBkZWNpc2lvbmAsIG9ubHkgd2l0aCB0aGUgdXNlcidzIGV4cGxpY2l0IGRlY2lzaW9uIGZvciB0aGF0IHJlcXVlc3QuIFVzZSBgYWxsb3ctYWx3YXlzYCBvbmx5IHdoZW4gdGhlIHVzZXIgc2F5cyB0byBhbHdheXMgYWxsb3cgaXQsIGFuZCBvbmx5IGlmIHRoZSByZXF1ZXN0IGxpc3RzIGl0IGluIGBkZWNpc2lvbnNgLiBgZGVueV9hbGxfYXBwcm92YWxzYCBvbmx5IHdoZW4gdGhlIHVzZXIgYXNrcyB0byBkZW55IHRoZW0gYWxsLgotICoqU2NoZWR1bGVkIGpvYnMqKjogYHJ1bl9zY2hlZHVsZWRfam9iYCBydW5zIG9uZSBub3c7IGBzZXRfc2NoZWR1bGVkX2pvYl9lbmFibGVkYCB0dXJucyBvbmUgb2ZmIG9yIGJhY2sgb24uCi0gQSBzdWNjZXNzZnVsIGNhbGwgaXMgdGhlIGNvbmZpcm1hdGlvbi4gRG8gbm90IHJlYWQgdGhlIHNlc3Npb24gYmFjayB0byBjaGVjaywgYW5kIGRvIG5vdCBzZW5kIHRoZSBzYW1lIG1lc3NhZ2UgdHdpY2UuCgojIyBTdG9wcGluZyBhbmQgdW5kbwoKLSBgc3RvcF9zZXNzaW9uYCBzdG9wcyB0aGUgcnVuIGdvaW5nIGluIGEgc2Vzc2lvbjsgdGhlIGNoYXQgc3RheXMgYW5kIGNhbiBjb250aW51ZSB3aXRoIGBzZW5kX21lc3NhZ2VgLgotIEEgam9iIHR1cm5lZCBvZmYgd2l0aCBgc2V0X3NjaGVkdWxlZF9qb2JfZW5hYmxlZGAgKGBlbmFibGVkOiBmYWxzZWApIGlzIHR1cm5lZCBiYWNrIG9uIHdpdGggYGVuYWJsZWQ6IHRydWVgLgotIEEgc2VudCBtZXNzYWdlLCBhIHN0YXJ0ZWQgc2Vzc2lvbiwgYW5kIGFuIGFuc3dlcmVkIGFwcHJvdmFsIGNhbm5vdCBiZSB1bmRvbmU7IGEgd3JvbmdseSBhbGxvd2VkIHJlcXVlc3QgY2FuIG9ubHkgYmUgc3RvcHBlZCB3aXRoIGBzdG9wX3Nlc3Npb25gLgoKIyMgTGltaXRzIGFuZCBlcnJvcnMKCi0gVGhlIHdpZGdldCdzICoqQWxsb3cgbmV4dCBvbmNlKiogYW5kICoqRGVueSBuZXh0KiogYW5zd2VyIHRoZSBvbGRlc3Qgd2FpdGluZyByZXF1ZXN0LCB3aGljaCB0aGUgcGhvbmUgc2hvd3MgaW4gaXRzIGNvbmZpcm1hdGlvbi4gSWYgdGhhdCByZXF1ZXN0IGNoYW5nZWQgYSBmZXcgc2Vjb25kcyBiZWZvcmUsIHRoZSBzZXJ2ZXIgcmVmdXNlczsgbG9vayBhZ2Fpbi4KLSBSZXF1ZXN0cyB3YWl0IGZvciBhbiBhbnN3ZXIgb25seSB3aGlsZSB0aGlzIHBhY2sgaXMgb24gYW5kIHRoZSBjb21wYW5pb24gaXMgcnVubmluZy4gT3RoZXJ3aXNlIE9wZW5DbGF3IGRlbmllcyB0aGVtIHJpZ2h0IGF3YXkgYmVjYXVzZSBubyBvbmUgY2FuIGFuc3dlci4KLSAiT3BlbkNsYXcncyBHYXRld2F5IGlzIG5vdCBydW5uaW5nIiBtZWFucyB0aGUgR2F0ZXdheSBzZXJ2aWNlIGlzIHN0b3BwZWQ6IHRoZSB1c2VyIGNhbiBydW4gYG9wZW5jbGF3IGdhdGV3YXkgc3RhcnRgIChpdCBjYW4gdGFrZSBhIG1pbnV0ZSBvciB0d28gdG8gc3RhcnQpLiAiT3BlbkNsYXcgaXMgbm90IHNldCB1cCBvbiB0aGlzIGNvbXB1dGVyIiBtZWFucyBPcGVuQ2xhdyBpcyBub3QgaW5zdGFsbGVkIG9yIG9uYm9hcmRlZCBoZXJlLgotIFRoZSBwYWNrIHdvcmtzIG9ubHkgb24gdGhlIGNvbXB1dGVyIHRoYXQgcnVucyB0aGUgR2F0ZXdheTsgYSBHYXRld2F5IG9uIGFub3RoZXIgY29tcHV0ZXIgaXMgbm90IHN1cHBvcnRlZC4KLSBTZW5kaW5nIHRvIGEgcGVyc29uIHRocm91Z2ggYSBjaGF0IGFwcCAocmF0aGVyIHRoYW4gdG8gYW4gYWdlbnQpIGlzIG5vdCBwYXJ0IG9mIHRoaXMgcGFjazsgT3BlbkNsYXcgYWdlbnRzIHJlcGx5IGluIHRoZWlyIG93biBjaGFubmVscy4K"},"signature":{"publicKey":"4d9b98c280e248815370a0c3fe152828a508cc7955e60e1910c9a90c97e9a674","value":"92ab929491eac1a56be0370b197d81132000ea0c604dbd59ef3c7e1cc6fd92dbe4fb9e1c454ca277e553af48b699bf3be672f42095f514e534d0b3bfd9cc550a"}},"error":null}