@discordeno/rest 19.0.0-next.f072d12 → 19.0.0-next.f15ef49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -0
- package/dist/invalidBucket.js +84 -2
- package/dist/invalidBucket.js.map +1 -0
- package/dist/manager.js +1416 -2
- package/dist/manager.js.map +1 -0
- package/dist/queue.js +153 -2
- package/dist/queue.js.map +1 -0
- package/dist/types.js +3 -2
- package/dist/types.js.map +1 -0
- package/dist/typings/routes.js +3 -2
- package/dist/typings/routes.js.map +1 -0
- package/package.json +3 -3
package/dist/manager.js
CHANGED
|
@@ -1,2 +1,1416 @@
|
|
|
1
|
-
import{InteractionResponseTypes as e}from"@discordeno/types";import{calculateBits as t,camelize as s,camelToSnakeCase as a,delay as i,findFiles as n,getBotIdFromToken as o,isGetMessagesAfter as r,isGetMessagesAround as l,isGetMessagesBefore as d,isGetMessagesLimit as u,logger as c,processReactionString as m,urlToBase64 as g}from"@discordeno/utils";import{createInvalidRequestBucket as p}from"./invalidBucket.js";import{Queue as h}from"./queue.js";export function createRestManager(w){if(!w.token)throw Error("You must provide a valid token.");let y={token:w.token,applicationId:w.applicationId?BigInt(w.applicationId):o(w.token),version:w.version??10,baseUrl:w.baseUrl??"https://discord.com/api",maxRetryCount:1/0,globallyRateLimited:!1,processingRateLimitedPaths:!1,deleteQueueDelay:6e4,queues:new Map,rateLimitedPaths:new Map,invalidBucket:p({}),routes:{webhooks:{id:e=>`/webhooks/${e}`,message:(e,t,s,a)=>{let i=`/webhooks/${e}/${t}/messages/${s}?`;return a&&a.threadId&&(i+=`thread_id=${a.threadId}`),i},original:(e,t,s)=>{let a=`/webhooks/${e}/${t}/messages/@original?`;return s&&s.threadId&&(a+=`thread_id=${s.threadId}`),a},webhook:(e,t,s)=>{let a=`/webhooks/${e}/${t}?`;return s&&(s?.wait!==void 0&&(a+=`wait=${s.wait.toString()}`),s.threadId&&(a+=`thread_id=${s.threadId}`)),a}},sessionInfo:()=>y.routes.gatewayBot(),channels:{bulk:e=>`/channels/${e}/messages/bulk-delete`,dm:()=>"/users/@me/channels",pin:(e,t)=>`/channels/${e}/pins/${t}`,pins:e=>`/channels/${e}/pins`,reactions:{bot:(e,t,s)=>`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}/@me`,user:(e,t,s,a)=>`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}/${a}`,all:(e,t)=>`/channels/${e}/messages/${t}/reactions`,emoji:(e,t,s,a)=>{let i=`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}?`;return a&&(a.after&&(i+=`after=${a.after}`),a.limit&&(i+=`&limit=${a.limit}`)),i},message:(e,t,s,a)=>{let i=`/channels/${e}/messages/${t}/reactions/${encodeURIComponent(s)}?`;return a&&(a.after&&(i+=`after=${a.after}`),a.limit&&(i+=`&limit=${a.limit}`)),i}},webhooks:e=>`/channels/${e}/webhooks`,channel:e=>`/channels/${e}`,follow:e=>`/channels/${e}/followers`,forum:e=>`/channels/${e}/threads?has_message=true`,invites:e=>`/channels/${e}/invites`,message:(e,t)=>`/channels/${e}/messages/${t}`,messages:(e,t)=>{let s=`/channels/${e}/messages?`;return t&&(r(t)&&t.after&&(s+=`after=${t.after}`),d(t)&&t.before&&(s+=`&before=${t.before}`),l(t)&&t.around&&(s+=`&around=${t.around}`),u(t)&&t.limit&&(s+=`&limit=${t.limit}`)),s},overwrite:(e,t)=>`/channels/${e}/permissions/${t}`,crosspost:(e,t)=>`/channels/${e}/messages/${t}/crosspost`,stages:()=>"/stage-instances",stage:e=>`/stage-instances/${e}`,threads:{message:(e,t)=>`/channels/${e}/messages/${t}/threads`,all:e=>`/channels/${e}/threads`,active:e=>`/guilds/${e}/threads/active`,members:e=>`/channels/${e}/thread-members`,me:e=>`/channels/${e}/thread-members/@me`,user:(e,t)=>`/channels/${e}/thread-members/${t}`,archived:e=>`/channels/${e}/threads/archived`,public:(e,t)=>{let s=`/channels/${e}/threads/archived/public?`;return t&&(t.before&&(s+=`before=${new Date(t.before).toISOString()}`),t.limit&&(s+=`&limit=${t.limit}`)),s},private:(e,t)=>{let s=`/channels/${e}/threads/archived/private?`;return t&&(t.before&&(s+=`before=${new Date(t.before).toISOString()}`),t.limit&&(s+=`&limit=${t.limit}`)),s},joined:(e,t)=>{let s=`/channels/${e}/users/@me/threads/archived/private?`;return t&&(t.before&&(s+=`before=${new Date(t.before).toISOString()}`),t.limit&&(s+=`&limit=${t.limit}`)),s}},typing:e=>`/channels/${e}/typing`},guilds:{all:()=>"/guilds",auditlogs:(e,t)=>{let s=`/guilds/${e}/audit-logs?`;return t&&(t.actionType&&(s+=`action_type=${t.actionType}`),t.before&&(s+=`&before=${t.before}`),t.limit&&(s+=`&limit=${t.limit}`),t.userId&&(s+=`&user_id=${t.userId}`)),s},automod:{rule:(e,t)=>`/guilds/${e}/auto-moderation/rules/${t}`,rules:e=>`/guilds/${e}/auto-moderation/rules`},channels:e=>`/guilds/${e}/channels`,emoji:(e,t)=>`/guilds/${e}/emojis/${t}`,emojis:e=>`/guilds/${e}/emojis`,events:{events:(e,t)=>{let s=`/guilds/${e}/scheduled-events?`;return void 0!==t&&(s+=`with_user_count=${t.toString()}`),s},event:(e,t,s)=>{let a=`/guilds/${e}/scheduled-events/${t}`;return void 0!==s&&(a+=`with_user_count=${s.toString()}`),a},users:(e,t,s)=>{let a=`/guilds/${e}/scheduled-events/${t}/users?`;return s&&(void 0!==s.limit&&(a+=`limit=${s.limit}`),void 0!==s.withMember&&(a+=`&with_member=${s.withMember.toString()}`),void 0!==s.after&&(a+=`&after=${s.after}`),void 0!==s.before&&(a+=`&before=${s.before}`)),a}},guild(e,t){let s=`/guilds/${e}?`;return void 0!==t&&(s+=`with_counts=${t.toString()}`),s},integration:(e,t)=>`/guilds/${e}/integrations/${t}`,integrations:e=>`/guilds/${e}/integrations?include_applications=true`,invite(e,t){let s=`/invites/${e}?`;return t&&(void 0!==t.withCounts&&(s+=`with_counts=${t.withCounts.toString()}`),void 0!==t.withExpiration&&(s+=`&with_expiration=${t.withExpiration.toString()}`),t.scheduledEventId&&(s+=`&guild_scheduled_event_id=${t.scheduledEventId}`)),s},invites:e=>`/guilds/${e}/invites`,leave:e=>`/users/@me/guilds/${e}`,members:{ban:(e,t)=>`/guilds/${e}/bans/${t}`,bans:(e,t)=>{let s=`/guilds/${e}/bans?`;return t&&(t.limit&&(s+=`limit=${t.limit}`),t.after&&(s+=`&after=${t.after}`),t.before&&(s+=`&before=${t.before}`)),s},bot:e=>`/guilds/${e}/members/@me`,member:(e,t)=>`/guilds/${e}/members/${t}`,members:(e,t)=>{let s=`/guilds/${e}/members?`;return void 0!==t&&(t.limit&&(s+=`limit=${t.limit}`),t.after&&(s+=`&after=${t.after}`)),s},search:(e,t,s)=>{let a=`/guilds/${e}/members/search?query=${encodeURIComponent(t)}`;return s&&void 0!==s.limit&&(a+=`&limit=${s.limit}`),a},prune:(e,t)=>{let s=`/guilds/${e}/prune?`;return t&&(t.days&&(s+=`days=${t.days}`),Array.isArray(t.includeRoles)?s+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(s+=`&include_roles=${t.includeRoles}`)),s}},mfa:e=>`/guilds/${e}/mfa`,preview:e=>`/guilds/${e}/preview`,prune:(e,t)=>{let s=`/guilds/${e}/prune?`;return t&&(t.days&&(s+=`days=${t.days}`),Array.isArray(t.includeRoles)?s+=`&include_roles=${t.includeRoles.join(",")}`:t.includeRoles&&(s+=`&include_roles=${t.includeRoles}`)),s},roles:{one:(e,t)=>`/guilds/${e}/roles/${t}`,all:e=>`/guilds/${e}/roles`,member:(e,t,s)=>`/guilds/${e}/members/${t}/roles/${s}`},stickers:e=>`/guilds/${e}/stickers`,sticker:(e,t)=>`/guilds/${e}/stickers/${t}`,voice:(e,t)=>`/guilds/${e}/voice-states/${t??"@me"}`,templates:{code:e=>`/guilds/templates/${e}`,guild:(e,t)=>`/guilds/${e}/templates/${t}`,all:e=>`/guilds/${e}/templates`},vanity:e=>`/guilds/${e}/vanity-url`,regions:e=>`/guilds/${e}/regions`,webhooks:e=>`/guilds/${e}/webhooks`,welcome:e=>`/guilds/${e}/welcome-screen`,widget:e=>`/guilds/${e}/widget`,widgetJson:e=>`/guilds/${e}/widget.json`},sticker:e=>`/stickers/${e}`,regions:()=>"/voice/regions",interactions:{commands:{commands:e=>`/applications/${e}/commands`,guilds:{all:(e,t)=>`/applications/${e}/guilds/${t}/commands`,one(e,t,s,a){let i=`/applications/${e}/guilds/${t}/commands/${s}?`;return void 0!==a&&(i+=`with_localizations=${a.toString()}`),i}},permissions:(e,t)=>`/applications/${e}/guilds/${t}/commands/permissions`,permission:(e,t,s)=>`/applications/${e}/guilds/${t}/commands/${s}/permissions`,command:(e,t,s)=>{let a=`/applications/${e}/commands/${t}?`;return void 0!==s&&(a+=`withLocalizations=${s.toString()}`),a}},responses:{callback:(e,t)=>`/interactions/${e}/${t}/callback`,original:(e,t)=>`/webhooks/${e}/${t}/messages/@original`,message:(e,t,s)=>`/webhooks/${e}/${t}/messages/${s}`}},user:e=>`/users/${e}`,userBot:()=>"/users/@me",oauth2Application:()=>"oauth2/applications/@me",gatewayBot:()=>"/gateway/bot",nitroStickerPacks:()=>"/sticker-packs"},checkRateLimits(e){let t=y.rateLimitedPaths.get(e),s=y.rateLimitedPaths.get("global"),a=Date.now();return t&&a<t.resetTimestamp?t.resetTimestamp-a:!!s&&a<s.resetTimestamp&&s.resetTimestamp-a},changeToDiscordFormat(e){if(null===e)return null;if("object"==typeof e){if(Array.isArray(e))return e.map(e=>y.changeToDiscordFormat(e));let s={};for(let i of Object.keys(e)){if(["permissions","allow","deny"].includes(i)){s[i]=t(e[i]);continue}if("defaultMemberPermissions"===i){s.default_member_permissions=t(e[i]);continue}s[a(i)]=y.changeToDiscordFormat(e[i])}return s}return"bigint"==typeof e?e.toString():e},createRequest(e){let t={"user-agent":"DiscordBot (https://github.com/discordeno/discordeno, v19.0.0-alpha.1)"};if(e.unauthorized||(t.authorization=`Bot ${y.token}`),e.headers)for(let s in e.headers)t[s.toLowerCase()]=e.headers[s];if("GET"===e.method&&(e.body=void 0),e.body?.reason&&(t["X-Audit-Log-Reason"]=encodeURIComponent(e.body.reason),e.body.reason=void 0),e.body){let{file:a}=e.body;if(a){let i=n(a),o=new FormData;if(e.url?.endsWith("/stickers")&&"POST"===e.method)o.append("file",i[0].blob,i[0].name),o.append("name",e.body.name),o.append("description",e.body.description),o.append("tags",e.body.tags);else{for(let r=0;r<i.length;r++)o.append(`file${r}`,i[r].blob,i[r].name);a&&(e.body.file=void 0),o.append("payload_json",JSON.stringify(y.changeToDiscordFormat(e.body)))}e.body.file=o}else e.body&&!["GET","DELETE"].includes(e.method)&&(t["Content-Type"]="application/json")}return{headers:t,body:e.body?.file??JSON.stringify(y.changeToDiscordFormat(e.body)),method:e.method}},processRateLimitedPaths(){let e=Date.now();for(let[t,s]of y.rateLimitedPaths.entries())s.resetTimestamp>e||(y.rateLimitedPaths.delete(t),"global"!==t||(y.globallyRateLimited=!1));0===y.rateLimitedPaths.size?y.processingRateLimitedPaths=!1:(y.processingRateLimitedPaths=!0,setTimeout(()=>{y.processRateLimitedPaths()},1e3))},processHeaders(e,t){let s=!1,a=t.get("x-ratelimit-remaining"),i=t.get("x-ratelimit-reset-after"),n=Date.now()+1e3*Number(i),o=t.get("x-ratelimit-global"),r=t.get("x-ratelimit-bucket")??void 0,l=t.get("x-ratelimit-limit");if(y.queues.get(e)?.handleCompletedRequest({remaining:a?Number(a):void 0,interval:i?1e3*Number(i):void 0,max:l?Number(l):void 0}),"0"===a&&(s=!0,y.rateLimitedPaths.set(e,{url:e,resetTimestamp:n,bucketId:r}),r&&y.rateLimitedPaths.set(r,{url:e,resetTimestamp:n,bucketId:r})),o){let d=t.get("retry-after"),u=Date.now()+1e3*Number(d);y.globallyRateLimited=!0,s=!0,setTimeout(()=>{y.globallyRateLimited=!1},u),y.rateLimitedPaths.set("global",{url:"global",resetTimestamp:u,bucketId:r}),r&&y.rateLimitedPaths.set(r,{url:"global",resetTimestamp:u,bucketId:r})}return s&&!y.processingRateLimitedPaths&&y.processRateLimitedPaths(),s?r:void 0},async sendRequest(e){let t=e.url.startsWith("https://")?e.url:`${y.baseUrl}/v${y.version}${e.url}`,s=y.createRequest({method:e.method,url:e.url,body:e.body,...e.options});c.debug(`sending request to ${t}`,"with payload:",{...s,headers:{...s.headers,authorization:"Bot tokenhere"}});let a=await fetch(t,s);c.debug(`request fetched from ${t} with status ${a.status} & ${a.statusText}`);let n=y.processHeaders(y.simplifyUrl(e.url,e.method),a.headers);if(n&&(e.bucketId=n),a.status<200||a.status>=400){if(c.debug(`Request to ${t} failed.`),429===a.status){if(c.debug(`Request to ${t} was ratelimited.`),e.retryCount++>=y.maxRetryCount)return c.debug(`Request to ${t} exceeded the maximum allowed retries.`,"with payload:",s),e.reject({ok:!1,status:a.status,error:"The options was rate limited and it maxed out the retries limit."});y.invalidBucket.handleCompletedRequest(a.status,"shared"===a.headers.get("X-RateLimit-Scope"));let o=a.headers.get("x-ratelimit-reset-after");return o&&await i(1e3*Number(o)),await a.json(),await e.retryRequest?.(e)}return e.reject({ok:!1,status:a.status,body:JSON.stringify(await a.json())})}let r=204===a.status,l=r?void 0:await a.json();return e.resolve({ok:!0,status:a.status,body:JSON.stringify(l)})},simplifyUrl(e,t){let s=e.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g,function(e,t){return["channels","guilds"].includes(t)?e:`/${t}/x`}).replace(/\/reactions\/[^/]+/g,"/reactions/x");return s.includes("/reactions")&&(s=s.substring(0,s.indexOf("/reactions")+10)),"DELETE"===t&&s.endsWith("/messages/x")&&(s=t+s),s},processRequest(e){let t=e.url.substring(e.url.indexOf("api/")),s=t.split("/");s.shift(),s[0]?.startsWith("v")&&s.shift(),e.url=`${y.baseUrl}/v${y.version}/${s.join("/")}`;let a=y.simplifyUrl(e.url,e.method),i=y.queues.get(a);if(void 0!==i)i.makeRequest(e);else{let n=new h(y,{url:a,deleteQueueDelay:y.deleteQueueDelay});n.makeRequest(e),y.queues.set(a,n)}},makeRequest:async(e,t,s,a)=>await new Promise((i,n)=>{let o={url:t,method:e,body:s,retryCount:0,retryRequest:async function(e){y.processRequest(o)},resolve:e=>i(204!==e.status?JSON.parse(e.body??"{}"):void 0),reject:n,options:a};y.processRequest(o)}),get:async e=>s(await y.makeRequest("GET",e)),post:async(e,t)=>s(await y.makeRequest("POST",e,t)),delete:async(e,t)=>s(await y.makeRequest("DELETE",e,t)),patch:async(e,t)=>s(await y.makeRequest("PATCH",e,t)),put:async(e,t,a)=>s(await y.makeRequest("PUT",e,t,a)),addReaction:async(e,t,s)=>await y.put(y.routes.channels.reactions.bot(e,t,s=m(s))),async addReactions(e,t,s,a=!1){if(!a){await Promise.all(s.map(async s=>await y.addReaction(e,t,s)));return}for(let i of s)await y.addReaction(e,t,i)},addRole:async(e,t,s,a)=>await y.put(y.routes.guilds.roles.member(e,t,s),{reason:a}),addThreadMember:async(e,t)=>await y.put(y.routes.channels.threads.user(e,t)),createAutomodRule:async(e,t)=>await y.post(y.routes.guilds.automod.rules(e),t),createChannel:async(e,t)=>await y.post(y.routes.guilds.channels(e),t),createEmoji:async(e,t)=>await y.post(y.routes.guilds.emojis(e),t),createGlobalApplicationCommand:async e=>await y.post(y.routes.interactions.commands.commands(y.applicationId),e),createGuild:async e=>await y.post(y.routes.guilds.all(),e),createGuildApplicationCommand:async(e,t)=>await y.post(y.routes.interactions.commands.guilds.all(y.applicationId,t),e),createGuildFromTemplate:async(e,t)=>(t.icon&&(t.icon=await g(t.icon)),await y.post(y.routes.guilds.templates.code(e),t)),createGuildSticker:async(e,t)=>await y.post(y.routes.guilds.stickers(e),t),createGuildTemplate:async(e,t)=>await y.post(y.routes.guilds.templates.all(e),t),createForumThread:async(e,t)=>await y.post(y.routes.channels.forum(e),t),createInvite:async(e,t={})=>await y.post(y.routes.channels.invites(e),t),createRole:async(e,t,s)=>await y.post(y.routes.guilds.roles.all(e),{...t,reason:s}),createScheduledEvent:async(e,t)=>await y.post(y.routes.guilds.events.events(e),t),createStageInstance:async e=>await y.post(y.routes.channels.stages(),e),createWebhook:async(e,t)=>await y.post(y.routes.channels.webhooks(e),{name:t.name,avatar:t.avatar?await g(t.avatar):void 0,reason:t.reason}),deleteAutomodRule:async(e,t,s)=>await y.delete(y.routes.guilds.automod.rule(e,t),{reason:s}),deleteChannel:async(e,t)=>await y.delete(y.routes.channels.channel(e),{reason:t}),deleteChannelPermissionOverride:async(e,t,s)=>await y.delete(y.routes.channels.overwrite(e,t),s?{reason:s}:void 0),deleteEmoji:async(e,t,s)=>await y.delete(y.routes.guilds.emoji(e,t),{reason:s}),deleteFollowupMessage:async(e,t)=>await y.delete(y.routes.interactions.responses.message(y.applicationId,e,t)),deleteGlobalApplicationCommand:async e=>await y.delete(y.routes.interactions.commands.command(y.applicationId,e)),deleteGuild:async e=>await y.delete(y.routes.guilds.guild(e)),deleteGuildApplicationCommand:async(e,t)=>await y.delete(y.routes.interactions.commands.guilds.one(y.applicationId,t,e)),deleteGuildSticker:async(e,t,s)=>await y.delete(y.routes.guilds.sticker(e,t),s?{reason:s}:void 0),deleteGuildTemplate:async(e,t)=>await y.delete(y.routes.guilds.templates.guild(e,t)),deleteIntegration:async(e,t)=>await y.delete(y.routes.guilds.integration(e,t)),deleteInvite:async(e,t)=>await y.delete(y.routes.guilds.invite(e),t?{reason:t}:void 0),deleteMessage:async(e,t,s)=>await y.delete(y.routes.channels.message(e,t),{reason:s}),deleteMessages:async(e,t,s)=>await y.post(y.routes.channels.bulk(e),{messages:t.slice(0,100).map(e=>e.toString()),reason:s}),deleteOriginalInteractionResponse:async e=>await y.delete(y.routes.interactions.responses.original(y.applicationId,e)),deleteOwnReaction:async(e,t,s)=>await y.delete(y.routes.channels.reactions.bot(e,t,s=m(s))),deleteReactionsAll:async(e,t)=>await y.delete(y.routes.channels.reactions.all(e,t)),deleteReactionsEmoji:async(e,t,s)=>await y.delete(y.routes.channels.reactions.emoji(e,t,s=m(s))),deleteRole:async(e,t)=>await y.delete(y.routes.guilds.roles.one(e,t)),deleteScheduledEvent:async(e,t)=>await y.delete(y.routes.guilds.events.event(e,t)),deleteStageInstance:async(e,t)=>await y.delete(y.routes.channels.stage(e),t?{reason:t}:void 0),deleteUserReaction:async(e,t,s,a)=>await y.delete(y.routes.channels.reactions.user(e,t,a=m(a),s)),deleteWebhook:async(e,t)=>await y.delete(y.routes.webhooks.id(e),{reason:t}),deleteWebhookMessage:async(e,t,s,a)=>await y.delete(y.routes.webhooks.message(e,t,s,a)),deleteWebhookWithToken:async(e,t)=>await y.delete(y.routes.webhooks.webhook(e,t)),editApplicationCommandPermissions:async(e,t,s,a)=>await y.put(y.routes.interactions.commands.permission(y.applicationId,e,t),{permissions:a},{headers:{authorization:`Bearer ${s}`}}),editAutomodRule:async(e,t,s)=>await y.patch(y.routes.guilds.automod.rule(e,t),s),async editBotProfile(e){let t=e?.botAvatarURL?await g(e?.botAvatarURL):e?.botAvatarURL;return await y.patch(y.routes.userBot(),{username:e.username?.trim(),avatar:t})},editChannel:async(e,t)=>await y.patch(y.routes.channels.channel(e),t),editChannelPermissionOverrides:async(e,t)=>await y.put(y.routes.channels.overwrite(e,t.id),t),editChannelPositions:async(e,t)=>await y.patch(y.routes.guilds.channels(e),t),editEmoji:async(e,t,s)=>await y.patch(y.routes.guilds.emoji(e,t),s),editFollowupMessage:async(e,t,s)=>await y.patch(y.routes.interactions.responses.message(y.applicationId,e,t),s),editGlobalApplicationCommand:async(e,t)=>await y.patch(y.routes.interactions.commands.command(y.applicationId,e),t),editGuild:async(e,t)=>await y.patch(y.routes.guilds.guild(e),t),editGuildApplicationCommand:async(e,t,s)=>await y.patch(y.routes.interactions.commands.guilds.one(y.applicationId,t,e),s),editGuildMfaLevel:async(e,t,s)=>await y.post(y.routes.guilds.mfa(e),{level:t,reason:s}),editGuildSticker:async(e,t,s)=>await y.patch(y.routes.guilds.sticker(e,t),s),editGuildTemplate:async(e,t,s)=>await y.patch(y.routes.guilds.templates.guild(e,t),s),editMessage:async(e,t,s)=>await y.patch(y.routes.channels.message(e,t),s),editOriginalInteractionResponse:async(e,t)=>await y.patch(y.routes.interactions.responses.original(y.applicationId,e),t),editOriginalWebhookMessage:async(t,s,a)=>await y.patch(y.routes.webhooks.original(t,s,a),{type:e.UpdateMessage,data:a}),editOwnVoiceState:async(e,t)=>await y.patch(y.routes.guilds.voice(e),{channel_id:t.channelId,suppress:t.suppress,request_to_speak_timestamp:t.requestToSpeakTimestamp?new Date(t.requestToSpeakTimestamp).toISOString():t.requestToSpeakTimestamp}),editScheduledEvent:async(e,t,s)=>await y.patch(y.routes.guilds.events.event(e,t),s),editRole:async(e,t,s)=>await y.patch(y.routes.guilds.roles.one(e,t),s),editRolePositions:async(e,t)=>await y.patch(y.routes.guilds.roles.all(e),t),editStageInstance:async(e,t)=>await y.patch(y.routes.channels.stage(e),{topic:t.topic}),editUserVoiceState:async(e,t)=>await y.patch(y.routes.guilds.voice(e,t.userId),{channel_id:t.channelId,suppress:t.suppress,user_id:t.userId}),editWebhook:async(e,t)=>await y.patch(y.routes.webhooks.id(e),t),editWebhookMessage:async(e,t,s,a)=>await y.patch(y.routes.webhooks.message(e,t,s,a),a),editWebhookWithToken:async(e,t,s)=>await y.patch(y.routes.webhooks.webhook(e,t),s),editWelcomeScreen:async(e,t)=>await y.patch(y.routes.guilds.welcome(e),t),editWidgetSettings:async(e,t)=>await y.patch(y.routes.guilds.widget(e),t),executeWebhook:async(e,t,s)=>await y.post(y.routes.webhooks.webhook(e,t,s),s),followAnnouncement:async(e,t)=>await y.post(y.routes.channels.follow(e),{webhook_channel_id:t}),getActiveThreads:async e=>await y.get(y.routes.channels.threads.active(e)),getApplicationCommandPermission:async(e,t)=>await y.get(y.routes.interactions.commands.permission(y.applicationId,e,t)),getApplicationCommandPermissions:async e=>await y.get(y.routes.interactions.commands.permissions(y.applicationId,e)),getApplicationInfo:async()=>await y.get(y.routes.oauth2Application()),getAuditLog:async(e,t)=>await y.get(y.routes.guilds.auditlogs(e,t)),getAutomodRule:async(e,t)=>await y.get(y.routes.guilds.automod.rule(e,t)),getAutomodRules:async e=>await y.get(y.routes.guilds.automod.rules(e)),getAvailableVoiceRegions:async()=>await y.get(y.routes.regions()),getBan:async(e,t)=>await y.get(y.routes.guilds.members.ban(e,t)),getBans:async(e,t)=>await y.get(y.routes.guilds.members.bans(e,t)),getChannel:async e=>await y.get(y.routes.channels.channel(e)),getChannelInvites:async e=>await y.get(y.routes.channels.invites(e)),getChannels:async e=>await y.get(y.routes.guilds.channels(e)),getChannelWebhooks:async e=>await y.get(y.routes.channels.webhooks(e)),getDmChannel:async e=>await y.post(y.routes.channels.dm(),{recipient_id:e.toString()}),getEmoji:async(e,t)=>await y.get(y.routes.guilds.emoji(e,t)),getEmojis:async e=>await y.get(y.routes.guilds.emojis(e)),getFollowupMessage:async(e,t)=>await y.get(y.routes.interactions.responses.message(y.applicationId,e,t)),getGatewayBot:async()=>await y.get(y.routes.gatewayBot()),getGlobalApplicationCommand:async e=>await y.get(y.routes.interactions.commands.command(y.applicationId,e)),getGlobalApplicationCommands:async()=>await y.get(y.routes.interactions.commands.commands(y.applicationId)),getGuild:async(e,t={counts:!0})=>await y.get(y.routes.guilds.guild(e,t.counts)),getGuildApplicationCommand:async(e,t)=>await y.get(y.routes.interactions.commands.guilds.one(y.applicationId,t,e)),getGuildApplicationCommands:async e=>await y.get(y.routes.interactions.commands.guilds.all(y.applicationId,e)),getGuildPreview:async e=>await y.get(y.routes.guilds.preview(e)),getGuildTemplate:async e=>await y.get(y.routes.guilds.templates.code(e)),getGuildTemplates:async e=>await y.get(y.routes.guilds.templates.all(e)),getGuildWebhooks:async e=>await y.get(y.routes.guilds.webhooks(e)),getIntegrations:async e=>await y.get(y.routes.guilds.integrations(e)),getInvite:async(e,t)=>await y.get(y.routes.guilds.invite(e,t)),getInvites:async e=>await y.get(y.routes.guilds.invites(e)),getMessage:async(e,t)=>await y.get(y.routes.channels.message(e,t)),getMessages:async(e,t)=>await y.get(y.routes.channels.messages(e,t)),getNitroStickerPacks:async()=>await y.get(y.routes.nitroStickerPacks()),getOriginalInteractionResponse:async e=>await y.get(y.routes.interactions.responses.original(y.applicationId,e)),getPinnedMessages:async e=>await y.get(y.routes.channels.pins(e)),getPrivateArchivedThreads:async(e,t)=>await y.get(y.routes.channels.threads.private(e,t)),getPrivateJoinedArchivedThreads:async(e,t)=>await y.get(y.routes.channels.threads.joined(e,t)),getPruneCount:async(e,t)=>await y.get(y.routes.guilds.prune(e,t)),getPublicArchivedThreads:async(e,t)=>await y.get(y.routes.channels.threads.public(e,t)),getRoles:async e=>await y.get(y.routes.guilds.roles.all(e)),getScheduledEvent:async(e,t,s)=>await y.get(y.routes.guilds.events.event(e,t,s?.withUserCount)),getScheduledEvents:async(e,t)=>await y.get(y.routes.guilds.events.events(e,t?.withUserCount)),getScheduledEventUsers:async(e,t,s)=>await y.get(y.routes.guilds.events.users(e,t,s)),getSessionInfo:async()=>await y.getGatewayBot(),getStageInstance:async e=>await y.get(y.routes.channels.stage(e)),getSticker:async e=>await y.get(y.routes.sticker(e)),getGuildSticker:async(e,t)=>await y.get(y.routes.guilds.sticker(e,t)),getGuildStickers:async e=>await y.get(y.routes.guilds.stickers(e)),getThreadMember:async(e,t)=>await y.get(y.routes.channels.threads.user(e,t)),getThreadMembers:async e=>await y.get(y.routes.channels.threads.members(e)),getReactions:async(e,t,s,a)=>await y.get(y.routes.channels.reactions.message(e,t,s,a)),getUser:async e=>await y.get(y.routes.user(e)),getVanityUrl:async e=>await y.get(y.routes.guilds.vanity(e)),getVoiceRegions:async e=>await y.get(y.routes.guilds.regions(e)),getWebhook:async e=>await y.get(y.routes.webhooks.id(e)),getWebhookMessage:async(e,t,s,a)=>await y.get(y.routes.webhooks.message(e,t,s,a)),getWebhookWithToken:async(e,t)=>await y.get(y.routes.webhooks.webhook(e,t)),getWelcomeScreen:async e=>await y.get(y.routes.guilds.welcome(e)),getWidget:async e=>await y.get(y.routes.guilds.widgetJson(e)),getWidgetSettings:async e=>await y.get(y.routes.guilds.widget(e)),joinThread:async e=>await y.put(y.routes.channels.threads.me(e)),leaveGuild:async e=>await y.delete(y.routes.guilds.leave(e)),leaveThread:async e=>await y.delete(y.routes.channels.threads.me(e)),publishMessage:async(e,t)=>await y.post(y.routes.channels.crosspost(e,t)),removeRole:async(e,t,s,a)=>await y.delete(y.routes.guilds.roles.member(e,t,s),{reason:a}),removeThreadMember:async(e,t)=>await y.delete(y.routes.channels.threads.user(e,t)),sendFollowupMessage:async(e,t)=>await new Promise((s,a)=>{y.sendRequest({url:y.routes.webhooks.webhook(y.applicationId,e),method:"POST",body:t,retryCount:0,retryRequest:async function(e){await y.sendRequest(e)},resolve:e=>s(204!==e.status?JSON.parse(e.body??"{}"):void 0),reject:a})}),sendInteractionResponse:async(e,t,s)=>await new Promise((a,i)=>{y.sendRequest({url:y.routes.interactions.responses.callback(e,t),method:"POST",body:s,retryCount:0,retryRequest:async function(e){await y.sendRequest(e)},resolve:e=>a(204!==e.status?JSON.parse(e.body??"{}"):void 0),reject:i})}),sendMessage:async(e,t)=>await y.post(y.routes.channels.messages(e),t),startThreadWithMessage:async(e,t,s)=>await y.post(y.routes.channels.threads.message(e,t),s),startThreadWithoutMessage:async(e,t)=>await y.post(y.routes.channels.threads.all(e),t),syncGuildTemplate:async e=>await y.put(y.routes.guilds.templates.all(e)),banMember:async(e,t,s)=>await y.put(y.routes.guilds.members.ban(e,t),s),editBotMember:async(e,t)=>await y.patch(y.routes.guilds.members.bot(e),t),editMember:async(e,t,s)=>await y.patch(y.routes.guilds.members.member(e,t),s),getMember:async(e,t)=>await y.get(y.routes.guilds.members.member(e,t)),getMembers:async(e,t)=>await y.get(y.routes.guilds.members.members(e,t)),kickMember:async(e,t,s)=>await y.delete(y.routes.guilds.members.member(e,t),{reason:s}),pinMessage:async(e,t,s)=>await y.put(y.routes.channels.pin(e,t),s?{reason:s}:void 0),pruneMembers:async(e,t)=>await y.post(y.routes.guilds.members.prune(e),t),searchMembers:async(e,t,s)=>await y.get(y.routes.guilds.members.search(e,t,s)),unbanMember:async(e,t)=>await y.delete(y.routes.guilds.members.ban(e,t)),unpinMessage:async(e,t,s)=>await y.delete(y.routes.channels.pin(e,t),s?{reason:s}:void 0),triggerTypingIndicator:async e=>await y.post(y.routes.channels.typing(e)),upsertGlobalApplicationCommands:async e=>await y.put(y.routes.interactions.commands.commands(y.applicationId),e),upsertGuildApplicationCommands:async(e,t)=>await y.put(y.routes.interactions.commands.guilds.all(y.applicationId,e),t)};return y}
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9ucyAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tY29uc3QtYXNzaWduICovXG5pbXBvcnQgeyBJbnRlcmFjdGlvblJlc3BvbnNlVHlwZXMgfSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB7XG4gIGNhbGN1bGF0ZUJpdHMsXG4gIGNhbWVsaXplLFxuICBjYW1lbFRvU25ha2VDYXNlLFxuICBkZWxheSxcbiAgZmluZEZpbGVzLFxuICBnZXRCb3RJZEZyb21Ub2tlbixcbiAgaXNHZXRNZXNzYWdlc0FmdGVyLFxuICBpc0dldE1lc3NhZ2VzQXJvdW5kLFxuICBpc0dldE1lc3NhZ2VzQmVmb3JlLFxuICBpc0dldE1lc3NhZ2VzTGltaXQsXG4gIGxvZ2dlcixcbiAgcHJvY2Vzc1JlYWN0aW9uU3RyaW5nLFxuICB1cmxUb0Jhc2U2NCxcbn0gZnJvbSAnQGRpc2NvcmRlbm8vdXRpbHMnXG5cbmltcG9ydCB7IGNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IH0gZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuaW1wb3J0IHsgUXVldWUgfSBmcm9tICcuL3F1ZXVlLmpzJ1xuXG5pbXBvcnQgdHlwZSB7XG4gIEJpZ1N0cmluZyxcbiAgQ2FtZWxpemUsXG4gIERpc2NvcmRBcHBsaWNhdGlvbixcbiAgRGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZCxcbiAgRGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zLFxuICBEaXNjb3JkQXVkaXRMb2csXG4gIERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGUsXG4gIERpc2NvcmRCYW4sXG4gIERpc2NvcmRDaGFubmVsLFxuICBEaXNjb3JkRW1vamksXG4gIERpc2NvcmRGb2xsb3dBbm5vdW5jZW1lbnRDaGFubmVsLFxuICBEaXNjb3JkRm9sbG93ZWRDaGFubmVsLFxuICBEaXNjb3JkR2V0R2F0ZXdheUJvdCxcbiAgRGlzY29yZEd1aWxkLFxuICBEaXNjb3JkR3VpbGRQcmV2aWV3LFxuICBEaXNjb3JkR3VpbGRXaWRnZXQsXG4gIERpc2NvcmRHdWlsZFdpZGdldFNldHRpbmdzLFxuICBEaXNjb3JkSW50ZWdyYXRpb24sXG4gIERpc2NvcmRJbnZpdGUsXG4gIERpc2NvcmRJbnZpdGVNZXRhZGF0YSxcbiAgRGlzY29yZExpc3RBY3RpdmVUaHJlYWRzLFxuICBEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcyxcbiAgRGlzY29yZE1lbWJlcixcbiAgRGlzY29yZE1lbWJlcldpdGhVc2VyLFxuICBEaXNjb3JkTWVzc2FnZSxcbiAgRGlzY29yZFBydW5lZENvdW50LFxuICBEaXNjb3JkUm9sZSxcbiAgRGlzY29yZFNjaGVkdWxlZEV2ZW50LFxuICBEaXNjb3JkU3RhZ2VJbnN0YW5jZSxcbiAgRGlzY29yZFN0aWNrZXIsXG4gIERpc2NvcmRTdGlja2VyUGFjayxcbiAgRGlzY29yZFRlbXBsYXRlLFxuICBEaXNjb3JkVGhyZWFkTWVtYmVyLFxuICBEaXNjb3JkVXNlcixcbiAgRGlzY29yZFZhbml0eVVybCxcbiAgRGlzY29yZFZvaWNlUmVnaW9uLFxuICBEaXNjb3JkV2ViaG9vayxcbiAgRGlzY29yZFdlbGNvbWVTY3JlZW4sXG4gIEdldE1lc3NhZ2VzT3B0aW9ucyxcbiAgR2V0U2NoZWR1bGVkRXZlbnRVc2VycyxcbiAgTWZhTGV2ZWxzLFxuICBNb2RpZnlHdWlsZFRlbXBsYXRlLFxufSBmcm9tICdAZGlzY29yZGVuby90eXBlcydcbmltcG9ydCB0eXBlIHsgQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zLCBSZXN0TWFuYWdlciwgU2VuZFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi90eXBlcy5qcydcblxuLy8gVE9ETzogbWFrZSBkeW5hbWljIGJhc2VkIG9uIHBhY2thZ2UuanNvbiBmaWxlXG5jb25zdCB2ZXJzaW9uID0gJzE5LjAuMC1hbHBoYS4xJ1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzdE1hbmFnZXIob3B0aW9uczogQ3JlYXRlUmVzdE1hbmFnZXJPcHRpb25zKTogUmVzdE1hbmFnZXIge1xuICAvLyBGYWxzeSB0b2tlbiBzdHJpbmcgY2hlY2tcbiAgaWYgKCFvcHRpb25zLnRva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSB2YWxpZCB0b2tlbi4nKVxuXG4gIGNvbnN0IHJlc3Q6IFJlc3RNYW5hZ2VyID0ge1xuICAgIHRva2VuOiBvcHRpb25zLnRva2VuLFxuICAgIGFwcGxpY2F0aW9uSWQ6IG9wdGlvbnMuYXBwbGljYXRpb25JZCA/IEJpZ0ludChvcHRpb25zLmFwcGxpY2F0aW9uSWQpIDogZ2V0Qm90SWRGcm9tVG9rZW4ob3B0aW9ucy50b2tlbiksXG4gICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uID8/IDEwLFxuICAgIGJhc2VVcmw6IG9wdGlvbnMuYmFzZVVybCA/PyAnaHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGknLFxuICAgIG1heFJldHJ5Q291bnQ6IEluZmluaXR5LFxuICAgIGdsb2JhbGx5UmF0ZUxpbWl0ZWQ6IGZhbHNlLFxuICAgIHByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzOiBmYWxzZSxcbiAgICBkZWxldGVRdWV1ZURlbGF5OiA2MDAwMCxcbiAgICBxdWV1ZXM6IG5ldyBNYXAoKSxcbiAgICByYXRlTGltaXRlZFBhdGhzOiBuZXcgTWFwKCksXG4gICAgaW52YWxpZEJ1Y2tldDogY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQoe30pLFxuXG4gICAgcm91dGVzOiB7XG4gICAgICB3ZWJob29rczoge1xuICAgICAgICBpZDogKHdlYmhvb2tJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfWBcbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZTogKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgIGxldCB1cmwgPSBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfS8ke3Rva2VufS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnRocmVhZElkKSB1cmwgKz0gYHRocmVhZF9pZD0ke29wdGlvbnMudGhyZWFkSWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgb3JpZ2luYWw6ICh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvd2ViaG9va3MvJHt3ZWJob29rSWR9LyR7dG9rZW59L21lc3NhZ2VzL0BvcmlnaW5hbD9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHVybCArPSBgdGhyZWFkX2lkPSR7b3B0aW9ucy50aHJlYWRJZH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgICB3ZWJob29rOiAod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgIGxldCB1cmwgPSBgL3dlYmhvb2tzLyR7d2ViaG9va0lkfS8ke3Rva2VufT9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LndhaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGB3YWl0PSR7b3B0aW9ucy53YWl0LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgaWYgKG9wdGlvbnMudGhyZWFkSWQpIHVybCArPSBgdGhyZWFkX2lkPSR7b3B0aW9ucy50aHJlYWRJZH1gXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gTWlzY2VsbGFuZW91cyBFbmRwb2ludHNcbiAgICAgIHNlc3Npb25JbmZvOiAoKSA9PiByZXN0LnJvdXRlcy5nYXRld2F5Qm90KCksXG5cbiAgICAgIC8vIENoYW5uZWwgRW5kcG9pbnRzXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICBidWxrOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzL2J1bGstZGVsZXRlYFxuICAgICAgICB9LFxuICAgICAgICBkbTogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAnL3VzZXJzL0BtZS9jaGFubmVscydcbiAgICAgICAgfSxcbiAgICAgICAgcGluOiAoY2hhbm5lbElkLCBtZXNzYWdlSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vcGlucy8ke21lc3NhZ2VJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIHBpbnM6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vcGluc2BcbiAgICAgICAgfSxcbiAgICAgICAgcmVhY3Rpb25zOiB7XG4gICAgICAgICAgYm90OiAoY2hhbm5lbElkLCBtZXNzYWdlSWQsIGVtb2ppKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3JlYWN0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChlbW9qaSl9L0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXI6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCwgZW1vamksIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoZW1vamkpfS8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbW9qaTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBlbW9qaSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoZW1vamkpfT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIpIHVybCArPSBgYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBlbW9qaSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L21lc3NhZ2VzLyR7bWVzc2FnZUlkfS9yZWFjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoZW1vamkpfT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIpIHVybCArPSBgYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHdlYmhvb2tzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3dlYmhvb2tzYFxuICAgICAgICB9LFxuXG4gICAgICAgIGNoYW5uZWw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgZm9sbG93OiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L2ZvbGxvd2Vyc2BcbiAgICAgICAgfSxcblxuICAgICAgICBmb3J1bTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzP2hhc19tZXNzYWdlPXRydWVgXG4gICAgICAgIH0sXG5cbiAgICAgICAgaW52aXRlczogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9pbnZpdGVzYFxuICAgICAgICB9LFxuXG4gICAgICAgIG1lc3NhZ2U6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgbWVzc2FnZXM6IChjaGFubmVsSWQsIG9wdGlvbnM/OiBHZXRNZXNzYWdlc09wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXM/YFxuXG4gICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChpc0dldE1lc3NhZ2VzQWZ0ZXIob3B0aW9ucykgJiYgb3B0aW9ucy5hZnRlcikge1xuICAgICAgICAgICAgICB1cmwgKz0gYGFmdGVyPSR7b3B0aW9ucy5hZnRlcn1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNHZXRNZXNzYWdlc0JlZm9yZShvcHRpb25zKSAmJiBvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICB1cmwgKz0gYCZiZWZvcmU9JHtvcHRpb25zLmJlZm9yZX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNHZXRNZXNzYWdlc0Fyb3VuZChvcHRpb25zKSAmJiBvcHRpb25zLmFyb3VuZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYCZhcm91bmQ9JHtvcHRpb25zLmFyb3VuZH1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNHZXRNZXNzYWdlc0xpbWl0KG9wdGlvbnMpICYmIG9wdGlvbnMubGltaXQpIHtcbiAgICAgICAgICAgICAgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG5cbiAgICAgICAgb3ZlcndyaXRlOiAoY2hhbm5lbElkLCBvdmVyd3JpdGVJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9wZXJtaXNzaW9ucy8ke292ZXJ3cml0ZUlkfWBcbiAgICAgICAgfSxcblxuICAgICAgICBjcm9zc3Bvc3Q6IChjaGFubmVsSWQsIG1lc3NhZ2VJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS9tZXNzYWdlcy8ke21lc3NhZ2VJZH0vY3Jvc3Nwb3N0YFxuICAgICAgICB9LFxuXG4gICAgICAgIHN0YWdlczogKCkgPT4ge1xuICAgICAgICAgIHJldHVybiAnL3N0YWdlLWluc3RhbmNlcydcbiAgICAgICAgfSxcblxuICAgICAgICBzdGFnZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL3N0YWdlLWluc3RhbmNlcy8ke2NoYW5uZWxJZH1gXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVGhyZWFkIEVuZHBvaW50c1xuICAgICAgICB0aHJlYWRzOiB7XG4gICAgICAgICAgbWVzc2FnZTogKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vbWVzc2FnZXMvJHttZXNzYWdlSWR9L3RocmVhZHNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBhbGw6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2NoYW5uZWxzLyR7Y2hhbm5lbElkfS90aHJlYWRzYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWN0aXZlOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdGhyZWFkcy9hY3RpdmVgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkLW1lbWJlcnNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZTogKGNoYW5uZWxJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVzZXI6IChjaGFubmVsSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZC1tZW1iZXJzLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFyY2hpdmVkOiAoY2hhbm5lbElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdGhyZWFkcy9hcmNoaXZlZGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIHB1YmxpYzogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHVibGljP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGBiZWZvcmU9JHtuZXcgRGF0ZShvcHRpb25zLmJlZm9yZSkudG9JU09TdHJpbmcoKX1gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJpdmF0ZTogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3RocmVhZHMvYXJjaGl2ZWQvcHJpdmF0ZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkge1xuICAgICAgICAgICAgICAgIHVybCArPSBgYmVmb3JlPSR7bmV3IERhdGUob3B0aW9ucy5iZWZvcmUpLnRvSVNPU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQpIHVybCArPSBgJmxpbWl0PSR7b3B0aW9ucy5saW1pdH1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGpvaW5lZDogKGNoYW5uZWxJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvY2hhbm5lbHMvJHtjaGFubmVsSWR9L3VzZXJzL0BtZS90aHJlYWRzL2FyY2hpdmVkL3ByaXZhdGU/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHtcbiAgICAgICAgICAgICAgICB1cmwgKz0gYGJlZm9yZT0ke25ldyBEYXRlKG9wdGlvbnMuYmVmb3JlKS50b0lTT1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcblxuICAgICAgICB0eXBpbmc6IChjaGFubmVsSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9jaGFubmVscy8ke2NoYW5uZWxJZH0vdHlwaW5nYFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gR3VpbGQgRW5kcG9pbnRzXG4gICAgICBndWlsZHM6IHtcbiAgICAgICAgYWxsOiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuICcvZ3VpbGRzJ1xuICAgICAgICB9LFxuICAgICAgICBhdWRpdGxvZ3M6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vYXVkaXQtbG9ncz9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWN0aW9uVHlwZSkgdXJsICs9IGBhY3Rpb25fdHlwZT0ke29wdGlvbnMuYWN0aW9uVHlwZX1gXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUpIHVybCArPSBgJmJlZm9yZT0ke29wdGlvbnMuYmVmb3JlfWBcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0KSB1cmwgKz0gYCZsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudXNlcklkKSB1cmwgKz0gYCZ1c2VyX2lkPSR7b3B0aW9ucy51c2VySWR9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgYXV0b21vZDoge1xuICAgICAgICAgIHJ1bGU6IChndWlsZElkLCBydWxlSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlcy8ke3J1bGVJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBydWxlczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2F1dG8tbW9kZXJhdGlvbi9ydWxlc2BcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBjaGFubmVsczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9jaGFubmVsc2BcbiAgICAgICAgfSxcbiAgICAgICAgZW1vamk6IChndWlsZElkLCBlbW9qaUlkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vZW1vamlzLyR7ZW1vamlJZH1gXG4gICAgICAgIH0sXG4gICAgICAgIGVtb2ppczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9lbW9qaXNgXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgIGV2ZW50czogKGd1aWxkSWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzP2BcblxuICAgICAgICAgICAgaWYgKHdpdGhVc2VyQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfdXNlcl9jb3VudD0ke3dpdGhVc2VyQ291bnQudG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudDogKGd1aWxkSWQsIGV2ZW50SWQsIHdpdGhVc2VyQ291bnQ/OiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH1gXG5cbiAgICAgICAgICAgIGlmICh3aXRoVXNlckNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX3VzZXJfY291bnQ9JHt3aXRoVXNlckNvdW50LnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1c2VyczogKGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/OiBHZXRTY2hlZHVsZWRFdmVudFVzZXJzKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9zY2hlZHVsZWQtZXZlbnRzLyR7ZXZlbnRJZH0vdXNlcnM/YFxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmxpbWl0ICE9PSB1bmRlZmluZWQpIHVybCArPSBgbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aE1lbWJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJndpdGhfbWVtYmVyPSR7b3B0aW9ucy53aXRoTWVtYmVyLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYWZ0ZXIgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYWZ0ZXI9JHtvcHRpb25zLmFmdGVyfWBcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5iZWZvcmUgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmYmVmb3JlPSR7b3B0aW9ucy5iZWZvcmV9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZ3VpbGQoZ3VpbGRJZCwgd2l0aENvdW50cykge1xuICAgICAgICAgIGxldCB1cmwgPSBgL2d1aWxkcy8ke2d1aWxkSWR9P2BcblxuICAgICAgICAgIGlmICh3aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHVybCArPSBgd2l0aF9jb3VudHM9JHt3aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L2ludGVncmF0aW9ucy8ke2ludGVncmF0aW9uSWR9YFxuICAgICAgICB9LFxuICAgICAgICBpbnRlZ3JhdGlvbnM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW50ZWdyYXRpb25zP2luY2x1ZGVfYXBwbGljYXRpb25zPXRydWVgXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSB7XG4gICAgICAgICAgbGV0IHVybCA9IGAvaW52aXRlcy8ke2ludml0ZUNvZGV9P2BcblxuICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy53aXRoQ291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICB1cmwgKz0gYHdpdGhfY291bnRzPSR7b3B0aW9ucy53aXRoQ291bnRzLnRvU3RyaW5nKCl9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMud2l0aEV4cGlyYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJndpdGhfZXhwaXJhdGlvbj0ke29wdGlvbnMud2l0aEV4cGlyYXRpb24udG9TdHJpbmcoKX1gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zY2hlZHVsZWRFdmVudElkKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgdXJsICs9IGAmZ3VpbGRfc2NoZWR1bGVkX2V2ZW50X2lkPSR7b3B0aW9ucy5zY2hlZHVsZWRFdmVudElkfWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgIH0sXG4gICAgICAgIGludml0ZXM6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vaW52aXRlc2BcbiAgICAgICAgfSxcbiAgICAgICAgbGVhdmU6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvdXNlcnMvQG1lL2d1aWxkcy8ke2d1aWxkSWR9YFxuICAgICAgICB9LFxuICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgYmFuOiAoZ3VpbGRJZCwgdXNlcklkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9iYW5zLyR7dXNlcklkfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJhbnM6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9iYW5zP2BcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmJlZm9yZSkgdXJsICs9IGAmYmVmb3JlPSR7b3B0aW9ucy5iZWZvcmV9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBib3Q6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzL0BtZWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbWJlcjogKGd1aWxkSWQsIHVzZXJJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy8ke3VzZXJJZH1gXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiAoZ3VpbGRJZCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycz9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICBpZiAob3B0aW9ucy5saW1pdCkgdXJsICs9IGBsaW1pdD0ke29wdGlvbnMubGltaXR9YFxuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmFmdGVyKSB1cmwgKz0gYCZhZnRlcj0ke29wdGlvbnMuYWZ0ZXJ9YFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXJsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWFyY2g6IChndWlsZElkLCBxdWVyeSwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgbGV0IHVybCA9IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWVtYmVycy9zZWFyY2g/cXVlcnk9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWBcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXQgIT09IHVuZGVmaW5lZCkgdXJsICs9IGAmbGltaXQ9JHtvcHRpb25zLmxpbWl0fWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJ1bmU6IChndWlsZElkLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9wcnVuZT9gXG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF5cykgdXJsICs9IGBkYXlzPSR7b3B0aW9ucy5kYXlzfWBcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucy5pbmNsdWRlUm9sZXMpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlcy5qb2luKCcsJyl9YFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuaW5jbHVkZVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlc31gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1mYTogKGd1aWxkSWQpID0+IGAvZ3VpbGRzLyR7Z3VpbGRJZH0vbWZhYCxcbiAgICAgICAgcHJldmlldzogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9wcmV2aWV3YFxuICAgICAgICB9LFxuICAgICAgICBwcnVuZTogKGd1aWxkSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgICBsZXQgdXJsID0gYC9ndWlsZHMvJHtndWlsZElkfS9wcnVuZT9gXG5cbiAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGF5cykgdXJsICs9IGBkYXlzPSR7b3B0aW9ucy5kYXlzfWBcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMuaW5jbHVkZVJvbGVzKSkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlcy5qb2luKCcsJyl9YFxuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmluY2x1ZGVSb2xlcykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgIHVybCArPSBgJmluY2x1ZGVfcm9sZXM9JHtvcHRpb25zLmluY2x1ZGVSb2xlc31gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICB9LFxuICAgICAgICByb2xlczoge1xuICAgICAgICAgIG9uZTogKGd1aWxkSWQsIHJvbGVJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXMvJHtyb2xlSWR9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYWxsOiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vcm9sZXNgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXI6IChndWlsZElkLCBtZW1iZXJJZCwgcm9sZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9tZW1iZXJzLyR7bWVtYmVySWR9L3JvbGVzLyR7cm9sZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdGlja2VyczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9zdGlja2Vyc2BcbiAgICAgICAgfSxcbiAgICAgICAgc3RpY2tlcjogKGd1aWxkSWQsIHN0aWNrZXJJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3N0aWNrZXJzLyR7c3RpY2tlcklkfWBcbiAgICAgICAgfSxcbiAgICAgICAgdm9pY2U6IChndWlsZElkLCB1c2VySWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS92b2ljZS1zdGF0ZXMvJHt1c2VySWQgPz8gJ0BtZSd9YFxuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgICBjb2RlOiAoY29kZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzL3RlbXBsYXRlcy8ke2NvZGV9YFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZ3VpbGQ6IChndWlsZElkLCBjb2RlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS90ZW1wbGF0ZXMvJHtjb2RlfWBcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFsbDogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3RlbXBsYXRlc2BcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB2YW5pdHk6IChndWlsZElkKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGAvZ3VpbGRzLyR7Z3VpbGRJZH0vdmFuaXR5LXVybGBcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaW9uczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS9yZWdpb25zYFxuICAgICAgICB9LFxuICAgICAgICB3ZWJob29rczogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS93ZWJob29rc2BcbiAgICAgICAgfSxcbiAgICAgICAgd2VsY29tZTogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS93ZWxjb21lLXNjcmVlbmBcbiAgICAgICAgfSxcbiAgICAgICAgd2lkZ2V0OiAoZ3VpbGRJZCkgPT4ge1xuICAgICAgICAgIHJldHVybiBgL2d1aWxkcy8ke2d1aWxkSWR9L3dpZGdldGBcbiAgICAgICAgfSxcbiAgICAgICAgd2lkZ2V0SnNvbjogKGd1aWxkSWQpID0+IHtcbiAgICAgICAgICByZXR1cm4gYC9ndWlsZHMvJHtndWlsZElkfS93aWRnZXQuanNvbmBcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIHN0aWNrZXI6IChzdGlja2VySWQ6IEJpZ1N0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYC9zdGlja2Vycy8ke3N0aWNrZXJJZH1gXG4gICAgICB9LFxuXG4gICAgICByZWdpb25zOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiAnL3ZvaWNlL3JlZ2lvbnMnXG4gICAgICB9LFxuXG4gICAgICAvLyBJbnRlcmFjdGlvbiBFbmRwb2ludHNcbiAgICAgIGludGVyYWN0aW9uczoge1xuICAgICAgICBjb21tYW5kczoge1xuICAgICAgICAgIC8vIEFwcGxpY2F0aW9uIEVuZHBvaW50c1xuICAgICAgICAgIGNvbW1hbmRzOiAoYXBwbGljYXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vY29tbWFuZHNgXG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGd1aWxkczoge1xuICAgICAgICAgICAgYWxsKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHNgXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvbmUoYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkLCB3aXRoTG9jYWxpemF0aW9ucykge1xuICAgICAgICAgICAgICBsZXQgdXJsID0gYC9hcHBsaWNhdGlvbnMvJHthcHBsaWNhdGlvbklkfS9ndWlsZHMvJHtndWlsZElkfS9jb21tYW5kcy8ke2NvbW1hbmRJZH0/YFxuXG4gICAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGB3aXRoX2xvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiB1cmxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwZXJtaXNzaW9uczogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2d1aWxkcy8ke2d1aWxkSWR9L2NvbW1hbmRzL3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGVybWlzc2lvbjogKGFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvYXBwbGljYXRpb25zLyR7YXBwbGljYXRpb25JZH0vZ3VpbGRzLyR7Z3VpbGRJZH0vY29tbWFuZHMvJHtjb21tYW5kSWR9L3Blcm1pc3Npb25zYFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29tbWFuZDogKGFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCwgd2l0aExvY2FsaXphdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwcGxpY2F0aW9ucy8ke2FwcGxpY2F0aW9uSWR9L2NvbW1hbmRzLyR7Y29tbWFuZElkfT9gXG5cbiAgICAgICAgICAgIGlmICh3aXRoTG9jYWxpemF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVybCArPSBgd2l0aExvY2FsaXphdGlvbnM9JHt3aXRoTG9jYWxpemF0aW9ucy50b1N0cmluZygpfWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHVybFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgLy8gSW50ZXJhY3Rpb24gRW5kcG9pbnRzXG4gICAgICAgICAgY2FsbGJhY2s6IChpbnRlcmFjdGlvbklkLCB0b2tlbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGAvaW50ZXJhY3Rpb25zLyR7aW50ZXJhY3Rpb25JZH0vJHt0b2tlbn0vY2FsbGJhY2tgXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbDogKGludGVyYWN0aW9uSWQsIHRva2VuKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2ludGVyYWN0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzL0BvcmlnaW5hbGBcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lc3NhZ2U6IChhcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYC93ZWJob29rcy8ke2FwcGxpY2F0aW9uSWR9LyR7dG9rZW59L21lc3NhZ2VzLyR7bWVzc2FnZUlkfWBcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLy8gVXNlciBlbmRwb2ludHNcbiAgICAgIHVzZXIodXNlcklkKSB7XG4gICAgICAgIHJldHVybiBgL3VzZXJzLyR7dXNlcklkfWBcbiAgICAgIH0sXG5cbiAgICAgIHVzZXJCb3QoKSB7XG4gICAgICAgIHJldHVybiAnL3VzZXJzL0BtZSdcbiAgICAgIH0sXG5cbiAgICAgIG9hdXRoMkFwcGxpY2F0aW9uKCkge1xuICAgICAgICByZXR1cm4gJ29hdXRoMi9hcHBsaWNhdGlvbnMvQG1lJ1xuICAgICAgfSxcblxuICAgICAgZ2F0ZXdheUJvdCgpIHtcbiAgICAgICAgcmV0dXJuICcvZ2F0ZXdheS9ib3QnXG4gICAgICB9LFxuXG4gICAgICBuaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgICAgcmV0dXJuICcvc3RpY2tlci1wYWNrcydcbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGNoZWNrUmF0ZUxpbWl0cyh1cmwpIHtcbiAgICAgIGNvbnN0IHJhdGVsaW1pdGVkID0gcmVzdC5yYXRlTGltaXRlZFBhdGhzLmdldCh1cmwpXG4gICAgICBjb25zdCBnbG9iYWwgPSByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZ2V0KCdnbG9iYWwnKVxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuXG4gICAgICBpZiAocmF0ZWxpbWl0ZWQgJiYgbm93IDwgcmF0ZWxpbWl0ZWQucmVzZXRUaW1lc3RhbXApIHtcbiAgICAgICAgcmV0dXJuIHJhdGVsaW1pdGVkLnJlc2V0VGltZXN0YW1wIC0gbm93XG4gICAgICB9XG5cbiAgICAgIGlmIChnbG9iYWwgJiYgbm93IDwgZ2xvYmFsLnJlc2V0VGltZXN0YW1wKSB7XG4gICAgICAgIHJldHVybiBnbG9iYWwucmVzZXRUaW1lc3RhbXAgLSBub3dcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSxcblxuICAgIGNoYW5nZVRvRGlzY29yZEZvcm1hdChvYmo6IGFueSk6IGFueSB7XG4gICAgICBpZiAob2JqID09PSBudWxsKSByZXR1cm4gbnVsbFxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICAgIHJldHVybiBvYmoubWFwKChpdGVtKSA9PiByZXN0LmNoYW5nZVRvRGlzY29yZEZvcm1hdChpdGVtKSlcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld09iajogYW55ID0ge31cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgICAgLy8gS2V5cyB0aGF0IGRvbnQgcmVxdWlyZSBzbmFrZSBjYXNpbmdcbiAgICAgICAgICBpZiAoWydwZXJtaXNzaW9ucycsICdhbGxvdycsICdkZW55J10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgbmV3T2JqW2tleV0gPSBjYWxjdWxhdGVCaXRzKG9ialtrZXldKVxuICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoa2V5ID09PSAnZGVmYXVsdE1lbWJlclBlcm1pc3Npb25zJykge1xuICAgICAgICAgICAgbmV3T2JqLmRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zID0gY2FsY3VsYXRlQml0cyhvYmpba2V5XSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdPYmpbY2FtZWxUb1NuYWtlQ2FzZShrZXkpXSA9IHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9ialtrZXldKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ld09ialxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ2JpZ2ludCcpIHJldHVybiBvYmoudG9TdHJpbmcoKVxuXG4gICAgICByZXR1cm4gb2JqXG4gICAgfSxcblxuICAgIGNyZWF0ZVJlcXVlc3Qob3B0aW9ucykge1xuICAgICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgRGlzY29yZEJvdCAoaHR0cHM6Ly9naXRodWIuY29tL2Rpc2NvcmRlbm8vZGlzY29yZGVubywgdiR7dmVyc2lvbn0pYCxcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnVuYXV0aG9yaXplZCkgaGVhZGVycy5hdXRob3JpemF0aW9uID0gYEJvdCAke3Jlc3QudG9rZW59YFxuXG4gICAgICAvLyBTT01FVElNRVMgU1BFQ0lBTCBIRUFERVJTIChFLkcuIENVU1RPTSBBVVRIT1JJWkFUSU9OKSBORUVEIFRPIEJFIFVTRURcbiAgICAgIGlmIChvcHRpb25zLmhlYWRlcnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb3B0aW9ucy5oZWFkZXJzKSB7XG4gICAgICAgICAgaGVhZGVyc1trZXkudG9Mb3dlckNhc2UoKV0gPSBvcHRpb25zLmhlYWRlcnNba2V5XVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEdFVCBNRVRIT0RTIFNIT1VMRCBOT1QgSEFWRSBBIEJPRFlcbiAgICAgIGlmIChvcHRpb25zLm1ldGhvZCA9PT0gJ0dFVCcpIHtcbiAgICAgICAgb3B0aW9ucy5ib2R5ID0gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIC8vIElGIEEgUkVBU09OIElTIFBST1ZJREVEIEVOQ09ERSBJVCBJTiBIRUFERVJTXG4gICAgICBpZiAob3B0aW9ucy5ib2R5Py5yZWFzb24pIHtcbiAgICAgICAgaGVhZGVyc1snWC1BdWRpdC1Mb2ctUmVhc29uJ10gPSBlbmNvZGVVUklDb21wb25lbnQob3B0aW9ucy5ib2R5LnJlYXNvbiBhcyBzdHJpbmcpXG4gICAgICAgIG9wdGlvbnMuYm9keS5yZWFzb24gPSB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuYm9keSkge1xuICAgICAgICBjb25zdCB7IGZpbGUgfSA9IG9wdGlvbnMuYm9keVxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gZmluZEZpbGVzKGZpbGUpXG4gICAgICAgICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtRGF0YSgpXG5cbiAgICAgICAgICAvLyBXSEVOIENSRUFUSU5HIEEgU1RJQ0tFUiwgRElTQ09SRCBXQU5UUyBGT1JNIERBVEEgT05MWVxuICAgICAgICAgIGlmIChvcHRpb25zLnVybD8uZW5kc1dpdGgoJy9zdGlja2VycycpICYmIG9wdGlvbnMubWV0aG9kID09PSAnUE9TVCcpIHtcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKCdmaWxlJywgZmlsZXNbMF0uYmxvYiwgZmlsZXNbMF0ubmFtZSlcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKCduYW1lJywgb3B0aW9ucy5ib2R5Lm5hbWUgYXMgc3RyaW5nKVxuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ2Rlc2NyaXB0aW9uJywgb3B0aW9ucy5ib2R5LmRlc2NyaXB0aW9uIGFzIHN0cmluZylcbiAgICAgICAgICAgIGZvcm0uYXBwZW5kKCd0YWdzJywgb3B0aW9ucy5ib2R5LnRhZ3MgYXMgc3RyaW5nKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIGZvcm0uYXBwZW5kKGBmaWxlJHtpfWAsIGZpbGVzW2ldLmJsb2IsIGZpbGVzW2ldLm5hbWUpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChmaWxlKSBvcHRpb25zLmJvZHkuZmlsZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgZm9ybS5hcHBlbmQoJ3BheWxvYWRfanNvbicsIEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIG9wdGlvbnMuYm9keS5maWxlID0gZm9ybVxuICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuYm9keSAmJiAhWydHRVQnLCAnREVMRVRFJ10uaW5jbHVkZXMob3B0aW9ucy5tZXRob2QpKSB7XG4gICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiAob3B0aW9ucy5ib2R5Py5maWxlID8/IEpTT04uc3RyaW5naWZ5KHJlc3QuY2hhbmdlVG9EaXNjb3JkRm9ybWF0KG9wdGlvbnMuYm9keSkpKSBhcyBGb3JtRGF0YSB8IHN0cmluZyxcbiAgICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMoKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG5cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5lbnRyaWVzKCkpIHtcbiAgICAgICAgLy8gICByZXN0LmRlYnVnKFxuICAgICAgICAvLyBgW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBmb3Igb2YgbG9vcC4gJHtcbiAgICAgICAgLy8gICB2YWx1ZS5yZXNldFRpbWVzdGFtcCAtIG5vd1xuICAgICAgICAvLyB9YFxuICAgICAgICAvLyAgIClcbiAgICAgICAgLy8gSWYgdGhlIHRpbWUgaGFzIG5vdCByZWFjaGVkIGNhbmNlbFxuICAgICAgICBpZiAodmFsdWUucmVzZXRUaW1lc3RhbXAgPiBub3cpIGNvbnRpbnVlXG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBvdmVyLCBkZWxldGUgdGhlIHJhdGUgbGltaXRlclxuICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuZGVsZXRlKGtleSlcbiAgICAgICAgLy8gSWYgaXQgd2FzIGdsb2JhbCwgYWxzbyBtYXJrIHRoZSBnbG9iYWwgdmFsdWUgYXMgZmFsc2VcbiAgICAgICAgaWYgKGtleSA9PT0gJ2dsb2JhbCcpIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICB9XG5cbiAgICAgIC8vIEFMTCBQQVRIUyBBUkUgQ0xFQVJFRCBDQU4gQ0FOQ0VMIE9VVCFcbiAgICAgIGlmIChyZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXN0LnByb2Nlc3NpbmdSYXRlTGltaXRlZFBhdGhzID0gZmFsc2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMgPSB0cnVlXG4gICAgICAgIC8vIFJFQ0hFQ0sgSU4gMSBTRUNPTkRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgLy8gcmVzdC5kZWJ1ZygnW1JFU1QgLSBwcm9jZXNzUmF0ZUxpbWl0ZWRQYXRoc10gUnVubmluZyBzZXRUaW1lb3V0LicpXG4gICAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICAgIH0sIDEwMDApXG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKiBQcm9jZXNzZXMgdGhlIHJhdGUgbGltaXQgaGVhZGVycyBhbmQgZGV0ZXJtaW5lcyBpZiBpdCBuZWVkcyB0byBiZSByYXRlIGxpbWl0ZWQgYW5kIHJldHVybnMgdGhlIGJ1Y2tldCBpZCBpZiBhdmFpbGFibGUgKi9cbiAgICBwcm9jZXNzSGVhZGVycyh1cmwsIGhlYWRlcnMpIHtcbiAgICAgIGxldCByYXRlTGltaXRlZCA9IGZhbHNlXG5cbiAgICAgIC8vIEdFVCBBTEwgTkVDRVNTQVJZIEhFQURFUlNcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZW1haW5pbmcnKVxuICAgICAgY29uc3QgcmV0cnlBZnRlciA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcicpXG4gICAgICBjb25zdCByZXNldCA9IERhdGUubm93KCkgKyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwXG4gICAgICBjb25zdCBnbG9iYWwgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtZ2xvYmFsJylcbiAgICAgIC8vIHVuZGVmaW5lZCBvdmVycmlkZSBudWxsIG5lZWRlZCBmb3IgdHlwaW5nc1xuICAgICAgY29uc3QgYnVja2V0SWQgPSBoZWFkZXJzLmdldCgneC1yYXRlbGltaXQtYnVja2V0JykgPz8gdW5kZWZpbmVkXG4gICAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1saW1pdCcpXG5cbiAgICAgIHJlc3QucXVldWVzLmdldCh1cmwpPy5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHtcbiAgICAgICAgcmVtYWluaW5nOiByZW1haW5pbmcgPyBOdW1iZXIocmVtYWluaW5nKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW50ZXJ2YWw6IHJldHJ5QWZ0ZXIgPyBOdW1iZXIocmV0cnlBZnRlcikgKiAxMDAwIDogdW5kZWZpbmVkLFxuICAgICAgICBtYXg6IGxpbWl0ID8gTnVtYmVyKGxpbWl0KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pXG5cbiAgICAgIC8vIElGIFRIRVJFIElTIE5PIFJFTUFJTklORyBSQVRFIExJTUlULCBNQVJLIElUIEFTIFJBVEUgTElNSVRFRFxuICAgICAgaWYgKHJlbWFpbmluZyA9PT0gJzAnKSB7XG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIC8vIFNBVkUgVEhFIFVSTCBBUyBMSU1JVEVELCBJTVBPUlRBTlQgRk9SIE5FVyBSRVFVRVNUUyBCWSBVU0VSIFdJVEhPVVQgQlVDS0VUXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQodXJsLCB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiByZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTQVZFIFRIRSBCVUNLRVQgQVMgTElNSVRFRCBTSU5DRSBESUZGRVJFTlQgVVJMUyBNQVkgU0hBUkUgQSBCVUNLRVRcbiAgICAgICAgaWYgKGJ1Y2tldElkKSB7XG4gICAgICAgICAgcmVzdC5yYXRlTGltaXRlZFBhdGhzLnNldChidWNrZXRJZCwge1xuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IHJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJRiBUSEVSRSBJUyBOTyBSRU1BSU5JTkcgR0xPQkFMIExJTUlULCBNQVJLIElUIFJBVEUgTElNSVRFRCBHTE9CQUxMWVxuICAgICAgaWYgKGdsb2JhbCkge1xuICAgICAgICBjb25zdCByZXRyeUFmdGVyID0gaGVhZGVycy5nZXQoJ3JldHJ5LWFmdGVyJylcbiAgICAgICAgY29uc3QgZ2xvYmFsUmVzZXQgPSBEYXRlLm5vdygpICsgTnVtYmVyKHJldHJ5QWZ0ZXIpICogMTAwMFxuICAgICAgICAvLyAgIHJlc3QuZGVidWcoXG4gICAgICAgIC8vIGBbUkVTVCA9IEdsb2JhbGx5IFJhdGUgTGltaXRlZF0gVVJMOiAke3VybH0gfCBHbG9iYWwgUmVzdDogJHtnbG9iYWxSZXNldH1gXG4gICAgICAgIC8vICAgKVxuICAgICAgICByZXN0Lmdsb2JhbGx5UmF0ZUxpbWl0ZWQgPSB0cnVlXG4gICAgICAgIHJhdGVMaW1pdGVkID0gdHJ1ZVxuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc3QuZ2xvYmFsbHlSYXRlTGltaXRlZCA9IGZhbHNlXG4gICAgICAgIH0sIGdsb2JhbFJlc2V0KVxuXG4gICAgICAgIHJlc3QucmF0ZUxpbWl0ZWRQYXRocy5zZXQoJ2dsb2JhbCcsIHtcbiAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgIHJlc2V0VGltZXN0YW1wOiBnbG9iYWxSZXNldCxcbiAgICAgICAgICBidWNrZXRJZCxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoYnVja2V0SWQpIHtcbiAgICAgICAgICByZXN0LnJhdGVMaW1pdGVkUGF0aHMuc2V0KGJ1Y2tldElkLCB7XG4gICAgICAgICAgICB1cmw6ICdnbG9iYWwnLFxuICAgICAgICAgICAgcmVzZXRUaW1lc3RhbXA6IGdsb2JhbFJlc2V0LFxuICAgICAgICAgICAgYnVja2V0SWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmF0ZUxpbWl0ZWQgJiYgIXJlc3QucHJvY2Vzc2luZ1JhdGVMaW1pdGVkUGF0aHMpIHtcbiAgICAgICAgcmVzdC5wcm9jZXNzUmF0ZUxpbWl0ZWRQYXRocygpXG4gICAgICB9XG4gICAgICByZXR1cm4gcmF0ZUxpbWl0ZWQgPyBidWNrZXRJZCA6IHVuZGVmaW5lZFxuICAgIH0sXG5cbiAgICBhc3luYyBzZW5kUmVxdWVzdChvcHRpb25zKSB7XG4gICAgICBjb25zdCB1cmwgPSBvcHRpb25zLnVybC5zdGFydHNXaXRoKCdodHRwczovLycpID8gb3B0aW9ucy51cmwgOiBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0ke29wdGlvbnMudXJsfWBcbiAgICAgIGNvbnN0IHBheWxvYWQgPSByZXN0LmNyZWF0ZVJlcXVlc3QoeyBtZXRob2Q6IG9wdGlvbnMubWV0aG9kLCB1cmw6IG9wdGlvbnMudXJsLCBib2R5OiBvcHRpb25zLmJvZHksIC4uLm9wdGlvbnMub3B0aW9ucyB9KVxuXG4gICAgICBsb2dnZXIuZGVidWcoYHNlbmRpbmcgcmVxdWVzdCB0byAke3VybH1gLCAnd2l0aCBwYXlsb2FkOicsIHsgLi4ucGF5bG9hZCwgaGVhZGVyczogeyAuLi5wYXlsb2FkLmhlYWRlcnMsIGF1dGhvcml6YXRpb246ICdCb3QgdG9rZW5oZXJlJyB9IH0pXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZClcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgcmVxdWVzdCBmZXRjaGVkIGZyb20gJHt1cmx9IHdpdGggc3RhdHVzICR7cmVzcG9uc2Uuc3RhdHVzfSAmICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKVxuXG4gICAgICAvLyBTZXQgdGhlIGJ1Y2tldCBpZCBpZiBpdCB3YXMgYXZhaWxhYmxlIG9uIHRoZSBoZWFkZXJzXG4gICAgICBjb25zdCBidWNrZXRJZCA9IHJlc3QucHJvY2Vzc0hlYWRlcnMocmVzdC5zaW1wbGlmeVVybChvcHRpb25zLnVybCwgb3B0aW9ucy5tZXRob2QpLCByZXNwb25zZS5oZWFkZXJzKVxuICAgICAgaWYgKGJ1Y2tldElkKSBvcHRpb25zLmJ1Y2tldElkID0gYnVja2V0SWRcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgUmVxdWVzdCB0byAke3VybH0gZmFpbGVkLmApXG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDI5KSB7XG4gICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSB3YXMgcmF0ZWxpbWl0ZWQuYClcbiAgICAgICAgICAvLyBUb28gbWFueSBhdHRlbXB0cywgZ2V0IHJpZCBvZiByZXF1ZXN0IGZyb20gcXVldWUuXG4gICAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlDb3VudCsrID49IHJlc3QubWF4UmV0cnlDb3VudCkge1xuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBSZXF1ZXN0IHRvICR7dXJsfSBleGNlZWRlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHJldHJpZXMuYCwgJ3dpdGggcGF5bG9hZDonLCBwYXlsb2FkKVxuICAgICAgICAgICAgLy8gcmVzdC5kZWJ1ZyhgW1JFU1QgLSBSZXRyaWVzTWF4ZWRdICR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucyl9YClcbiAgICAgICAgICAgIC8vIFJlbW92ZSBpdGVtIGZyb20gcXVldWUgdG8gcHJldmVudCByZXRyeVxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMucmVqZWN0KHtcbiAgICAgICAgICAgICAgb2s6IGZhbHNlLFxuICAgICAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICAgICAgZXJyb3I6ICdUaGUgb3B0aW9ucyB3YXMgcmF0ZSBsaW1pdGVkIGFuZCBpdCBtYXhlZCBvdXQgdGhlIHJldHJpZXMgbGltaXQuJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmF0ZSBsaW1pdGVkLCBhZGQgYmFjayB0byBxdWV1ZVxuICAgICAgICAgIHJlc3QuaW52YWxpZEJ1Y2tldC5oYW5kbGVDb21wbGV0ZWRSZXF1ZXN0KHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1gtUmF0ZUxpbWl0LVNjb3BlJykgPT09ICdzaGFyZWQnKVxuXG4gICAgICAgICAgY29uc3QgcmVzZXRBZnRlciA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCd4LXJhdGVsaW1pdC1yZXNldC1hZnRlcicpXG4gICAgICAgICAgaWYgKHJlc2V0QWZ0ZXIpIGF3YWl0IGRlbGF5KE51bWJlcihyZXNldEFmdGVyKSAqIDEwMDApXG4gICAgICAgICAgLy8gcHJvY2VzcyB0aGUgcmVzcG9uc2UgdG8gcHJldmVudCBtZW0gbGVha1xuICAgICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKVxuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IG9wdGlvbnMucmV0cnlSZXF1ZXN0Py4ob3B0aW9ucylcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLnJlamVjdCh7IG9rOiBmYWxzZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIGJvZHk6IEpTT04uc3RyaW5naWZ5KGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXMyMDQgPSByZXNwb25zZS5zdGF0dXMgPT09IDIwNFxuICAgICAgY29uc3QganNvbiA9IGlzMjA0ID8gdW5kZWZpbmVkIDogYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgICAvLyBEaXNjb3JkIHNvbWV0aW1lcyBzZW5kcyBubyByZXNwb25zZSB3aXRoIDIwNCBjb2RlXG4gICAgICByZXR1cm4gb3B0aW9ucy5yZXNvbHZlKHsgb2s6IHRydWUsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLCBib2R5OiBKU09OLnN0cmluZ2lmeShqc29uKSB9KVxuICAgIH0sXG5cbiAgICAvLyBDcmVkaXRzOiBnaXRodWIuY29tL2FiYWxhYmFoYWhhL2VyaXMgbGliL3Jlc3QvUmVxdWVzdEhhbmRsZXIuanMjTDM5N1xuICAgIC8vIE1vZGlmaWVkIGZvciBvdXIgdXNlLWNhc2VcbiAgICBzaW1wbGlmeVVybCh1cmwsIG1ldGhvZCkge1xuICAgICAgbGV0IHJvdXRlID0gdXJsXG4gICAgICAgIC5yZXBsYWNlKC9cXC8oW2Etei1dKylcXC8oPzpbMC05XXsxNywxOX0pL2csIGZ1bmN0aW9uIChtYXRjaCwgcDogc3RyaW5nKSB7XG4gICAgICAgICAgcmV0dXJuIFsnY2hhbm5lbHMnLCAnZ3VpbGRzJ10uaW5jbHVkZXMocCkgPyBtYXRjaCA6IGAvJHtwfS94YFxuICAgICAgICB9KVxuICAgICAgICAucmVwbGFjZSgvXFwvcmVhY3Rpb25zXFwvW14vXSsvZywgJy9yZWFjdGlvbnMveCcpXG5cbiAgICAgIC8vIEdFTkVSQUwgL3JlYWN0aW9ucyBhbmQgL3JlYWN0aW9ucy9lbW9qaS9AbWUgc2hhcmUgdGhlIGJ1Y2tldHNcbiAgICAgIGlmIChyb3V0ZS5pbmNsdWRlcygnL3JlYWN0aW9ucycpKSB7XG4gICAgICAgIHJvdXRlID0gcm91dGUuc3Vic3RyaW5nKDAsIHJvdXRlLmluZGV4T2YoJy9yZWFjdGlvbnMnKSArICcvcmVhY3Rpb25zJy5sZW5ndGgpXG4gICAgICB9XG5cbiAgICAgIC8vIERlbGV0ZSBNZXNzYWdlIGVuZHBvaW50IGhhcyBpdHMgb3duIHJhdGUgbGltaXRcbiAgICAgIGlmIChtZXRob2QgPT09ICdERUxFVEUnICYmIHJvdXRlLmVuZHNXaXRoKCcvbWVzc2FnZXMveCcpKSB7XG4gICAgICAgIHJvdXRlID0gbWV0aG9kICsgcm91dGVcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJvdXRlXG4gICAgfSxcblxuICAgIHByb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IFNlbmRSZXF1ZXN0T3B0aW9ucykge1xuICAgICAgY29uc3Qgcm91dGUgPSByZXF1ZXN0LnVybC5zdWJzdHJpbmcocmVxdWVzdC51cmwuaW5kZXhPZignYXBpLycpKVxuICAgICAgY29uc3QgcGFydHMgPSByb3V0ZS5zcGxpdCgnLycpXG4gICAgICAvLyBSZW1vdmUgdGhlIGFwaS9cbiAgICAgIHBhcnRzLnNoaWZ0KClcbiAgICAgIC8vIFJlbW92ZXMgdGhlIC92Iy9cbiAgICAgIGlmIChwYXJ0c1swXT8uc3RhcnRzV2l0aCgndicpKSBwYXJ0cy5zaGlmdCgpXG4gICAgICAvLyBTZXQgdGhlIGZ1bGwgdXJsIHRvIGRpc2NvcmQgYXBpIGluIGNhc2UgaXQgd2FzIHJlY2lldmVkIGluIGEgcHJveHkgcmVzdFxuICAgICAgcmVxdWVzdC51cmwgPSBgJHtyZXN0LmJhc2VVcmx9L3Yke3Jlc3QudmVyc2lvbn0vJHtwYXJ0cy5qb2luKCcvJyl9YFxuXG4gICAgICBjb25zdCB1cmwgPSByZXN0LnNpbXBsaWZ5VXJsKHJlcXVlc3QudXJsLCByZXF1ZXN0Lm1ldGhvZClcbiAgICAgIGNvbnN0IHF1ZXVlID0gcmVzdC5xdWV1ZXMuZ2V0KHVybClcblxuICAgICAgaWYgKHF1ZXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcXVldWUubWFrZVJlcXVlc3QocmVxdWVzdClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENSRUFURVMgQSBORVcgUVVFVUVcbiAgICAgICAgY29uc3QgYnVja2V0UXVldWUgPSBuZXcgUXVldWUocmVzdCwgeyB1cmwsIGRlbGV0ZVF1ZXVlRGVsYXk6IHJlc3QuZGVsZXRlUXVldWVEZWxheSB9KVxuXG4gICAgICAgIC8vIEFkZCByZXF1ZXN0IHRvIHF1ZXVlXG4gICAgICAgIGJ1Y2tldFF1ZXVlLm1ha2VSZXF1ZXN0KHJlcXVlc3QpXG4gICAgICAgIC8vIFNhdmUgcXVldWVcbiAgICAgICAgcmVzdC5xdWV1ZXMuc2V0KHVybCwgYnVja2V0UXVldWUpXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIG1ha2VSZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBTZW5kUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICBib2R5LFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICByZXN0LnByb2Nlc3NSZXF1ZXN0KHBheWxvYWQpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiAoZGF0YSkgPT4gcmVzb2x2ZShkYXRhLnN0YXR1cyAhPT0gMjA0ID8gSlNPTi5wYXJzZShkYXRhLmJvZHkgPz8gJ3t9JykgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdC5wcm9jZXNzUmVxdWVzdChwYXlsb2FkKVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdHRVQnLCB1cmwpKSBhcyBDYW1lbGl6ZTxUPlxuICAgIH0sXG5cbiAgICBhc3luYyBwb3N0PFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUE9TVCcsIHVybCwgYm9keSkpIGFzIENhbWVsaXplPFQ+XG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZSh1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICAgIHJldHVybiBjYW1lbGl6ZShhd2FpdCByZXN0Lm1ha2VSZXF1ZXN0KCdERUxFVEUnLCB1cmwsIGJvZHkpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwYXRjaDxUID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KHVybDogc3RyaW5nLCBib2R5PzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgICAgcmV0dXJuIGNhbWVsaXplKGF3YWl0IHJlc3QubWFrZVJlcXVlc3QoJ1BBVENIJywgdXJsLCBib2R5KSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgcHV0PFQgPSB2b2lkPih1cmw6IHN0cmluZywgYm9keT86IFJlY29yZDxzdHJpbmcsIGFueT4sIG9wdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gY2FtZWxpemUoYXdhaXQgcmVzdC5tYWtlUmVxdWVzdCgnUFVUJywgdXJsLCBib2R5LCBvcHRpb25zKSkgYXMgQ2FtZWxpemU8VD5cbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb24oY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSB7XG4gICAgICByZWFjdGlvbiA9IHByb2Nlc3NSZWFjdGlvblN0cmluZyhyZWFjdGlvbilcblxuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5ib3QoY2hhbm5lbElkLCBtZXNzYWdlSWQsIHJlYWN0aW9uKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgYWRkUmVhY3Rpb25zKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbnMsIG9yZGVyZWQgPSBmYWxzZSkge1xuICAgICAgaWYgKCFvcmRlcmVkKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHJlYWN0aW9ucy5tYXAoYXN5bmMgKHJlYWN0aW9uKSA9PiBhd2FpdCByZXN0LmFkZFJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCByZWFjdGlvbiBvZiByZWFjdGlvbnMpIHtcbiAgICAgICAgYXdhaXQgcmVzdC5hZGRSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pXG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGFkZFJvbGUoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByb2xlSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBhZGRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVBdXRvbW9kUnVsZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVDaGFubmVsKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmd1aWxkcy5jaGFubmVscyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlRW1vamkoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkRW1vamk+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kcyhyZXN0LmFwcGxpY2F0aW9uSWQpLCBjb21tYW5kKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZChvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmFsbCgpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kLCBndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIGNvbW1hbmQpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlKHRlbXBsYXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuaWNvbikge1xuICAgICAgICBvcHRpb25zLmljb24gPSBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmljb24pXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZEd1aWxkPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0aWNrZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5zdGlja2VycyhndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGNyZWF0ZUZvcnVtVGhyZWFkKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuZm9ydW0oY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlSW52aXRlKGNoYW5uZWxJZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRJbnZpdGU+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmludml0ZXMoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlUm9sZShndWlsZElkLCBvcHRpb25zLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFJvbGU+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgcmVhc29uLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgY3JlYXRlU2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkU2NoZWR1bGVkRXZlbnQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ldmVudHMuZXZlbnRzKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVTdGFnZUluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3Q8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlcygpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBjcmVhdGVXZWJob29rKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMud2ViaG9va3MoY2hhbm5lbElkKSwge1xuICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgIGF2YXRhcjogb3B0aW9ucy5hdmF0YXIgPyBhd2FpdCB1cmxUb0Jhc2U2NChvcHRpb25zLmF2YXRhcikgOiB1bmRlZmluZWQsXG4gICAgICAgIHJlYXNvbjogb3B0aW9ucy5yZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlQ2hhbm5lbChjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlKGNoYW5uZWxJZCwgb3ZlcndyaXRlSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG92ZXJ3cml0ZUlkKSwgcmVhc29uID8geyByZWFzb24gfSA6IHVuZGVmaW5lZClcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlRW1vamkoZ3VpbGRJZCwgaWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaShndWlsZElkLCBpZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5tZXNzYWdlKHJlc3QuYXBwbGljYXRpb25JZCwgdG9rZW4sIG1lc3NhZ2VJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuZ3VpbGQoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRTdGlja2VyKGd1aWxkSWQsIHN0aWNrZXJJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgcmVhc29uID8geyByZWFzb24gfSA6IHVuZGVmaW5lZClcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlR3VpbGRUZW1wbGF0ZShndWlsZElkLCB0ZW1wbGF0ZUNvZGUpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmd1aWxkKGd1aWxkSWQsIHRlbXBsYXRlQ29kZSkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludGVncmF0aW9uKGd1aWxkSWQsIGludGVncmF0aW9uSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb24oZ3VpbGRJZCwgaW50ZWdyYXRpb25JZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZUludml0ZShpbnZpdGVDb2RlLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMuaW52aXRlKGludml0ZUNvZGUpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSwgeyByZWFzb24gfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlTWVzc2FnZXMoY2hhbm5lbElkLCBtZXNzYWdlSWRzLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBvc3QocmVzdC5yb3V0ZXMuY2hhbm5lbHMuYnVsayhjaGFubmVsSWQpLCB7XG4gICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlSWRzLnNsaWNlKDAsIDEwMCkubWFwKChpZCkgPT4gaWQudG9TdHJpbmcoKSksXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSh0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZU93blJlYWN0aW9uKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMuYm90KGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJlYWN0aW9uc0FsbChjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnJlYWN0aW9ucy5hbGwoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVSZWFjdGlvbnNFbW9qaShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24pIHtcbiAgICAgIHJlYWN0aW9uID0gcHJvY2Vzc1JlYWN0aW9uU3RyaW5nKHJlYWN0aW9uKVxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMucmVhY3Rpb25zLmVtb2ppKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFjdGlvbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVJvbGUoZ3VpbGRJZCwgcm9sZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm9uZShndWlsZElkLCByb2xlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy5ldmVudChndWlsZElkLCBldmVudElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZGVsZXRlU3RhZ2VJbnN0YW5jZShjaGFubmVsSWQsIHJlYXNvbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHJlYXNvbiA/IHsgcmVhc29uIH0gOiB1bmRlZmluZWQpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVVzZXJSZWFjdGlvbihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgdXNlcklkLCByZWFjdGlvbikge1xuICAgICAgcmVhY3Rpb24gPSBwcm9jZXNzUmVhY3Rpb25TdHJpbmcocmVhY3Rpb24pXG5cbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMudXNlcihjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2sod2ViaG9va0lkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpLCB7IHJlYXNvbiB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBkZWxldGVXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGRlbGV0ZVdlYmhvb2tXaXRoVG9rZW4od2ViaG9va0lkLCB0b2tlbikge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLndlYmhvb2tzLndlYmhvb2sod2ViaG9va0lkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyhndWlsZElkLCBjb21tYW5kSWQsIGJlYXJlclRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wdXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb24ocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICB7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBoZWFkZXJzOiB7IGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtiZWFyZXJUb2tlbn1gIH0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRBdXRvbW9kUnVsZShndWlsZElkLCBydWxlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdFByb2ZpbGUob3B0aW9ucykge1xuICAgICAgY29uc3QgYXZhdGFyID0gb3B0aW9ucz8uYm90QXZhdGFyVVJMID8gYXdhaXQgdXJsVG9CYXNlNjQob3B0aW9ucz8uYm90QXZhdGFyVVJMKSA6IG9wdGlvbnM/LmJvdEF2YXRhclVSTFxuXG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkVXNlcj4ocmVzdC5yb3V0ZXMudXNlckJvdCgpLCB7XG4gICAgICAgIHVzZXJuYW1lOiBvcHRpb25zLnVzZXJuYW1lPy50cmltKCksXG4gICAgICAgIGF2YXRhcixcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRDaGFubmVsKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmNoYW5uZWwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdENoYW5uZWxQZXJtaXNzaW9uT3ZlcnJpZGVzKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0KHJlc3Qucm91dGVzLmNoYW5uZWxzLm92ZXJ3cml0ZShjaGFubmVsSWQsIG9wdGlvbnMuaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Q2hhbm5lbFBvc2l0aW9ucyhndWlsZElkLCBjaGFubmVsUG9zaXRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaChyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCksIGNoYW5uZWxQb3NpdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRFbW9qaShndWlsZElkLCBpZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgaWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Rm9sbG93dXBNZXNzYWdlKHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMucmVzcG9uc2VzLm1lc3NhZ2UocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbiwgbWVzc2FnZUlkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5jb21tYW5kKHJlc3QuYXBwbGljYXRpb25JZCwgY29tbWFuZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRHdWlsZD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmd1aWxkKGd1aWxkSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmQoY29tbWFuZElkLCBndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihcbiAgICAgICAgcmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmd1aWxkcy5vbmUocmVzdC5hcHBsaWNhdGlvbklkLCBndWlsZElkLCBjb21tYW5kSWQpLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0R3VpbGRNZmFMZXZlbChndWlsZElkOiBCaWdTdHJpbmcsIG1mYUxldmVsOiBNZmFMZXZlbHMsIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5ndWlsZHMubWZhKGd1aWxkSWQpLCB7IGxldmVsOiBtZmFMZXZlbCwgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRHdWlsZFN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEd1aWxkVGVtcGxhdGUoZ3VpbGRJZCwgdGVtcGxhdGVDb2RlOiBzdHJpbmcsIG9wdGlvbnM6IE1vZGlmeUd1aWxkVGVtcGxhdGUpOiBQcm9taXNlPENhbWVsaXplPERpc2NvcmRUZW1wbGF0ZT4+IHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5ndWlsZChndWlsZElkLCB0ZW1wbGF0ZUNvZGUpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0TWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLnJlc3BvbnNlcy5vcmlnaW5hbChyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2Uod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLndlYmhvb2tzLm9yaWdpbmFsKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpLCB7XG4gICAgICAgIHR5cGU6IEludGVyYWN0aW9uUmVzcG9uc2VUeXBlcy5VcGRhdGVNZXNzYWdlLFxuICAgICAgICBkYXRhOiBvcHRpb25zLFxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdE93blZvaWNlU3RhdGUoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2gocmVzdC5yb3V0ZXMuZ3VpbGRzLnZvaWNlKGd1aWxkSWQpLCB7XG4gICAgICAgIGNoYW5uZWxfaWQ6IG9wdGlvbnMuY2hhbm5lbElkLFxuICAgICAgICBzdXBwcmVzczogb3B0aW9ucy5zdXBwcmVzcyxcbiAgICAgICAgcmVxdWVzdF90b19zcGVha190aW1lc3RhbXA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXBcbiAgICAgICAgICA/IG5ldyBEYXRlKG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXApLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICA6IG9wdGlvbnMucmVxdWVzdFRvU3BlYWtUaW1lc3RhbXAsXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0U2NoZWR1bGVkRXZlbnQoZ3VpbGRJZCwgZXZlbnRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0Um9sZShndWlsZElkLCByb2xlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMub25lKGd1aWxkSWQsIHJvbGVJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRSb2xlUG9zaXRpb25zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRSb2xlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yb2xlcy5hbGwoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRTdGFnZUluc3RhbmNlKGNoYW5uZWxJZCwgZGF0YSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFN0YWdlSW5zdGFuY2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnN0YWdlKGNoYW5uZWxJZCksIHsgdG9waWM6IGRhdGEudG9waWMgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdFVzZXJWb2ljZVN0YXRlKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoKHJlc3Qucm91dGVzLmd1aWxkcy52b2ljZShndWlsZElkLCBvcHRpb25zLnVzZXJJZCksIHtcbiAgICAgICAgY2hhbm5lbF9pZDogb3B0aW9ucy5jaGFubmVsSWQsXG4gICAgICAgIHN1cHByZXNzOiBvcHRpb25zLnN1cHByZXNzLFxuICAgICAgICB1c2VyX2lkOiBvcHRpb25zLnVzZXJJZCxcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rKHdlYmhvb2tJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucGF0Y2g8RGlzY29yZFdlYmhvb2s+KHJlc3Qucm91dGVzLndlYmhvb2tzLmlkKHdlYmhvb2tJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy53ZWJob29rcy5tZXNzYWdlKHdlYmhvb2tJZCwgdG9rZW4sIG1lc3NhZ2VJZCwgb3B0aW9ucyksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnBhdGNoPERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy53ZWJob29rKHdlYmhvb2tJZCwgdG9rZW4pLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBlZGl0V2VsY29tZVNjcmVlbihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkV2VsY29tZVNjcmVlbj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlbGNvbWUoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRXaWRnZXRTZXR0aW5ncyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZXhlY3V0ZVdlYmhvb2sod2ViaG9va0lkLCB0b2tlbiwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuLCBvcHRpb25zKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZm9sbG93QW5ub3VuY2VtZW50KHNvdXJjZUNoYW5uZWxJZCwgdGFyZ2V0Q2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRGb2xsb3dlZENoYW5uZWw+KHJlc3Qucm91dGVzLmNoYW5uZWxzLmZvbGxvdyhzb3VyY2VDaGFubmVsSWQpLCB7XG4gICAgICAgIHdlYmhvb2tfY2hhbm5lbF9pZDogdGFyZ2V0Q2hhbm5lbElkLFxuICAgICAgfSBhcyBEaXNjb3JkRm9sbG93QW5ub3VuY2VtZW50Q2hhbm5lbClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QWN0aXZlVGhyZWFkcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBY3RpdmVUaHJlYWRzPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLmFjdGl2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbihndWlsZElkLCBjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnM+KFxuICAgICAgICByZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMucGVybWlzc2lvbihyZXN0LmFwcGxpY2F0aW9uSWQsIGd1aWxkSWQsIGNvbW1hbmRJZCksXG4gICAgICApXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb25zKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kUGVybWlzc2lvbnNbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLnBlcm1pc3Npb25zKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEFwcGxpY2F0aW9uSW5mbygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb24+KHJlc3Qucm91dGVzLm9hdXRoMkFwcGxpY2F0aW9uKCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1ZGl0TG9nKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXVkaXRMb2c+KHJlc3Qucm91dGVzLmd1aWxkcy5hdWRpdGxvZ3MoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEF1dG9tb2RSdWxlKGd1aWxkSWQsIHJ1bGVJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBdXRvTW9kZXJhdGlvblJ1bGU+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGUoZ3VpbGRJZCwgcnVsZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QXV0b21vZFJ1bGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXV0b01vZGVyYXRpb25SdWxlW10+KHJlc3Qucm91dGVzLmd1aWxkcy5hdXRvbW9kLnJ1bGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLnJlZ2lvbnMoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0QmFuKGd1aWxkSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRCYW4+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbihndWlsZElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRCYW5zKGd1aWxkSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQmFuW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLmJhbnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWwoaWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY2hhbm5lbChpZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxJbnZpdGVzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5pbnZpdGVzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQ2hhbm5lbFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuY2hhbm5lbHMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldENoYW5uZWxXZWJob29rcyhjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9va1tdPihyZXN0LnJvdXRlcy5jaGFubmVscy53ZWJob29rcyhjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXREbUNoYW5uZWwodXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy5kbSgpLCB7XG4gICAgICAgIHJlY2lwaWVudF9pZDogdXNlcklkLnRvU3RyaW5nKCksXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRFbW9qaShndWlsZElkLCBlbW9qaUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppPihyZXN0LnJvdXRlcy5ndWlsZHMuZW1vamkoZ3VpbGRJZCwgZW1vamlJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEVtb2ppcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEVtb2ppW10+KHJlc3Qucm91dGVzLmd1aWxkcy5lbW9qaXMoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEZvbGxvd3VwTWVzc2FnZSh0b2tlbiwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMubWVzc2FnZShyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRHYXRld2F5Qm90KCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHZXRHYXRld2F5Qm90PihyZXN0LnJvdXRlcy5nYXRld2F5Qm90KCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZChjb21tYW5kSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZChyZXN0LmFwcGxpY2F0aW9uSWQsIGNvbW1hbmRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEdsb2JhbEFwcGxpY2F0aW9uQ29tbWFuZHMoKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEFwcGxpY2F0aW9uQ29tbWFuZFtdPihyZXN0LnJvdXRlcy5pbnRlcmFjdGlvbnMuY29tbWFuZHMuY29tbWFuZHMocmVzdC5hcHBsaWNhdGlvbklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGQoZ3VpbGRJZCwgb3B0aW9ucyA9IHsgY291bnRzOiB0cnVlIH0pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGQ+KHJlc3Qucm91dGVzLmd1aWxkcy5ndWlsZChndWlsZElkLCBvcHRpb25zLmNvdW50cykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kKGNvbW1hbmRJZCwgZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmQ+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMub25lKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCwgY29tbWFuZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRBcHBsaWNhdGlvbkNvbW1hbmRzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkUHJldmlldyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEd1aWxkUHJldmlldz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnByZXZpZXcoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkVGVtcGxhdGUodGVtcGxhdGVDb2RlKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFRlbXBsYXRlPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmNvZGUodGVtcGxhdGVDb2RlKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRUZW1wbGF0ZXMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUZW1wbGF0ZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMudGVtcGxhdGVzLmFsbChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRXZWJob29rcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlYmhvb2tbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndlYmhvb2tzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnRlZ3JhdGlvbnMoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnRlZ3JhdGlvbltdPihyZXN0LnJvdXRlcy5ndWlsZHMuaW50ZWdyYXRpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRJbnZpdGUoaW52aXRlQ29kZSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRJbnZpdGVNZXRhZGF0YT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmludml0ZShpbnZpdGVDb2RlLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0SW52aXRlcyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZEludml0ZU1ldGFkYXRhW10+KHJlc3Qucm91dGVzLmd1aWxkcy5pbnZpdGVzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmNoYW5uZWxzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZVtdPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXROaXRyb1N0aWNrZXJQYWNrcygpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlclBhY2tbXT4ocmVzdC5yb3V0ZXMubml0cm9TdGlja2VyUGFja3MoKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlKHRva2VuKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lc3NhZ2U+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMub3JpZ2luYWwocmVzdC5hcHBsaWNhdGlvbklkLCB0b2tlbikpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBpbm5lZE1lc3NhZ2VzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZXNzYWdlW10+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnBpbnMoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0UHJpdmF0ZUFyY2hpdmVkVGhyZWFkcyhjaGFubmVsSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTGlzdEFyY2hpdmVkVGhyZWFkcz4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5wcml2YXRlKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFByaXZhdGVKb2luZWRBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMuam9pbmVkKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFBydW5lQ291bnQoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRQcnVuZWRDb3VudD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnBydW5lKGd1aWxkSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRQdWJsaWNBcmNoaXZlZFRocmVhZHMoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZExpc3RBcmNoaXZlZFRocmVhZHM+KHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMucHVibGljKGNoYW5uZWxJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJvbGVzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkUm9sZVtdPihyZXN0LnJvdXRlcy5ndWlsZHMucm9sZXMuYWxsKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudChndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFNjaGVkdWxlZEV2ZW50PihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50KGd1aWxkSWQsIGV2ZW50SWQsIG9wdGlvbnM/LndpdGhVc2VyQ291bnQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRTY2hlZHVsZWRFdmVudHMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTY2hlZHVsZWRFdmVudFtdPihyZXN0LnJvdXRlcy5ndWlsZHMuZXZlbnRzLmV2ZW50cyhndWlsZElkLCBvcHRpb25zPy53aXRoVXNlckNvdW50KSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2NoZWR1bGVkRXZlbnRVc2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8QXJyYXk8eyB1c2VyOiBEaXNjb3JkVXNlcjsgbWVtYmVyPzogRGlzY29yZE1lbWJlciB9Pj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLmV2ZW50cy51c2VycyhndWlsZElkLCBldmVudElkLCBvcHRpb25zKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U2Vzc2lvbkluZm8oKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXRHYXRld2F5Qm90KClcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RhZ2VJbnN0YW5jZShjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RhZ2VJbnN0YW5jZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuc3RhZ2UoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0U3RpY2tlcihzdGlja2VySWQ6IEJpZ1N0cmluZykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRTdGlja2VyPihyZXN0LnJvdXRlcy5zdGlja2VyKHN0aWNrZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldEd1aWxkU3RpY2tlcihndWlsZElkLCBzdGlja2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkU3RpY2tlcj4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXIoZ3VpbGRJZCwgc3RpY2tlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0R3VpbGRTdGlja2VycyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFN0aWNrZXJbXT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnN0aWNrZXJzKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXIoY2hhbm5lbElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVGhyZWFkTWVtYmVyPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLnVzZXIoY2hhbm5lbElkLCB1c2VySWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRUaHJlYWRNZW1iZXJzKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRUaHJlYWRNZW1iZXJbXT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZW1iZXJzKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFJlYWN0aW9ucyhjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkVXNlcltdPihyZXN0LnJvdXRlcy5jaGFubmVscy5yZWFjdGlvbnMubWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCwgcmVhY3Rpb24sIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRVc2VyKGlkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFVzZXI+KHJlc3Qucm91dGVzLnVzZXIoaWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRWYW5pdHlVcmwoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRWYW5pdHlVcmw+KHJlc3Qucm91dGVzLmd1aWxkcy52YW5pdHkoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFZvaWNlUmVnaW9ucyhndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFZvaWNlUmVnaW9uW10+KHJlc3Qucm91dGVzLmd1aWxkcy5yZWdpb25zKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rKHdlYmhvb2tJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRXZWJob29rPihyZXN0LnJvdXRlcy53ZWJob29rcy5pZCh3ZWJob29rSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rTWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMud2ViaG9va3MubWVzc2FnZSh3ZWJob29rSWQsIHRva2VuLCBtZXNzYWdlSWQsIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXZWJob29rV2l0aFRva2VuKHdlYmhvb2tJZCwgdG9rZW4pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkV2ViaG9vaz4ocmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayh3ZWJob29rSWQsIHRva2VuKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0V2VsY29tZVNjcmVlbihndWlsZElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZFdlbGNvbWVTY3JlZW4+KHJlc3Qucm91dGVzLmd1aWxkcy53ZWxjb21lKGd1aWxkSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRXaWRnZXQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRHdWlsZFdpZGdldD4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldEpzb24oZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGdldFdpZGdldFNldHRpbmdzKGd1aWxkSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmdldDxEaXNjb3JkR3VpbGRXaWRnZXRTZXR0aW5ncz4ocmVzdC5yb3V0ZXMuZ3VpbGRzLndpZGdldChndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgam9pblRocmVhZChjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lKGNoYW5uZWxJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGxlYXZlR3VpbGQoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmd1aWxkcy5sZWF2ZShndWlsZElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgbGVhdmVUaHJlYWQoY2hhbm5lbElkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5tZShjaGFubmVsSWQpKVxuICAgIH0sXG5cbiAgICBhc3luYyBwdWJsaXNoTWVzc2FnZShjaGFubmVsSWQsIG1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkTWVzc2FnZT4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMuY3Jvc3Nwb3N0KGNoYW5uZWxJZCwgbWVzc2FnZUlkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgcmVtb3ZlUm9sZShndWlsZElkLCB1c2VySWQsIHJvbGVJZCwgcmVhc29uKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5kZWxldGUocmVzdC5yb3V0ZXMuZ3VpbGRzLnJvbGVzLm1lbWJlcihndWlsZElkLCB1c2VySWQsIHJvbGVJZCksIHsgcmVhc29uIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHJlbW92ZVRocmVhZE1lbWJlcihjaGFubmVsSWQsIHVzZXJJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZGVsZXRlKHJlc3Qucm91dGVzLmNoYW5uZWxzLnRocmVhZHMudXNlcihjaGFubmVsSWQsIHVzZXJJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRGb2xsb3d1cE1lc3NhZ2UodG9rZW4sIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHJlc3Quc2VuZFJlcXVlc3Qoe1xuICAgICAgICAgIHVybDogcmVzdC5yb3V0ZXMud2ViaG9va3Mud2ViaG9vayhyZXN0LmFwcGxpY2F0aW9uSWQsIHRva2VuKSxcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBib2R5OiBvcHRpb25zLFxuICAgICAgICAgIHJldHJ5Q291bnQ6IDAsXG4gICAgICAgICAgcmV0cnlSZXF1ZXN0OiBhc3luYyBmdW5jdGlvbiAob3B0aW9uczogU2VuZFJlcXVlc3RPcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2hhbmdlIHRvIHJlcHJvY2VzcyBxdWV1ZSBpdGVtXG4gICAgICAgICAgICBhd2FpdCByZXN0LnNlbmRSZXF1ZXN0KG9wdGlvbnMpXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNvbHZlOiAoZGF0YSkgPT4gcmVzb2x2ZShkYXRhLnN0YXR1cyAhPT0gMjA0ID8gSlNPTi5wYXJzZShkYXRhLmJvZHkgPz8gJ3t9JykgOiB1bmRlZmluZWQpLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSxcblxuICAgIGFzeW5jIHNlbmRJbnRlcmFjdGlvblJlc3BvbnNlKGludGVyYWN0aW9uSWQsIHRva2VuLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXN0LnNlbmRSZXF1ZXN0KHtcbiAgICAgICAgICB1cmw6IHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5yZXNwb25zZXMuY2FsbGJhY2soaW50ZXJhY3Rpb25JZCwgdG9rZW4pLFxuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG9wdGlvbnMsXG4gICAgICAgICAgcmV0cnlDb3VudDogMCxcbiAgICAgICAgICByZXRyeVJlcXVlc3Q6IGFzeW5jIGZ1bmN0aW9uIChvcHRpb25zOiBTZW5kUmVxdWVzdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCBjaGFuZ2UgdG8gcmVwcm9jZXNzIHF1ZXVlIGl0ZW1cbiAgICAgICAgICAgIGF3YWl0IHJlc3Quc2VuZFJlcXVlc3Qob3B0aW9ucylcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc29sdmU6IChkYXRhKSA9PiByZXNvbHZlKGRhdGEuc3RhdHVzICE9PSAyMDQgPyBKU09OLnBhcnNlKGRhdGEuYm9keSA/PyAne30nKSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VuZE1lc3NhZ2UoY2hhbm5lbElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRNZXNzYWdlPihyZXN0LnJvdXRlcy5jaGFubmVscy5tZXNzYWdlcyhjaGFubmVsSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhNZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wb3N0PERpc2NvcmRDaGFubmVsPihyZXN0LnJvdXRlcy5jaGFubmVscy50aHJlYWRzLm1lc3NhZ2UoY2hhbm5lbElkLCBtZXNzYWdlSWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBzdGFydFRocmVhZFdpdGhvdXRNZXNzYWdlKGNoYW5uZWxJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDxEaXNjb3JkQ2hhbm5lbD4ocmVzdC5yb3V0ZXMuY2hhbm5lbHMudGhyZWFkcy5hbGwoY2hhbm5lbElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc3luY0d1aWxkVGVtcGxhdGUoZ3VpbGRJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRUZW1wbGF0ZT4ocmVzdC5yb3V0ZXMuZ3VpbGRzLnRlbXBsYXRlcy5hbGwoZ3VpbGRJZCkpXG4gICAgfSxcblxuICAgIGFzeW5jIGJhbk1lbWJlcihndWlsZElkLCB1c2VySWQsIG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDx2b2lkPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgZWRpdEJvdE1lbWJlcihndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5ib3QoZ3VpbGRJZCksIG9wdGlvbnMpXG4gICAgfSxcblxuICAgIGFzeW5jIGVkaXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5wYXRjaDxEaXNjb3JkTWVtYmVyV2l0aFVzZXI+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcihndWlsZElkLCB1c2VySWQpLCBvcHRpb25zKVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRNZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0TWVtYmVycyhndWlsZElkLCBvcHRpb25zKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVzdC5nZXQ8RGlzY29yZE1lbWJlcldpdGhVc2VyW10+KHJlc3Qucm91dGVzLmd1aWxkcy5tZW1iZXJzLm1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykpXG4gICAgfSxcblxuICAgIGFzeW5jIGtpY2tNZW1iZXIoZ3VpbGRJZCwgdXNlcklkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5tZW1iZXIoZ3VpbGRJZCwgdXNlcklkKSwge1xuICAgICAgICByZWFzb24sXG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBhc3luYyBwaW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dChyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyBwcnVuZU1lbWJlcnMoZ3VpbGRJZCwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdDx7IHBydW5lZDogbnVtYmVyIHwgbnVsbCB9PihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5wcnVuZShndWlsZElkKSwgb3B0aW9ucylcbiAgICB9LFxuXG4gICAgYXN5bmMgc2VhcmNoTWVtYmVycyhndWlsZElkLCBxdWVyeSwgb3B0aW9ucykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QuZ2V0PERpc2NvcmRNZW1iZXJXaXRoVXNlcltdPihyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5zZWFyY2goZ3VpbGRJZCwgcXVlcnksIG9wdGlvbnMpKVxuICAgIH0sXG5cbiAgICBhc3luYyB1bmJhbk1lbWJlcihndWlsZElkLCB1c2VySWQpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5ndWlsZHMubWVtYmVycy5iYW4oZ3VpbGRJZCwgdXNlcklkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdW5waW5NZXNzYWdlKGNoYW5uZWxJZCwgbWVzc2FnZUlkLCByZWFzb24pIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LmRlbGV0ZShyZXN0LnJvdXRlcy5jaGFubmVscy5waW4oY2hhbm5lbElkLCBtZXNzYWdlSWQpLCByZWFzb24gPyB7IHJlYXNvbiB9IDogdW5kZWZpbmVkKVxuICAgIH0sXG5cbiAgICBhc3luYyB0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yKGNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucG9zdChyZXN0LnJvdXRlcy5jaGFubmVscy50eXBpbmcoY2hhbm5lbElkKSlcbiAgICB9LFxuXG4gICAgYXN5bmMgdXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyhjb21tYW5kcykge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlc3QucHV0PERpc2NvcmRBcHBsaWNhdGlvbkNvbW1hbmRbXT4ocmVzdC5yb3V0ZXMuaW50ZXJhY3Rpb25zLmNvbW1hbmRzLmNvbW1hbmRzKHJlc3QuYXBwbGljYXRpb25JZCksIGNvbW1hbmRzKVxuICAgIH0sXG5cbiAgICBhc3luYyB1cHNlcnRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZHMoZ3VpbGRJZCwgY29tbWFuZHMpIHtcbiAgICAgIHJldHVybiBhd2FpdCByZXN0LnB1dDxEaXNjb3JkQXBwbGljYXRpb25Db21tYW5kW10+KHJlc3Qucm91dGVzLmludGVyYWN0aW9ucy5jb21tYW5kcy5ndWlsZHMuYWxsKHJlc3QuYXBwbGljYXRpb25JZCwgZ3VpbGRJZCksIGNvbW1hbmRzKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gcmVzdFxufVxuIl0sIm5hbWVzIjpbIkludGVyYWN0aW9uUmVzcG9uc2VUeXBlcyIsImNhbGN1bGF0ZUJpdHMiLCJjYW1lbGl6ZSIsImNhbWVsVG9TbmFrZUNhc2UiLCJkZWxheSIsImZpbmRGaWxlcyIsImdldEJvdElkRnJvbVRva2VuIiwiaXNHZXRNZXNzYWdlc0FmdGVyIiwiaXNHZXRNZXNzYWdlc0Fyb3VuZCIsImlzR2V0TWVzc2FnZXNCZWZvcmUiLCJpc0dldE1lc3NhZ2VzTGltaXQiLCJsb2dnZXIiLCJwcm9jZXNzUmVhY3Rpb25TdHJpbmciLCJ1cmxUb0Jhc2U2NCIsImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0IiwiUXVldWUiLCJjcmVhdGVSZXN0TWFuYWdlciIsIm9wdGlvbnMiLCJ0b2tlbiIsIkVycm9yIiwicmVzdCIsImFwcGxpY2F0aW9uSWQiLCJCaWdJbnQiLCJ2ZXJzaW9uIiwiYmFzZVVybCIsIm1heFJldHJ5Q291bnQiLCJJbmZpbml0eSIsImdsb2JhbGx5UmF0ZUxpbWl0ZWQiLCJwcm9jZXNzaW5nUmF0ZUxpbWl0ZWRQYXRocyIsImRlbGV0ZVF1ZXVlRGVsYXkiLCJxdWV1ZXMiLCJNYXAiLCJyYXRlTGltaXRlZFBhdGhzIiwiaW52YWxpZEJ1Y2tldCIsInJvdXRlcyIsIndlYmhvb2tzIiwiaWQiLCJ3ZWJob29rSWQiLCJtZXNzYWdlIiwibWVzc2FnZUlkIiwidXJsIiwidGhyZWFkSWQiLCJvcmlnaW5hbCIsIndlYmhvb2siLCJ3YWl0IiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJzZXNzaW9uSW5mbyIsImdhdGV3YXlCb3QiLCJjaGFubmVscyIsImJ1bGsiLCJjaGFubmVsSWQiLCJkbSIsInBpbiIsInBpbnMiLCJyZWFjdGlvbnMiLCJib3QiLCJlbW9qaSIsImVuY29kZVVSSUNvbXBvbmVudCIsInVzZXIiLCJ1c2VySWQiLCJhbGwiLCJhZnRlciIsImxpbWl0IiwiY2hhbm5lbCIsImZvbGxvdyIsImZvcnVtIiwiaW52aXRlcyIsIm1lc3NhZ2VzIiwiYmVmb3JlIiwiYXJvdW5kIiwib3ZlcndyaXRlIiwib3ZlcndyaXRlSWQiLCJjcm9zc3Bvc3QiLCJzdGFnZXMiLCJzdGFnZSIsInRocmVhZHMiLCJhY3RpdmUiLCJndWlsZElkIiwibWVtYmVycyIsIm1lIiwiYXJjaGl2ZWQiLCJwdWJsaWMiLCJEYXRlIiwidG9JU09TdHJpbmciLCJwcml2YXRlIiwiam9pbmVkIiwidHlwaW5nIiwiZ3VpbGRzIiwiYXVkaXRsb2dzIiwiYWN0aW9uVHlwZSIsImF1dG9tb2QiLCJydWxlIiwicnVsZUlkIiwicnVsZXMiLCJlbW9qaUlkIiwiZW1vamlzIiwiZXZlbnRzIiwid2l0aFVzZXJDb3VudCIsImV2ZW50IiwiZXZlbnRJZCIsInVzZXJzIiwid2l0aE1lbWJlciIsImd1aWxkIiwid2l0aENvdW50cyIsImludGVncmF0aW9uIiwiaW50ZWdyYXRpb25JZCIsImludGVncmF0aW9ucyIsImludml0ZSIsImludml0ZUNvZGUiLCJ3aXRoRXhwaXJhdGlvbiIsInNjaGVkdWxlZEV2ZW50SWQiLCJsZWF2ZSIsImJhbiIsImJhbnMiLCJtZW1iZXIiLCJzZWFyY2giLCJxdWVyeSIsInBydW5lIiwiZGF5cyIsIkFycmF5IiwiaXNBcnJheSIsImluY2x1ZGVSb2xlcyIsImpvaW4iLCJtZmEiLCJwcmV2aWV3Iiwicm9sZXMiLCJvbmUiLCJyb2xlSWQiLCJtZW1iZXJJZCIsInN0aWNrZXJzIiwic3RpY2tlciIsInN0aWNrZXJJZCIsInZvaWNlIiwidGVtcGxhdGVzIiwiY29kZSIsInZhbml0eSIsInJlZ2lvbnMiLCJ3ZWxjb21lIiwid2lkZ2V0Iiwid2lkZ2V0SnNvbiIsImludGVyYWN0aW9ucyIsImNvbW1hbmRzIiwiY29tbWFuZElkIiwid2l0aExvY2FsaXphdGlvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm1pc3Npb24iLCJjb21tYW5kIiwicmVzcG9uc2VzIiwiY2FsbGJhY2siLCJpbnRlcmFjdGlvbklkIiwidXNlckJvdCIsIm9hdXRoMkFwcGxpY2F0aW9uIiwibml0cm9TdGlja2VyUGFja3MiLCJjaGVja1JhdGVMaW1pdHMiLCJyYXRlbGltaXRlZCIsImdldCIsImdsb2JhbCIsIm5vdyIsInJlc2V0VGltZXN0YW1wIiwiY2hhbmdlVG9EaXNjb3JkRm9ybWF0Iiwib2JqIiwibWFwIiwiaXRlbSIsIm5ld09iaiIsImtleSIsIk9iamVjdCIsImtleXMiLCJpbmNsdWRlcyIsImRlZmF1bHRfbWVtYmVyX3Blcm1pc3Npb25zIiwiY3JlYXRlUmVxdWVzdCIsImhlYWRlcnMiLCJ1bmF1dGhvcml6ZWQiLCJhdXRob3JpemF0aW9uIiwidG9Mb3dlckNhc2UiLCJtZXRob2QiLCJib2R5IiwicmVhc29uIiwiZmlsZSIsImZpbGVzIiwiZm9ybSIsIkZvcm1EYXRhIiwiZW5kc1dpdGgiLCJhcHBlbmQiLCJibG9iIiwibmFtZSIsImRlc2NyaXB0aW9uIiwidGFncyIsImkiLCJsZW5ndGgiLCJKU09OIiwic3RyaW5naWZ5IiwicHJvY2Vzc1JhdGVMaW1pdGVkUGF0aHMiLCJ2YWx1ZSIsImVudHJpZXMiLCJkZWxldGUiLCJzaXplIiwic2V0VGltZW91dCIsInByb2Nlc3NIZWFkZXJzIiwicmF0ZUxpbWl0ZWQiLCJyZW1haW5pbmciLCJyZXRyeUFmdGVyIiwicmVzZXQiLCJOdW1iZXIiLCJidWNrZXRJZCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJpbnRlcnZhbCIsIm1heCIsInNldCIsImdsb2JhbFJlc2V0Iiwic2VuZFJlcXVlc3QiLCJzdGFydHNXaXRoIiwicGF5bG9hZCIsImRlYnVnIiwicmVzcG9uc2UiLCJmZXRjaCIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJzaW1wbGlmeVVybCIsInJldHJ5Q291bnQiLCJyZWplY3QiLCJvayIsImVycm9yIiwicmVzZXRBZnRlciIsImpzb24iLCJyZXRyeVJlcXVlc3QiLCJpczIwNCIsInJlc29sdmUiLCJyb3V0ZSIsInJlcGxhY2UiLCJtYXRjaCIsInAiLCJzdWJzdHJpbmciLCJpbmRleE9mIiwicHJvY2Vzc1JlcXVlc3QiLCJyZXF1ZXN0IiwicGFydHMiLCJzcGxpdCIsInNoaWZ0IiwicXVldWUiLCJtYWtlUmVxdWVzdCIsImJ1Y2tldFF1ZXVlIiwiUHJvbWlzZSIsImRhdGEiLCJwYXJzZSIsInBvc3QiLCJwYXRjaCIsInB1dCIsImFkZFJlYWN0aW9uIiwicmVhY3Rpb24iLCJhZGRSZWFjdGlvbnMiLCJvcmRlcmVkIiwiYWRkUm9sZSIsImFkZFRocmVhZE1lbWJlciIsImNyZWF0ZUF1dG9tb2RSdWxlIiwiY3JlYXRlQ2hhbm5lbCIsImNyZWF0ZUVtb2ppIiwiY3JlYXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiY3JlYXRlR3VpbGQiLCJjcmVhdGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImNyZWF0ZUd1aWxkRnJvbVRlbXBsYXRlIiwidGVtcGxhdGVDb2RlIiwiaWNvbiIsImNyZWF0ZUd1aWxkU3RpY2tlciIsImNyZWF0ZUd1aWxkVGVtcGxhdGUiLCJjcmVhdGVGb3J1bVRocmVhZCIsImNyZWF0ZUludml0ZSIsImNyZWF0ZVJvbGUiLCJjcmVhdGVTY2hlZHVsZWRFdmVudCIsImNyZWF0ZVN0YWdlSW5zdGFuY2UiLCJjcmVhdGVXZWJob29rIiwiYXZhdGFyIiwiZGVsZXRlQXV0b21vZFJ1bGUiLCJkZWxldGVDaGFubmVsIiwiZGVsZXRlQ2hhbm5lbFBlcm1pc3Npb25PdmVycmlkZSIsImRlbGV0ZUVtb2ppIiwiZGVsZXRlRm9sbG93dXBNZXNzYWdlIiwiZGVsZXRlR2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZGVsZXRlR3VpbGQiLCJkZWxldGVHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImRlbGV0ZUd1aWxkU3RpY2tlciIsImRlbGV0ZUd1aWxkVGVtcGxhdGUiLCJkZWxldGVJbnRlZ3JhdGlvbiIsImRlbGV0ZUludml0ZSIsImRlbGV0ZU1lc3NhZ2UiLCJkZWxldGVNZXNzYWdlcyIsIm1lc3NhZ2VJZHMiLCJzbGljZSIsImRlbGV0ZU9yaWdpbmFsSW50ZXJhY3Rpb25SZXNwb25zZSIsImRlbGV0ZU93blJlYWN0aW9uIiwiZGVsZXRlUmVhY3Rpb25zQWxsIiwiZGVsZXRlUmVhY3Rpb25zRW1vamkiLCJkZWxldGVSb2xlIiwiZGVsZXRlU2NoZWR1bGVkRXZlbnQiLCJkZWxldGVTdGFnZUluc3RhbmNlIiwiZGVsZXRlVXNlclJlYWN0aW9uIiwiZGVsZXRlV2ViaG9vayIsImRlbGV0ZVdlYmhvb2tNZXNzYWdlIiwiZGVsZXRlV2ViaG9va1dpdGhUb2tlbiIsImVkaXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImJlYXJlclRva2VuIiwiZWRpdEF1dG9tb2RSdWxlIiwiZWRpdEJvdFByb2ZpbGUiLCJib3RBdmF0YXJVUkwiLCJ1c2VybmFtZSIsInRyaW0iLCJlZGl0Q2hhbm5lbCIsImVkaXRDaGFubmVsUGVybWlzc2lvbk92ZXJyaWRlcyIsImVkaXRDaGFubmVsUG9zaXRpb25zIiwiY2hhbm5lbFBvc2l0aW9ucyIsImVkaXRFbW9qaSIsImVkaXRGb2xsb3d1cE1lc3NhZ2UiLCJlZGl0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkIiwiZWRpdEd1aWxkQXBwbGljYXRpb25Db21tYW5kIiwiZWRpdEd1aWxkTWZhTGV2ZWwiLCJtZmFMZXZlbCIsImxldmVsIiwiZWRpdEd1aWxkU3RpY2tlciIsImVkaXRHdWlsZFRlbXBsYXRlIiwiZWRpdE1lc3NhZ2UiLCJlZGl0T3JpZ2luYWxJbnRlcmFjdGlvblJlc3BvbnNlIiwiZWRpdE9yaWdpbmFsV2ViaG9va01lc3NhZ2UiLCJ0eXBlIiwiVXBkYXRlTWVzc2FnZSIsImVkaXRPd25Wb2ljZVN0YXRlIiwiY2hhbm5lbF9pZCIsInN1cHByZXNzIiwicmVxdWVzdF90b19zcGVha190aW1lc3RhbXAiLCJyZXF1ZXN0VG9TcGVha1RpbWVzdGFtcCIsImVkaXRTY2hlZHVsZWRFdmVudCIsImVkaXRSb2xlIiwiZWRpdFJvbGVQb3NpdGlvbnMiLCJlZGl0U3RhZ2VJbnN0YW5jZSIsInRvcGljIiwiZWRpdFVzZXJWb2ljZVN0YXRlIiwidXNlcl9pZCIsImVkaXRXZWJob29rIiwiZWRpdFdlYmhvb2tNZXNzYWdlIiwiZWRpdFdlYmhvb2tXaXRoVG9rZW4iLCJlZGl0V2VsY29tZVNjcmVlbiIsImVkaXRXaWRnZXRTZXR0aW5ncyIsImV4ZWN1dGVXZWJob29rIiwiZm9sbG93QW5ub3VuY2VtZW50Iiwic291cmNlQ2hhbm5lbElkIiwidGFyZ2V0Q2hhbm5lbElkIiwid2ViaG9va19jaGFubmVsX2lkIiwiZ2V0QWN0aXZlVGhyZWFkcyIsImdldEFwcGxpY2F0aW9uQ29tbWFuZFBlcm1pc3Npb24iLCJnZXRBcHBsaWNhdGlvbkNvbW1hbmRQZXJtaXNzaW9ucyIsImdldEFwcGxpY2F0aW9uSW5mbyIsImdldEF1ZGl0TG9nIiwiZ2V0QXV0b21vZFJ1bGUiLCJnZXRBdXRvbW9kUnVsZXMiLCJnZXRBdmFpbGFibGVWb2ljZVJlZ2lvbnMiLCJnZXRCYW4iLCJnZXRCYW5zIiwiZ2V0Q2hhbm5lbCIsImdldENoYW5uZWxJbnZpdGVzIiwiZ2V0Q2hhbm5lbHMiLCJnZXRDaGFubmVsV2ViaG9va3MiLCJnZXREbUNoYW5uZWwiLCJyZWNpcGllbnRfaWQiLCJnZXRFbW9qaSIsImdldEVtb2ppcyIsImdldEZvbGxvd3VwTWVzc2FnZSIsImdldEdhdGV3YXlCb3QiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmQiLCJnZXRHbG9iYWxBcHBsaWNhdGlvbkNvbW1hbmRzIiwiZ2V0R3VpbGQiLCJjb3VudHMiLCJnZXRHdWlsZEFwcGxpY2F0aW9uQ29tbWFuZCIsImdldEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyIsImdldEd1aWxkUHJldmlldyIsImdldEd1aWxkVGVtcGxhdGUiLCJnZXRHdWlsZFRlbXBsYXRlcyIsImdldEd1aWxkV2ViaG9va3MiLCJnZXRJbnRlZ3JhdGlvbnMiLCJnZXRJbnZpdGUiLCJnZXRJbnZpdGVzIiwiZ2V0TWVzc2FnZSIsImdldE1lc3NhZ2VzIiwiZ2V0Tml0cm9TdGlja2VyUGFja3MiLCJnZXRPcmlnaW5hbEludGVyYWN0aW9uUmVzcG9uc2UiLCJnZXRQaW5uZWRNZXNzYWdlcyIsImdldFByaXZhdGVBcmNoaXZlZFRocmVhZHMiLCJnZXRQcml2YXRlSm9pbmVkQXJjaGl2ZWRUaHJlYWRzIiwiZ2V0UHJ1bmVDb3VudCIsImdldFB1YmxpY0FyY2hpdmVkVGhyZWFkcyIsImdldFJvbGVzIiwiZ2V0U2NoZWR1bGVkRXZlbnQiLCJnZXRTY2hlZHVsZWRFdmVudHMiLCJnZXRTY2hlZHVsZWRFdmVudFVzZXJzIiwiZ2V0U2Vzc2lvbkluZm8iLCJnZXRTdGFnZUluc3RhbmNlIiwiZ2V0U3RpY2tlciIsImdldEd1aWxkU3RpY2tlciIsImdldEd1aWxkU3RpY2tlcnMiLCJnZXRUaHJlYWRNZW1iZXIiLCJnZXRUaHJlYWRNZW1iZXJzIiwiZ2V0UmVhY3Rpb25zIiwiZ2V0VXNlciIsImdldFZhbml0eVVybCIsImdldFZvaWNlUmVnaW9ucyIsImdldFdlYmhvb2siLCJnZXRXZWJob29rTWVzc2FnZSIsImdldFdlYmhvb2tXaXRoVG9rZW4iLCJnZXRXZWxjb21lU2NyZWVuIiwiZ2V0V2lkZ2V0IiwiZ2V0V2lkZ2V0U2V0dGluZ3MiLCJqb2luVGhyZWFkIiwibGVhdmVHdWlsZCIsImxlYXZlVGhyZWFkIiwicHVibGlzaE1lc3NhZ2UiLCJyZW1vdmVSb2xlIiwicmVtb3ZlVGhyZWFkTWVtYmVyIiwic2VuZEZvbGxvd3VwTWVzc2FnZSIsInNlbmRJbnRlcmFjdGlvblJlc3BvbnNlIiwic2VuZE1lc3NhZ2UiLCJzdGFydFRocmVhZFdpdGhNZXNzYWdlIiwic3RhcnRUaHJlYWRXaXRob3V0TWVzc2FnZSIsInN5bmNHdWlsZFRlbXBsYXRlIiwiYmFuTWVtYmVyIiwiZWRpdEJvdE1lbWJlciIsImVkaXRNZW1iZXIiLCJnZXRNZW1iZXIiLCJnZXRNZW1iZXJzIiwia2lja01lbWJlciIsInBpbk1lc3NhZ2UiLCJwcnVuZU1lbWJlcnMiLCJzZWFyY2hNZW1iZXJzIiwidW5iYW5NZW1iZXIiLCJ1bnBpbk1lc3NhZ2UiLCJ0cmlnZ2VyVHlwaW5nSW5kaWNhdG9yIiwidXBzZXJ0R2xvYmFsQXBwbGljYXRpb25Db21tYW5kcyIsInVwc2VydEd1aWxkQXBwbGljYXRpb25Db21tYW5kcyJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBU0EsNEJBQUFBLENBQXdCLEtBQVEsbUJBQW1CLEFBQzVELFFBQ0VDLGlCQUFBQSxDQUFhLENBQ2JDLFlBQUFBLENBQVEsQ0FDUkMsb0JBQUFBLENBQWdCLENBQ2hCQyxTQUFBQSxDQUFLLENBQ0xDLGFBQUFBLENBQVMsQ0FDVEMscUJBQUFBLENB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
|
|
1
|
+
/* eslint-disable @typescript-eslint/restrict-template-expressions */ /* eslint-disable no-const-assign */ import { InteractionResponseTypes } from '@discordeno/types';
|
|
2
|
+
import { calculateBits, camelize, camelToSnakeCase, delay, findFiles, getBotIdFromToken, isGetMessagesAfter, isGetMessagesAround, isGetMessagesBefore, isGetMessagesLimit, logger, processReactionString, urlToBase64 } from '@discordeno/utils';
|
|
3
|
+
import { createInvalidRequestBucket } from './invalidBucket.js';
|
|
4
|
+
import { Queue } from './queue.js';
|
|
5
|
+
// TODO: make dynamic based on package.json file
|
|
6
|
+
const version = '19.0.0-alpha.1';
|
|
7
|
+
export function createRestManager(options) {
|
|
8
|
+
// Falsy token string check
|
|
9
|
+
if (!options.token) throw new Error('You must provide a valid token.');
|
|
10
|
+
const rest = {
|
|
11
|
+
token: options.token,
|
|
12
|
+
applicationId: options.applicationId ? BigInt(options.applicationId) : getBotIdFromToken(options.token),
|
|
13
|
+
version: options.version ?? 10,
|
|
14
|
+
baseUrl: options.baseUrl ?? 'https://discord.com/api',
|
|
15
|
+
maxRetryCount: Infinity,
|
|
16
|
+
globallyRateLimited: false,
|
|
17
|
+
processingRateLimitedPaths: false,
|
|
18
|
+
deleteQueueDelay: 60000,
|
|
19
|
+
queues: new Map(),
|
|
20
|
+
rateLimitedPaths: new Map(),
|
|
21
|
+
invalidBucket: createInvalidRequestBucket({}),
|
|
22
|
+
routes: {
|
|
23
|
+
webhooks: {
|
|
24
|
+
id: (webhookId)=>{
|
|
25
|
+
return `/webhooks/${webhookId}`;
|
|
26
|
+
},
|
|
27
|
+
message: (webhookId, token, messageId, options)=>{
|
|
28
|
+
let url = `/webhooks/${webhookId}/${token}/messages/${messageId}?`;
|
|
29
|
+
if (options) {
|
|
30
|
+
if (options.threadId) url += `thread_id=${options.threadId}`;
|
|
31
|
+
}
|
|
32
|
+
return url;
|
|
33
|
+
},
|
|
34
|
+
original: (webhookId, token, options)=>{
|
|
35
|
+
let url = `/webhooks/${webhookId}/${token}/messages/@original?`;
|
|
36
|
+
if (options) {
|
|
37
|
+
if (options.threadId) url += `thread_id=${options.threadId}`;
|
|
38
|
+
}
|
|
39
|
+
return url;
|
|
40
|
+
},
|
|
41
|
+
webhook: (webhookId, token, options)=>{
|
|
42
|
+
let url = `/webhooks/${webhookId}/${token}?`;
|
|
43
|
+
if (options) {
|
|
44
|
+
if (options?.wait !== undefined) url += `wait=${options.wait.toString()}`;
|
|
45
|
+
if (options.threadId) url += `thread_id=${options.threadId}`;
|
|
46
|
+
}
|
|
47
|
+
return url;
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
// Miscellaneous Endpoints
|
|
51
|
+
sessionInfo: ()=>rest.routes.gatewayBot(),
|
|
52
|
+
// Channel Endpoints
|
|
53
|
+
channels: {
|
|
54
|
+
bulk: (channelId)=>{
|
|
55
|
+
return `/channels/${channelId}/messages/bulk-delete`;
|
|
56
|
+
},
|
|
57
|
+
dm: ()=>{
|
|
58
|
+
return '/users/@me/channels';
|
|
59
|
+
},
|
|
60
|
+
pin: (channelId, messageId)=>{
|
|
61
|
+
return `/channels/${channelId}/pins/${messageId}`;
|
|
62
|
+
},
|
|
63
|
+
pins: (channelId)=>{
|
|
64
|
+
return `/channels/${channelId}/pins`;
|
|
65
|
+
},
|
|
66
|
+
reactions: {
|
|
67
|
+
bot: (channelId, messageId, emoji)=>{
|
|
68
|
+
return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/@me`;
|
|
69
|
+
},
|
|
70
|
+
user: (channelId, messageId, emoji, userId)=>{
|
|
71
|
+
return `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}/${userId}`;
|
|
72
|
+
},
|
|
73
|
+
all: (channelId, messageId)=>{
|
|
74
|
+
return `/channels/${channelId}/messages/${messageId}/reactions`;
|
|
75
|
+
},
|
|
76
|
+
emoji: (channelId, messageId, emoji, options)=>{
|
|
77
|
+
let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`;
|
|
78
|
+
if (options) {
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
80
|
+
if (options.after) url += `after=${options.after}`;
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
82
|
+
if (options.limit) url += `&limit=${options.limit}`;
|
|
83
|
+
}
|
|
84
|
+
return url;
|
|
85
|
+
},
|
|
86
|
+
message: (channelId, messageId, emoji, options)=>{
|
|
87
|
+
let url = `/channels/${channelId}/messages/${messageId}/reactions/${encodeURIComponent(emoji)}?`;
|
|
88
|
+
if (options) {
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
90
|
+
if (options.after) url += `after=${options.after}`;
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
92
|
+
if (options.limit) url += `&limit=${options.limit}`;
|
|
93
|
+
}
|
|
94
|
+
return url;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
webhooks: (channelId)=>{
|
|
98
|
+
return `/channels/${channelId}/webhooks`;
|
|
99
|
+
},
|
|
100
|
+
channel: (channelId)=>{
|
|
101
|
+
return `/channels/${channelId}`;
|
|
102
|
+
},
|
|
103
|
+
follow: (channelId)=>{
|
|
104
|
+
return `/channels/${channelId}/followers`;
|
|
105
|
+
},
|
|
106
|
+
forum: (channelId)=>{
|
|
107
|
+
return `/channels/${channelId}/threads?has_message=true`;
|
|
108
|
+
},
|
|
109
|
+
invites: (channelId)=>{
|
|
110
|
+
return `/channels/${channelId}/invites`;
|
|
111
|
+
},
|
|
112
|
+
message: (channelId, messageId)=>{
|
|
113
|
+
return `/channels/${channelId}/messages/${messageId}`;
|
|
114
|
+
},
|
|
115
|
+
messages: (channelId, options)=>{
|
|
116
|
+
let url = `/channels/${channelId}/messages?`;
|
|
117
|
+
if (options) {
|
|
118
|
+
if (isGetMessagesAfter(options) && options.after) {
|
|
119
|
+
url += `after=${options.after}`;
|
|
120
|
+
}
|
|
121
|
+
if (isGetMessagesBefore(options) && options.before) {
|
|
122
|
+
url += `&before=${options.before}`;
|
|
123
|
+
}
|
|
124
|
+
if (isGetMessagesAround(options) && options.around) {
|
|
125
|
+
url += `&around=${options.around}`;
|
|
126
|
+
}
|
|
127
|
+
if (isGetMessagesLimit(options) && options.limit) {
|
|
128
|
+
url += `&limit=${options.limit}`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return url;
|
|
132
|
+
},
|
|
133
|
+
overwrite: (channelId, overwriteId)=>{
|
|
134
|
+
return `/channels/${channelId}/permissions/${overwriteId}`;
|
|
135
|
+
},
|
|
136
|
+
crosspost: (channelId, messageId)=>{
|
|
137
|
+
return `/channels/${channelId}/messages/${messageId}/crosspost`;
|
|
138
|
+
},
|
|
139
|
+
stages: ()=>{
|
|
140
|
+
return '/stage-instances';
|
|
141
|
+
},
|
|
142
|
+
stage: (channelId)=>{
|
|
143
|
+
return `/stage-instances/${channelId}`;
|
|
144
|
+
},
|
|
145
|
+
// Thread Endpoints
|
|
146
|
+
threads: {
|
|
147
|
+
message: (channelId, messageId)=>{
|
|
148
|
+
return `/channels/${channelId}/messages/${messageId}/threads`;
|
|
149
|
+
},
|
|
150
|
+
all: (channelId)=>{
|
|
151
|
+
return `/channels/${channelId}/threads`;
|
|
152
|
+
},
|
|
153
|
+
active: (guildId)=>{
|
|
154
|
+
return `/guilds/${guildId}/threads/active`;
|
|
155
|
+
},
|
|
156
|
+
members: (channelId)=>{
|
|
157
|
+
return `/channels/${channelId}/thread-members`;
|
|
158
|
+
},
|
|
159
|
+
me: (channelId)=>{
|
|
160
|
+
return `/channels/${channelId}/thread-members/@me`;
|
|
161
|
+
},
|
|
162
|
+
user: (channelId, userId)=>{
|
|
163
|
+
return `/channels/${channelId}/thread-members/${userId}`;
|
|
164
|
+
},
|
|
165
|
+
archived: (channelId)=>{
|
|
166
|
+
return `/channels/${channelId}/threads/archived`;
|
|
167
|
+
},
|
|
168
|
+
public: (channelId, options)=>{
|
|
169
|
+
let url = `/channels/${channelId}/threads/archived/public?`;
|
|
170
|
+
if (options) {
|
|
171
|
+
if (options.before) {
|
|
172
|
+
url += `before=${new Date(options.before).toISOString()}`;
|
|
173
|
+
}
|
|
174
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
175
|
+
if (options.limit) url += `&limit=${options.limit}`;
|
|
176
|
+
}
|
|
177
|
+
return url;
|
|
178
|
+
},
|
|
179
|
+
private: (channelId, options)=>{
|
|
180
|
+
let url = `/channels/${channelId}/threads/archived/private?`;
|
|
181
|
+
if (options) {
|
|
182
|
+
if (options.before) {
|
|
183
|
+
url += `before=${new Date(options.before).toISOString()}`;
|
|
184
|
+
}
|
|
185
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
186
|
+
if (options.limit) url += `&limit=${options.limit}`;
|
|
187
|
+
}
|
|
188
|
+
return url;
|
|
189
|
+
},
|
|
190
|
+
joined: (channelId, options)=>{
|
|
191
|
+
let url = `/channels/${channelId}/users/@me/threads/archived/private?`;
|
|
192
|
+
if (options) {
|
|
193
|
+
if (options.before) {
|
|
194
|
+
url += `before=${new Date(options.before).toISOString()}`;
|
|
195
|
+
}
|
|
196
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
197
|
+
if (options.limit) url += `&limit=${options.limit}`;
|
|
198
|
+
}
|
|
199
|
+
return url;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
typing: (channelId)=>{
|
|
203
|
+
return `/channels/${channelId}/typing`;
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
// Guild Endpoints
|
|
207
|
+
guilds: {
|
|
208
|
+
all: ()=>{
|
|
209
|
+
return '/guilds';
|
|
210
|
+
},
|
|
211
|
+
auditlogs: (guildId, options)=>{
|
|
212
|
+
let url = `/guilds/${guildId}/audit-logs?`;
|
|
213
|
+
if (options) {
|
|
214
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
215
|
+
if (options.actionType) url += `action_type=${options.actionType}`;
|
|
216
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
217
|
+
if (options.before) url += `&before=${options.before}`;
|
|
218
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
219
|
+
if (options.limit) url += `&limit=${options.limit}`;
|
|
220
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
221
|
+
if (options.userId) url += `&user_id=${options.userId}`;
|
|
222
|
+
}
|
|
223
|
+
return url;
|
|
224
|
+
},
|
|
225
|
+
automod: {
|
|
226
|
+
rule: (guildId, ruleId)=>{
|
|
227
|
+
return `/guilds/${guildId}/auto-moderation/rules/${ruleId}`;
|
|
228
|
+
},
|
|
229
|
+
rules: (guildId)=>{
|
|
230
|
+
return `/guilds/${guildId}/auto-moderation/rules`;
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
channels: (guildId)=>{
|
|
234
|
+
return `/guilds/${guildId}/channels`;
|
|
235
|
+
},
|
|
236
|
+
emoji: (guildId, emojiId)=>{
|
|
237
|
+
return `/guilds/${guildId}/emojis/${emojiId}`;
|
|
238
|
+
},
|
|
239
|
+
emojis: (guildId)=>{
|
|
240
|
+
return `/guilds/${guildId}/emojis`;
|
|
241
|
+
},
|
|
242
|
+
events: {
|
|
243
|
+
events: (guildId, withUserCount)=>{
|
|
244
|
+
let url = `/guilds/${guildId}/scheduled-events?`;
|
|
245
|
+
if (withUserCount !== undefined) {
|
|
246
|
+
url += `with_user_count=${withUserCount.toString()}`;
|
|
247
|
+
}
|
|
248
|
+
return url;
|
|
249
|
+
},
|
|
250
|
+
event: (guildId, eventId, withUserCount)=>{
|
|
251
|
+
let url = `/guilds/${guildId}/scheduled-events/${eventId}`;
|
|
252
|
+
if (withUserCount !== undefined) {
|
|
253
|
+
url += `with_user_count=${withUserCount.toString()}`;
|
|
254
|
+
}
|
|
255
|
+
return url;
|
|
256
|
+
},
|
|
257
|
+
users: (guildId, eventId, options)=>{
|
|
258
|
+
let url = `/guilds/${guildId}/scheduled-events/${eventId}/users?`;
|
|
259
|
+
if (options) {
|
|
260
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
261
|
+
if (options.limit !== undefined) url += `limit=${options.limit}`;
|
|
262
|
+
if (options.withMember !== undefined) {
|
|
263
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
264
|
+
url += `&with_member=${options.withMember.toString()}`;
|
|
265
|
+
}
|
|
266
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
267
|
+
if (options.after !== undefined) url += `&after=${options.after}`;
|
|
268
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
269
|
+
if (options.before !== undefined) url += `&before=${options.before}`;
|
|
270
|
+
}
|
|
271
|
+
return url;
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
guild (guildId, withCounts) {
|
|
275
|
+
let url = `/guilds/${guildId}?`;
|
|
276
|
+
if (withCounts !== undefined) {
|
|
277
|
+
url += `with_counts=${withCounts.toString()}`;
|
|
278
|
+
}
|
|
279
|
+
return url;
|
|
280
|
+
},
|
|
281
|
+
integration (guildId, integrationId) {
|
|
282
|
+
return `/guilds/${guildId}/integrations/${integrationId}`;
|
|
283
|
+
},
|
|
284
|
+
integrations: (guildId)=>{
|
|
285
|
+
return `/guilds/${guildId}/integrations?include_applications=true`;
|
|
286
|
+
},
|
|
287
|
+
invite (inviteCode, options) {
|
|
288
|
+
let url = `/invites/${inviteCode}?`;
|
|
289
|
+
if (options) {
|
|
290
|
+
if (options.withCounts !== undefined) {
|
|
291
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
292
|
+
url += `with_counts=${options.withCounts.toString()}`;
|
|
293
|
+
}
|
|
294
|
+
if (options.withExpiration !== undefined) {
|
|
295
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
296
|
+
url += `&with_expiration=${options.withExpiration.toString()}`;
|
|
297
|
+
}
|
|
298
|
+
if (options.scheduledEventId) {
|
|
299
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
300
|
+
url += `&guild_scheduled_event_id=${options.scheduledEventId}`;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return url;
|
|
304
|
+
},
|
|
305
|
+
invites: (guildId)=>{
|
|
306
|
+
return `/guilds/${guildId}/invites`;
|
|
307
|
+
},
|
|
308
|
+
leave: (guildId)=>{
|
|
309
|
+
return `/users/@me/guilds/${guildId}`;
|
|
310
|
+
},
|
|
311
|
+
members: {
|
|
312
|
+
ban: (guildId, userId)=>{
|
|
313
|
+
return `/guilds/${guildId}/bans/${userId}`;
|
|
314
|
+
},
|
|
315
|
+
bans: (guildId, options)=>{
|
|
316
|
+
let url = `/guilds/${guildId}/bans?`;
|
|
317
|
+
if (options) {
|
|
318
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
319
|
+
if (options.limit) url += `limit=${options.limit}`;
|
|
320
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
321
|
+
if (options.after) url += `&after=${options.after}`;
|
|
322
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
323
|
+
if (options.before) url += `&before=${options.before}`;
|
|
324
|
+
}
|
|
325
|
+
return url;
|
|
326
|
+
},
|
|
327
|
+
bot: (guildId)=>{
|
|
328
|
+
return `/guilds/${guildId}/members/@me`;
|
|
329
|
+
},
|
|
330
|
+
member: (guildId, userId)=>{
|
|
331
|
+
return `/guilds/${guildId}/members/${userId}`;
|
|
332
|
+
},
|
|
333
|
+
members: (guildId, options)=>{
|
|
334
|
+
let url = `/guilds/${guildId}/members?`;
|
|
335
|
+
if (options !== undefined) {
|
|
336
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
337
|
+
if (options.limit) url += `limit=${options.limit}`;
|
|
338
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
339
|
+
if (options.after) url += `&after=${options.after}`;
|
|
340
|
+
}
|
|
341
|
+
return url;
|
|
342
|
+
},
|
|
343
|
+
search: (guildId, query, options)=>{
|
|
344
|
+
let url = `/guilds/${guildId}/members/search?query=${encodeURIComponent(query)}`;
|
|
345
|
+
if (options) {
|
|
346
|
+
if (options.limit !== undefined) url += `&limit=${options.limit}`;
|
|
347
|
+
}
|
|
348
|
+
return url;
|
|
349
|
+
},
|
|
350
|
+
prune: (guildId, options)=>{
|
|
351
|
+
let url = `/guilds/${guildId}/prune?`;
|
|
352
|
+
if (options) {
|
|
353
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
354
|
+
if (options.days) url += `days=${options.days}`;
|
|
355
|
+
if (Array.isArray(options.includeRoles)) {
|
|
356
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
357
|
+
url += `&include_roles=${options.includeRoles.join(',')}`;
|
|
358
|
+
} else if (options.includeRoles) {
|
|
359
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
360
|
+
url += `&include_roles=${options.includeRoles}`;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return url;
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
mfa: (guildId)=>`/guilds/${guildId}/mfa`,
|
|
367
|
+
preview: (guildId)=>{
|
|
368
|
+
return `/guilds/${guildId}/preview`;
|
|
369
|
+
},
|
|
370
|
+
prune: (guildId, options)=>{
|
|
371
|
+
let url = `/guilds/${guildId}/prune?`;
|
|
372
|
+
if (options) {
|
|
373
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
374
|
+
if (options.days) url += `days=${options.days}`;
|
|
375
|
+
if (Array.isArray(options.includeRoles)) {
|
|
376
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
377
|
+
url += `&include_roles=${options.includeRoles.join(',')}`;
|
|
378
|
+
} else if (options.includeRoles) {
|
|
379
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
380
|
+
url += `&include_roles=${options.includeRoles}`;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
return url;
|
|
384
|
+
},
|
|
385
|
+
roles: {
|
|
386
|
+
one: (guildId, roleId)=>{
|
|
387
|
+
return `/guilds/${guildId}/roles/${roleId}`;
|
|
388
|
+
},
|
|
389
|
+
all: (guildId)=>{
|
|
390
|
+
return `/guilds/${guildId}/roles`;
|
|
391
|
+
},
|
|
392
|
+
member: (guildId, memberId, roleId)=>{
|
|
393
|
+
return `/guilds/${guildId}/members/${memberId}/roles/${roleId}`;
|
|
394
|
+
}
|
|
395
|
+
},
|
|
396
|
+
stickers: (guildId)=>{
|
|
397
|
+
return `/guilds/${guildId}/stickers`;
|
|
398
|
+
},
|
|
399
|
+
sticker: (guildId, stickerId)=>{
|
|
400
|
+
return `/guilds/${guildId}/stickers/${stickerId}`;
|
|
401
|
+
},
|
|
402
|
+
voice: (guildId, userId)=>{
|
|
403
|
+
return `/guilds/${guildId}/voice-states/${userId ?? '@me'}`;
|
|
404
|
+
},
|
|
405
|
+
templates: {
|
|
406
|
+
code: (code)=>{
|
|
407
|
+
return `/guilds/templates/${code}`;
|
|
408
|
+
},
|
|
409
|
+
guild: (guildId, code)=>{
|
|
410
|
+
return `/guilds/${guildId}/templates/${code}`;
|
|
411
|
+
},
|
|
412
|
+
all: (guildId)=>{
|
|
413
|
+
return `/guilds/${guildId}/templates`;
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
vanity: (guildId)=>{
|
|
417
|
+
return `/guilds/${guildId}/vanity-url`;
|
|
418
|
+
},
|
|
419
|
+
regions: (guildId)=>{
|
|
420
|
+
return `/guilds/${guildId}/regions`;
|
|
421
|
+
},
|
|
422
|
+
webhooks: (guildId)=>{
|
|
423
|
+
return `/guilds/${guildId}/webhooks`;
|
|
424
|
+
},
|
|
425
|
+
welcome: (guildId)=>{
|
|
426
|
+
return `/guilds/${guildId}/welcome-screen`;
|
|
427
|
+
},
|
|
428
|
+
widget: (guildId)=>{
|
|
429
|
+
return `/guilds/${guildId}/widget`;
|
|
430
|
+
},
|
|
431
|
+
widgetJson: (guildId)=>{
|
|
432
|
+
return `/guilds/${guildId}/widget.json`;
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
sticker: (stickerId)=>{
|
|
436
|
+
return `/stickers/${stickerId}`;
|
|
437
|
+
},
|
|
438
|
+
regions: ()=>{
|
|
439
|
+
return '/voice/regions';
|
|
440
|
+
},
|
|
441
|
+
// Interaction Endpoints
|
|
442
|
+
interactions: {
|
|
443
|
+
commands: {
|
|
444
|
+
// Application Endpoints
|
|
445
|
+
commands: (applicationId)=>{
|
|
446
|
+
return `/applications/${applicationId}/commands`;
|
|
447
|
+
},
|
|
448
|
+
guilds: {
|
|
449
|
+
all (applicationId, guildId) {
|
|
450
|
+
return `/applications/${applicationId}/guilds/${guildId}/commands`;
|
|
451
|
+
},
|
|
452
|
+
one (applicationId, guildId, commandId, withLocalizations) {
|
|
453
|
+
let url = `/applications/${applicationId}/guilds/${guildId}/commands/${commandId}?`;
|
|
454
|
+
if (withLocalizations !== undefined) {
|
|
455
|
+
url += `with_localizations=${withLocalizations.toString()}`;
|
|
456
|
+
}
|
|
457
|
+
return url;
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
permissions: (applicationId, guildId)=>{
|
|
461
|
+
return `/applications/${applicationId}/guilds/${guildId}/commands/permissions`;
|
|
462
|
+
},
|
|
463
|
+
permission: (applicationId, guildId, commandId)=>{
|
|
464
|
+
return `/applications/${applicationId}/guilds/${guildId}/commands/${commandId}/permissions`;
|
|
465
|
+
},
|
|
466
|
+
command: (applicationId, commandId, withLocalizations)=>{
|
|
467
|
+
let url = `/applications/${applicationId}/commands/${commandId}?`;
|
|
468
|
+
if (withLocalizations !== undefined) {
|
|
469
|
+
url += `withLocalizations=${withLocalizations.toString()}`;
|
|
470
|
+
}
|
|
471
|
+
return url;
|
|
472
|
+
}
|
|
473
|
+
},
|
|
474
|
+
responses: {
|
|
475
|
+
// Interaction Endpoints
|
|
476
|
+
callback: (interactionId, token)=>{
|
|
477
|
+
return `/interactions/${interactionId}/${token}/callback`;
|
|
478
|
+
},
|
|
479
|
+
original: (interactionId, token)=>{
|
|
480
|
+
return `/webhooks/${interactionId}/${token}/messages/@original`;
|
|
481
|
+
},
|
|
482
|
+
message: (applicationId, token, messageId)=>{
|
|
483
|
+
return `/webhooks/${applicationId}/${token}/messages/${messageId}`;
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
},
|
|
487
|
+
// User endpoints
|
|
488
|
+
user (userId) {
|
|
489
|
+
return `/users/${userId}`;
|
|
490
|
+
},
|
|
491
|
+
userBot () {
|
|
492
|
+
return '/users/@me';
|
|
493
|
+
},
|
|
494
|
+
oauth2Application () {
|
|
495
|
+
return 'oauth2/applications/@me';
|
|
496
|
+
},
|
|
497
|
+
gatewayBot () {
|
|
498
|
+
return '/gateway/bot';
|
|
499
|
+
},
|
|
500
|
+
nitroStickerPacks () {
|
|
501
|
+
return '/sticker-packs';
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
checkRateLimits (url) {
|
|
505
|
+
const ratelimited = rest.rateLimitedPaths.get(url);
|
|
506
|
+
const global = rest.rateLimitedPaths.get('global');
|
|
507
|
+
const now = Date.now();
|
|
508
|
+
if (ratelimited && now < ratelimited.resetTimestamp) {
|
|
509
|
+
return ratelimited.resetTimestamp - now;
|
|
510
|
+
}
|
|
511
|
+
if (global && now < global.resetTimestamp) {
|
|
512
|
+
return global.resetTimestamp - now;
|
|
513
|
+
}
|
|
514
|
+
return false;
|
|
515
|
+
},
|
|
516
|
+
changeToDiscordFormat (obj) {
|
|
517
|
+
if (obj === null) return null;
|
|
518
|
+
if (typeof obj === 'object') {
|
|
519
|
+
if (Array.isArray(obj)) {
|
|
520
|
+
return obj.map((item)=>rest.changeToDiscordFormat(item));
|
|
521
|
+
}
|
|
522
|
+
const newObj = {};
|
|
523
|
+
for (const key of Object.keys(obj)){
|
|
524
|
+
// Keys that dont require snake casing
|
|
525
|
+
if ([
|
|
526
|
+
'permissions',
|
|
527
|
+
'allow',
|
|
528
|
+
'deny'
|
|
529
|
+
].includes(key)) {
|
|
530
|
+
newObj[key] = calculateBits(obj[key]);
|
|
531
|
+
continue;
|
|
532
|
+
}
|
|
533
|
+
if (key === 'defaultMemberPermissions') {
|
|
534
|
+
newObj.default_member_permissions = calculateBits(obj[key]);
|
|
535
|
+
continue;
|
|
536
|
+
}
|
|
537
|
+
newObj[camelToSnakeCase(key)] = rest.changeToDiscordFormat(obj[key]);
|
|
538
|
+
}
|
|
539
|
+
return newObj;
|
|
540
|
+
}
|
|
541
|
+
if (typeof obj === 'bigint') return obj.toString();
|
|
542
|
+
return obj;
|
|
543
|
+
},
|
|
544
|
+
createRequest (options) {
|
|
545
|
+
const headers = {
|
|
546
|
+
'user-agent': `DiscordBot (https://github.com/discordeno/discordeno, v${version})`
|
|
547
|
+
};
|
|
548
|
+
if (!options.unauthorized) headers.authorization = `Bot ${rest.token}`;
|
|
549
|
+
// SOMETIMES SPECIAL HEADERS (E.G. CUSTOM AUTHORIZATION) NEED TO BE USED
|
|
550
|
+
if (options.headers) {
|
|
551
|
+
for(const key in options.headers){
|
|
552
|
+
headers[key.toLowerCase()] = options.headers[key];
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
// GET METHODS SHOULD NOT HAVE A BODY
|
|
556
|
+
if (options.method === 'GET') {
|
|
557
|
+
options.body = undefined;
|
|
558
|
+
}
|
|
559
|
+
// IF A REASON IS PROVIDED ENCODE IT IN HEADERS
|
|
560
|
+
if (options.body?.reason) {
|
|
561
|
+
headers['X-Audit-Log-Reason'] = encodeURIComponent(options.body.reason);
|
|
562
|
+
options.body.reason = undefined;
|
|
563
|
+
}
|
|
564
|
+
if (options.body) {
|
|
565
|
+
const { file } = options.body;
|
|
566
|
+
if (file) {
|
|
567
|
+
const files = findFiles(file);
|
|
568
|
+
const form = new FormData();
|
|
569
|
+
// WHEN CREATING A STICKER, DISCORD WANTS FORM DATA ONLY
|
|
570
|
+
if (options.url?.endsWith('/stickers') && options.method === 'POST') {
|
|
571
|
+
form.append('file', files[0].blob, files[0].name);
|
|
572
|
+
form.append('name', options.body.name);
|
|
573
|
+
form.append('description', options.body.description);
|
|
574
|
+
form.append('tags', options.body.tags);
|
|
575
|
+
} else {
|
|
576
|
+
for(let i = 0; i < files.length; i++){
|
|
577
|
+
form.append(`file${i}`, files[i].blob, files[i].name);
|
|
578
|
+
}
|
|
579
|
+
if (file) options.body.file = undefined;
|
|
580
|
+
form.append('payload_json', JSON.stringify(rest.changeToDiscordFormat(options.body)));
|
|
581
|
+
}
|
|
582
|
+
options.body.file = form;
|
|
583
|
+
} else if (options.body && ![
|
|
584
|
+
'GET',
|
|
585
|
+
'DELETE'
|
|
586
|
+
].includes(options.method)) {
|
|
587
|
+
headers['Content-Type'] = 'application/json';
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
return {
|
|
591
|
+
headers,
|
|
592
|
+
body: options.body?.file ?? JSON.stringify(rest.changeToDiscordFormat(options.body)),
|
|
593
|
+
method: options.method
|
|
594
|
+
};
|
|
595
|
+
},
|
|
596
|
+
processRateLimitedPaths () {
|
|
597
|
+
const now = Date.now();
|
|
598
|
+
for (const [key, value] of rest.rateLimitedPaths.entries()){
|
|
599
|
+
// rest.debug(
|
|
600
|
+
// `[REST - processRateLimitedPaths] Running for of loop. ${
|
|
601
|
+
// value.resetTimestamp - now
|
|
602
|
+
// }`
|
|
603
|
+
// )
|
|
604
|
+
// If the time has not reached cancel
|
|
605
|
+
if (value.resetTimestamp > now) continue;
|
|
606
|
+
// Rate limit is over, delete the rate limiter
|
|
607
|
+
rest.rateLimitedPaths.delete(key);
|
|
608
|
+
// If it was global, also mark the global value as false
|
|
609
|
+
if (key === 'global') rest.globallyRateLimited = false;
|
|
610
|
+
}
|
|
611
|
+
// ALL PATHS ARE CLEARED CAN CANCEL OUT!
|
|
612
|
+
if (rest.rateLimitedPaths.size === 0) {
|
|
613
|
+
rest.processingRateLimitedPaths = false;
|
|
614
|
+
} else {
|
|
615
|
+
rest.processingRateLimitedPaths = true;
|
|
616
|
+
// RECHECK IN 1 SECOND
|
|
617
|
+
setTimeout(()=>{
|
|
618
|
+
// rest.debug('[REST - processRateLimitedPaths] Running setTimeout.')
|
|
619
|
+
rest.processRateLimitedPaths();
|
|
620
|
+
}, 1000);
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
/** Processes the rate limit headers and determines if it needs to be rate limited and returns the bucket id if available */ processHeaders (url, headers) {
|
|
624
|
+
let rateLimited = false;
|
|
625
|
+
// GET ALL NECESSARY HEADERS
|
|
626
|
+
const remaining = headers.get('x-ratelimit-remaining');
|
|
627
|
+
const retryAfter = headers.get('x-ratelimit-reset-after');
|
|
628
|
+
const reset = Date.now() + Number(retryAfter) * 1000;
|
|
629
|
+
const global = headers.get('x-ratelimit-global');
|
|
630
|
+
// undefined override null needed for typings
|
|
631
|
+
const bucketId = headers.get('x-ratelimit-bucket') ?? undefined;
|
|
632
|
+
const limit = headers.get('x-ratelimit-limit');
|
|
633
|
+
rest.queues.get(url)?.handleCompletedRequest({
|
|
634
|
+
remaining: remaining ? Number(remaining) : undefined,
|
|
635
|
+
interval: retryAfter ? Number(retryAfter) * 1000 : undefined,
|
|
636
|
+
max: limit ? Number(limit) : undefined
|
|
637
|
+
});
|
|
638
|
+
// IF THERE IS NO REMAINING RATE LIMIT, MARK IT AS RATE LIMITED
|
|
639
|
+
if (remaining === '0') {
|
|
640
|
+
rateLimited = true;
|
|
641
|
+
// SAVE THE URL AS LIMITED, IMPORTANT FOR NEW REQUESTS BY USER WITHOUT BUCKET
|
|
642
|
+
rest.rateLimitedPaths.set(url, {
|
|
643
|
+
url,
|
|
644
|
+
resetTimestamp: reset,
|
|
645
|
+
bucketId
|
|
646
|
+
});
|
|
647
|
+
// SAVE THE BUCKET AS LIMITED SINCE DIFFERENT URLS MAY SHARE A BUCKET
|
|
648
|
+
if (bucketId) {
|
|
649
|
+
rest.rateLimitedPaths.set(bucketId, {
|
|
650
|
+
url,
|
|
651
|
+
resetTimestamp: reset,
|
|
652
|
+
bucketId
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
// IF THERE IS NO REMAINING GLOBAL LIMIT, MARK IT RATE LIMITED GLOBALLY
|
|
657
|
+
if (global) {
|
|
658
|
+
const retryAfter1 = headers.get('retry-after');
|
|
659
|
+
const globalReset = Date.now() + Number(retryAfter1) * 1000;
|
|
660
|
+
// rest.debug(
|
|
661
|
+
// `[REST = Globally Rate Limited] URL: ${url} | Global Rest: ${globalReset}`
|
|
662
|
+
// )
|
|
663
|
+
rest.globallyRateLimited = true;
|
|
664
|
+
rateLimited = true;
|
|
665
|
+
setTimeout(()=>{
|
|
666
|
+
rest.globallyRateLimited = false;
|
|
667
|
+
}, globalReset);
|
|
668
|
+
rest.rateLimitedPaths.set('global', {
|
|
669
|
+
url: 'global',
|
|
670
|
+
resetTimestamp: globalReset,
|
|
671
|
+
bucketId
|
|
672
|
+
});
|
|
673
|
+
if (bucketId) {
|
|
674
|
+
rest.rateLimitedPaths.set(bucketId, {
|
|
675
|
+
url: 'global',
|
|
676
|
+
resetTimestamp: globalReset,
|
|
677
|
+
bucketId
|
|
678
|
+
});
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
if (rateLimited && !rest.processingRateLimitedPaths) {
|
|
682
|
+
rest.processRateLimitedPaths();
|
|
683
|
+
}
|
|
684
|
+
return rateLimited ? bucketId : undefined;
|
|
685
|
+
},
|
|
686
|
+
async sendRequest (options) {
|
|
687
|
+
const url = options.url.startsWith('https://') ? options.url : `${rest.baseUrl}/v${rest.version}${options.url}`;
|
|
688
|
+
const payload = rest.createRequest({
|
|
689
|
+
method: options.method,
|
|
690
|
+
url: options.url,
|
|
691
|
+
body: options.body,
|
|
692
|
+
...options.options
|
|
693
|
+
});
|
|
694
|
+
logger.debug(`sending request to ${url}`, 'with payload:', {
|
|
695
|
+
...payload,
|
|
696
|
+
headers: {
|
|
697
|
+
...payload.headers,
|
|
698
|
+
authorization: 'Bot tokenhere'
|
|
699
|
+
}
|
|
700
|
+
});
|
|
701
|
+
const response = await fetch(url, payload);
|
|
702
|
+
logger.debug(`request fetched from ${url} with status ${response.status} & ${response.statusText}`);
|
|
703
|
+
// Set the bucket id if it was available on the headers
|
|
704
|
+
const bucketId = rest.processHeaders(rest.simplifyUrl(options.url, options.method), response.headers);
|
|
705
|
+
if (bucketId) options.bucketId = bucketId;
|
|
706
|
+
if (response.status < 200 || response.status >= 400) {
|
|
707
|
+
logger.debug(`Request to ${url} failed.`);
|
|
708
|
+
if (response.status === 429) {
|
|
709
|
+
logger.debug(`Request to ${url} was ratelimited.`);
|
|
710
|
+
// Too many attempts, get rid of request from queue.
|
|
711
|
+
if (options.retryCount++ >= rest.maxRetryCount) {
|
|
712
|
+
logger.debug(`Request to ${url} exceeded the maximum allowed retries.`, 'with payload:', payload);
|
|
713
|
+
// rest.debug(`[REST - RetriesMaxed] ${JSON.stringify(options)}`)
|
|
714
|
+
// Remove item from queue to prevent retry
|
|
715
|
+
return options.reject({
|
|
716
|
+
ok: false,
|
|
717
|
+
status: response.status,
|
|
718
|
+
error: 'The options was rate limited and it maxed out the retries limit.'
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
// Rate limited, add back to queue
|
|
722
|
+
rest.invalidBucket.handleCompletedRequest(response.status, response.headers.get('X-RateLimit-Scope') === 'shared');
|
|
723
|
+
const resetAfter = response.headers.get('x-ratelimit-reset-after');
|
|
724
|
+
if (resetAfter) await delay(Number(resetAfter) * 1000);
|
|
725
|
+
// process the response to prevent mem leak
|
|
726
|
+
await response.json();
|
|
727
|
+
return await options.retryRequest?.(options);
|
|
728
|
+
}
|
|
729
|
+
return options.reject({
|
|
730
|
+
ok: false,
|
|
731
|
+
status: response.status,
|
|
732
|
+
body: JSON.stringify(await response.json())
|
|
733
|
+
});
|
|
734
|
+
}
|
|
735
|
+
const is204 = response.status === 204;
|
|
736
|
+
const json = is204 ? undefined : await response.json();
|
|
737
|
+
// Discord sometimes sends no response with 204 code
|
|
738
|
+
return options.resolve({
|
|
739
|
+
ok: true,
|
|
740
|
+
status: response.status,
|
|
741
|
+
body: JSON.stringify(json)
|
|
742
|
+
});
|
|
743
|
+
},
|
|
744
|
+
// Credits: github.com/abalabahaha/eris lib/rest/RequestHandler.js#L397
|
|
745
|
+
// Modified for our use-case
|
|
746
|
+
simplifyUrl (url, method) {
|
|
747
|
+
let route = url.replace(/\/([a-z-]+)\/(?:[0-9]{17,19})/g, function(match, p) {
|
|
748
|
+
return [
|
|
749
|
+
'channels',
|
|
750
|
+
'guilds'
|
|
751
|
+
].includes(p) ? match : `/${p}/x`;
|
|
752
|
+
}).replace(/\/reactions\/[^/]+/g, '/reactions/x');
|
|
753
|
+
// GENERAL /reactions and /reactions/emoji/@me share the buckets
|
|
754
|
+
if (route.includes('/reactions')) {
|
|
755
|
+
route = route.substring(0, route.indexOf('/reactions') + '/reactions'.length);
|
|
756
|
+
}
|
|
757
|
+
// Delete Message endpoint has its own rate limit
|
|
758
|
+
if (method === 'DELETE' && route.endsWith('/messages/x')) {
|
|
759
|
+
route = method + route;
|
|
760
|
+
}
|
|
761
|
+
return route;
|
|
762
|
+
},
|
|
763
|
+
processRequest (request) {
|
|
764
|
+
const route = request.url.substring(request.url.indexOf('api/'));
|
|
765
|
+
const parts = route.split('/');
|
|
766
|
+
// Remove the api/
|
|
767
|
+
parts.shift();
|
|
768
|
+
// Removes the /v#/
|
|
769
|
+
if (parts[0]?.startsWith('v')) parts.shift();
|
|
770
|
+
// Set the full url to discord api in case it was recieved in a proxy rest
|
|
771
|
+
request.url = `${rest.baseUrl}/v${rest.version}/${parts.join('/')}`;
|
|
772
|
+
const url = rest.simplifyUrl(request.url, request.method);
|
|
773
|
+
const queue = rest.queues.get(url);
|
|
774
|
+
if (queue !== undefined) {
|
|
775
|
+
queue.makeRequest(request);
|
|
776
|
+
} else {
|
|
777
|
+
// CREATES A NEW QUEUE
|
|
778
|
+
const bucketQueue = new Queue(rest, {
|
|
779
|
+
url,
|
|
780
|
+
deleteQueueDelay: rest.deleteQueueDelay
|
|
781
|
+
});
|
|
782
|
+
// Add request to queue
|
|
783
|
+
bucketQueue.makeRequest(request);
|
|
784
|
+
// Save queue
|
|
785
|
+
rest.queues.set(url, bucketQueue);
|
|
786
|
+
}
|
|
787
|
+
},
|
|
788
|
+
async makeRequest (method, url, body, options) {
|
|
789
|
+
return await new Promise((resolve, reject)=>{
|
|
790
|
+
const payload = {
|
|
791
|
+
url,
|
|
792
|
+
method,
|
|
793
|
+
body,
|
|
794
|
+
retryCount: 0,
|
|
795
|
+
retryRequest: async function(options) {
|
|
796
|
+
rest.processRequest(payload);
|
|
797
|
+
},
|
|
798
|
+
resolve: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined),
|
|
799
|
+
reject,
|
|
800
|
+
options
|
|
801
|
+
};
|
|
802
|
+
rest.processRequest(payload);
|
|
803
|
+
});
|
|
804
|
+
},
|
|
805
|
+
async get (url) {
|
|
806
|
+
return camelize(await rest.makeRequest('GET', url));
|
|
807
|
+
},
|
|
808
|
+
async post (url, body) {
|
|
809
|
+
return camelize(await rest.makeRequest('POST', url, body));
|
|
810
|
+
},
|
|
811
|
+
async delete (url, body) {
|
|
812
|
+
return camelize(await rest.makeRequest('DELETE', url, body));
|
|
813
|
+
},
|
|
814
|
+
async patch (url, body) {
|
|
815
|
+
return camelize(await rest.makeRequest('PATCH', url, body));
|
|
816
|
+
},
|
|
817
|
+
async put (url, body, options) {
|
|
818
|
+
return camelize(await rest.makeRequest('PUT', url, body, options));
|
|
819
|
+
},
|
|
820
|
+
async addReaction (channelId, messageId, reaction) {
|
|
821
|
+
reaction = processReactionString(reaction);
|
|
822
|
+
return await rest.put(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
823
|
+
},
|
|
824
|
+
async addReactions (channelId, messageId, reactions, ordered = false) {
|
|
825
|
+
if (!ordered) {
|
|
826
|
+
await Promise.all(reactions.map(async (reaction)=>await rest.addReaction(channelId, messageId, reaction)));
|
|
827
|
+
return;
|
|
828
|
+
}
|
|
829
|
+
for (const reaction of reactions){
|
|
830
|
+
await rest.addReaction(channelId, messageId, reaction);
|
|
831
|
+
}
|
|
832
|
+
},
|
|
833
|
+
async addRole (guildId, userId, roleId, reason) {
|
|
834
|
+
return await rest.put(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
835
|
+
reason
|
|
836
|
+
});
|
|
837
|
+
},
|
|
838
|
+
async addThreadMember (channelId, userId) {
|
|
839
|
+
return await rest.put(rest.routes.channels.threads.user(channelId, userId));
|
|
840
|
+
},
|
|
841
|
+
async createAutomodRule (guildId, options) {
|
|
842
|
+
return await rest.post(rest.routes.guilds.automod.rules(guildId), options);
|
|
843
|
+
},
|
|
844
|
+
async createChannel (guildId, options) {
|
|
845
|
+
return await rest.post(rest.routes.guilds.channels(guildId), options);
|
|
846
|
+
},
|
|
847
|
+
async createEmoji (guildId, options) {
|
|
848
|
+
return await rest.post(rest.routes.guilds.emojis(guildId), options);
|
|
849
|
+
},
|
|
850
|
+
async createGlobalApplicationCommand (command) {
|
|
851
|
+
return await rest.post(rest.routes.interactions.commands.commands(rest.applicationId), command);
|
|
852
|
+
},
|
|
853
|
+
async createGuild (options) {
|
|
854
|
+
return await rest.post(rest.routes.guilds.all(), options);
|
|
855
|
+
},
|
|
856
|
+
async createGuildApplicationCommand (command, guildId) {
|
|
857
|
+
return await rest.post(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), command);
|
|
858
|
+
},
|
|
859
|
+
async createGuildFromTemplate (templateCode, options) {
|
|
860
|
+
if (options.icon) {
|
|
861
|
+
options.icon = await urlToBase64(options.icon);
|
|
862
|
+
}
|
|
863
|
+
return await rest.post(rest.routes.guilds.templates.code(templateCode), options);
|
|
864
|
+
},
|
|
865
|
+
async createGuildSticker (guildId, options) {
|
|
866
|
+
return await rest.post(rest.routes.guilds.stickers(guildId), options);
|
|
867
|
+
},
|
|
868
|
+
async createGuildTemplate (guildId, options) {
|
|
869
|
+
return await rest.post(rest.routes.guilds.templates.all(guildId), options);
|
|
870
|
+
},
|
|
871
|
+
async createForumThread (channelId, options) {
|
|
872
|
+
return await rest.post(rest.routes.channels.forum(channelId), options);
|
|
873
|
+
},
|
|
874
|
+
async createInvite (channelId, options = {}) {
|
|
875
|
+
return await rest.post(rest.routes.channels.invites(channelId), options);
|
|
876
|
+
},
|
|
877
|
+
async createRole (guildId, options, reason) {
|
|
878
|
+
return await rest.post(rest.routes.guilds.roles.all(guildId), {
|
|
879
|
+
...options,
|
|
880
|
+
reason
|
|
881
|
+
});
|
|
882
|
+
},
|
|
883
|
+
async createScheduledEvent (guildId, options) {
|
|
884
|
+
return await rest.post(rest.routes.guilds.events.events(guildId), options);
|
|
885
|
+
},
|
|
886
|
+
async createStageInstance (options) {
|
|
887
|
+
return await rest.post(rest.routes.channels.stages(), options);
|
|
888
|
+
},
|
|
889
|
+
async createWebhook (channelId, options) {
|
|
890
|
+
return await rest.post(rest.routes.channels.webhooks(channelId), {
|
|
891
|
+
name: options.name,
|
|
892
|
+
avatar: options.avatar ? await urlToBase64(options.avatar) : undefined,
|
|
893
|
+
reason: options.reason
|
|
894
|
+
});
|
|
895
|
+
},
|
|
896
|
+
async deleteAutomodRule (guildId, ruleId, reason) {
|
|
897
|
+
return await rest.delete(rest.routes.guilds.automod.rule(guildId, ruleId), {
|
|
898
|
+
reason
|
|
899
|
+
});
|
|
900
|
+
},
|
|
901
|
+
async deleteChannel (channelId, reason) {
|
|
902
|
+
return await rest.delete(rest.routes.channels.channel(channelId), {
|
|
903
|
+
reason
|
|
904
|
+
});
|
|
905
|
+
},
|
|
906
|
+
async deleteChannelPermissionOverride (channelId, overwriteId, reason) {
|
|
907
|
+
return await rest.delete(rest.routes.channels.overwrite(channelId, overwriteId), reason ? {
|
|
908
|
+
reason
|
|
909
|
+
} : undefined);
|
|
910
|
+
},
|
|
911
|
+
async deleteEmoji (guildId, id, reason) {
|
|
912
|
+
return await rest.delete(rest.routes.guilds.emoji(guildId, id), {
|
|
913
|
+
reason
|
|
914
|
+
});
|
|
915
|
+
},
|
|
916
|
+
async deleteFollowupMessage (token, messageId) {
|
|
917
|
+
return await rest.delete(rest.routes.interactions.responses.message(rest.applicationId, token, messageId));
|
|
918
|
+
},
|
|
919
|
+
async deleteGlobalApplicationCommand (commandId) {
|
|
920
|
+
return await rest.delete(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
921
|
+
},
|
|
922
|
+
async deleteGuild (guildId) {
|
|
923
|
+
return await rest.delete(rest.routes.guilds.guild(guildId));
|
|
924
|
+
},
|
|
925
|
+
async deleteGuildApplicationCommand (commandId, guildId) {
|
|
926
|
+
return await rest.delete(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
927
|
+
},
|
|
928
|
+
async deleteGuildSticker (guildId, stickerId, reason) {
|
|
929
|
+
return await rest.delete(rest.routes.guilds.sticker(guildId, stickerId), reason ? {
|
|
930
|
+
reason
|
|
931
|
+
} : undefined);
|
|
932
|
+
},
|
|
933
|
+
async deleteGuildTemplate (guildId, templateCode) {
|
|
934
|
+
return await rest.delete(rest.routes.guilds.templates.guild(guildId, templateCode));
|
|
935
|
+
},
|
|
936
|
+
async deleteIntegration (guildId, integrationId) {
|
|
937
|
+
return await rest.delete(rest.routes.guilds.integration(guildId, integrationId));
|
|
938
|
+
},
|
|
939
|
+
async deleteInvite (inviteCode, reason) {
|
|
940
|
+
return await rest.delete(rest.routes.guilds.invite(inviteCode), reason ? {
|
|
941
|
+
reason
|
|
942
|
+
} : undefined);
|
|
943
|
+
},
|
|
944
|
+
async deleteMessage (channelId, messageId, reason) {
|
|
945
|
+
return await rest.delete(rest.routes.channels.message(channelId, messageId), {
|
|
946
|
+
reason
|
|
947
|
+
});
|
|
948
|
+
},
|
|
949
|
+
async deleteMessages (channelId, messageIds, reason) {
|
|
950
|
+
return await rest.post(rest.routes.channels.bulk(channelId), {
|
|
951
|
+
messages: messageIds.slice(0, 100).map((id)=>id.toString()),
|
|
952
|
+
reason
|
|
953
|
+
});
|
|
954
|
+
},
|
|
955
|
+
async deleteOriginalInteractionResponse (token) {
|
|
956
|
+
return await rest.delete(rest.routes.interactions.responses.original(rest.applicationId, token));
|
|
957
|
+
},
|
|
958
|
+
async deleteOwnReaction (channelId, messageId, reaction) {
|
|
959
|
+
reaction = processReactionString(reaction);
|
|
960
|
+
return await rest.delete(rest.routes.channels.reactions.bot(channelId, messageId, reaction));
|
|
961
|
+
},
|
|
962
|
+
async deleteReactionsAll (channelId, messageId) {
|
|
963
|
+
return await rest.delete(rest.routes.channels.reactions.all(channelId, messageId));
|
|
964
|
+
},
|
|
965
|
+
async deleteReactionsEmoji (channelId, messageId, reaction) {
|
|
966
|
+
reaction = processReactionString(reaction);
|
|
967
|
+
return await rest.delete(rest.routes.channels.reactions.emoji(channelId, messageId, reaction));
|
|
968
|
+
},
|
|
969
|
+
async deleteRole (guildId, roleId) {
|
|
970
|
+
return await rest.delete(rest.routes.guilds.roles.one(guildId, roleId));
|
|
971
|
+
},
|
|
972
|
+
async deleteScheduledEvent (guildId, eventId) {
|
|
973
|
+
return await rest.delete(rest.routes.guilds.events.event(guildId, eventId));
|
|
974
|
+
},
|
|
975
|
+
async deleteStageInstance (channelId, reason) {
|
|
976
|
+
return await rest.delete(rest.routes.channels.stage(channelId), reason ? {
|
|
977
|
+
reason
|
|
978
|
+
} : undefined);
|
|
979
|
+
},
|
|
980
|
+
async deleteUserReaction (channelId, messageId, userId, reaction) {
|
|
981
|
+
reaction = processReactionString(reaction);
|
|
982
|
+
return await rest.delete(rest.routes.channels.reactions.user(channelId, messageId, reaction, userId));
|
|
983
|
+
},
|
|
984
|
+
async deleteWebhook (webhookId, reason) {
|
|
985
|
+
return await rest.delete(rest.routes.webhooks.id(webhookId), {
|
|
986
|
+
reason
|
|
987
|
+
});
|
|
988
|
+
},
|
|
989
|
+
async deleteWebhookMessage (webhookId, token, messageId, options) {
|
|
990
|
+
return await rest.delete(rest.routes.webhooks.message(webhookId, token, messageId, options));
|
|
991
|
+
},
|
|
992
|
+
async deleteWebhookWithToken (webhookId, token) {
|
|
993
|
+
return await rest.delete(rest.routes.webhooks.webhook(webhookId, token));
|
|
994
|
+
},
|
|
995
|
+
async editApplicationCommandPermissions (guildId, commandId, bearerToken, options) {
|
|
996
|
+
return await rest.put(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId), {
|
|
997
|
+
permissions: options
|
|
998
|
+
}, {
|
|
999
|
+
headers: {
|
|
1000
|
+
authorization: `Bearer ${bearerToken}`
|
|
1001
|
+
}
|
|
1002
|
+
});
|
|
1003
|
+
},
|
|
1004
|
+
async editAutomodRule (guildId, ruleId, options) {
|
|
1005
|
+
return await rest.patch(rest.routes.guilds.automod.rule(guildId, ruleId), options);
|
|
1006
|
+
},
|
|
1007
|
+
async editBotProfile (options) {
|
|
1008
|
+
const avatar = options?.botAvatarURL ? await urlToBase64(options?.botAvatarURL) : options?.botAvatarURL;
|
|
1009
|
+
return await rest.patch(rest.routes.userBot(), {
|
|
1010
|
+
username: options.username?.trim(),
|
|
1011
|
+
avatar
|
|
1012
|
+
});
|
|
1013
|
+
},
|
|
1014
|
+
async editChannel (channelId, options) {
|
|
1015
|
+
return await rest.patch(rest.routes.channels.channel(channelId), options);
|
|
1016
|
+
},
|
|
1017
|
+
async editChannelPermissionOverrides (channelId, options) {
|
|
1018
|
+
return await rest.put(rest.routes.channels.overwrite(channelId, options.id), options);
|
|
1019
|
+
},
|
|
1020
|
+
async editChannelPositions (guildId, channelPositions) {
|
|
1021
|
+
return await rest.patch(rest.routes.guilds.channels(guildId), channelPositions);
|
|
1022
|
+
},
|
|
1023
|
+
async editEmoji (guildId, id, options) {
|
|
1024
|
+
return await rest.patch(rest.routes.guilds.emoji(guildId, id), options);
|
|
1025
|
+
},
|
|
1026
|
+
async editFollowupMessage (token, messageId, options) {
|
|
1027
|
+
return await rest.patch(rest.routes.interactions.responses.message(rest.applicationId, token, messageId), options);
|
|
1028
|
+
},
|
|
1029
|
+
async editGlobalApplicationCommand (commandId, options) {
|
|
1030
|
+
return await rest.patch(rest.routes.interactions.commands.command(rest.applicationId, commandId), options);
|
|
1031
|
+
},
|
|
1032
|
+
async editGuild (guildId, options) {
|
|
1033
|
+
return await rest.patch(rest.routes.guilds.guild(guildId), options);
|
|
1034
|
+
},
|
|
1035
|
+
async editGuildApplicationCommand (commandId, guildId, options) {
|
|
1036
|
+
return await rest.patch(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId), options);
|
|
1037
|
+
},
|
|
1038
|
+
async editGuildMfaLevel (guildId, mfaLevel, reason) {
|
|
1039
|
+
return await rest.post(rest.routes.guilds.mfa(guildId), {
|
|
1040
|
+
level: mfaLevel,
|
|
1041
|
+
reason
|
|
1042
|
+
});
|
|
1043
|
+
},
|
|
1044
|
+
async editGuildSticker (guildId, stickerId, options) {
|
|
1045
|
+
return await rest.patch(rest.routes.guilds.sticker(guildId, stickerId), options);
|
|
1046
|
+
},
|
|
1047
|
+
async editGuildTemplate (guildId, templateCode, options) {
|
|
1048
|
+
return await rest.patch(rest.routes.guilds.templates.guild(guildId, templateCode), options);
|
|
1049
|
+
},
|
|
1050
|
+
async editMessage (channelId, messageId, options) {
|
|
1051
|
+
return await rest.patch(rest.routes.channels.message(channelId, messageId), options);
|
|
1052
|
+
},
|
|
1053
|
+
async editOriginalInteractionResponse (token, options) {
|
|
1054
|
+
return await rest.patch(rest.routes.interactions.responses.original(rest.applicationId, token), options);
|
|
1055
|
+
},
|
|
1056
|
+
async editOriginalWebhookMessage (webhookId, token, options) {
|
|
1057
|
+
return await rest.patch(rest.routes.webhooks.original(webhookId, token, options), {
|
|
1058
|
+
type: InteractionResponseTypes.UpdateMessage,
|
|
1059
|
+
data: options
|
|
1060
|
+
});
|
|
1061
|
+
},
|
|
1062
|
+
async editOwnVoiceState (guildId, options) {
|
|
1063
|
+
return await rest.patch(rest.routes.guilds.voice(guildId), {
|
|
1064
|
+
channel_id: options.channelId,
|
|
1065
|
+
suppress: options.suppress,
|
|
1066
|
+
request_to_speak_timestamp: options.requestToSpeakTimestamp ? new Date(options.requestToSpeakTimestamp).toISOString() : options.requestToSpeakTimestamp
|
|
1067
|
+
});
|
|
1068
|
+
},
|
|
1069
|
+
async editScheduledEvent (guildId, eventId, options) {
|
|
1070
|
+
return await rest.patch(rest.routes.guilds.events.event(guildId, eventId), options);
|
|
1071
|
+
},
|
|
1072
|
+
async editRole (guildId, roleId, options) {
|
|
1073
|
+
return await rest.patch(rest.routes.guilds.roles.one(guildId, roleId), options);
|
|
1074
|
+
},
|
|
1075
|
+
async editRolePositions (guildId, options) {
|
|
1076
|
+
return await rest.patch(rest.routes.guilds.roles.all(guildId), options);
|
|
1077
|
+
},
|
|
1078
|
+
async editStageInstance (channelId, data) {
|
|
1079
|
+
return await rest.patch(rest.routes.channels.stage(channelId), {
|
|
1080
|
+
topic: data.topic
|
|
1081
|
+
});
|
|
1082
|
+
},
|
|
1083
|
+
async editUserVoiceState (guildId, options) {
|
|
1084
|
+
return await rest.patch(rest.routes.guilds.voice(guildId, options.userId), {
|
|
1085
|
+
channel_id: options.channelId,
|
|
1086
|
+
suppress: options.suppress,
|
|
1087
|
+
user_id: options.userId
|
|
1088
|
+
});
|
|
1089
|
+
},
|
|
1090
|
+
async editWebhook (webhookId, options) {
|
|
1091
|
+
return await rest.patch(rest.routes.webhooks.id(webhookId), options);
|
|
1092
|
+
},
|
|
1093
|
+
async editWebhookMessage (webhookId, token, messageId, options) {
|
|
1094
|
+
return await rest.patch(rest.routes.webhooks.message(webhookId, token, messageId, options), options);
|
|
1095
|
+
},
|
|
1096
|
+
async editWebhookWithToken (webhookId, token, options) {
|
|
1097
|
+
return await rest.patch(rest.routes.webhooks.webhook(webhookId, token), options);
|
|
1098
|
+
},
|
|
1099
|
+
async editWelcomeScreen (guildId, options) {
|
|
1100
|
+
return await rest.patch(rest.routes.guilds.welcome(guildId), options);
|
|
1101
|
+
},
|
|
1102
|
+
async editWidgetSettings (guildId, options) {
|
|
1103
|
+
return await rest.patch(rest.routes.guilds.widget(guildId), options);
|
|
1104
|
+
},
|
|
1105
|
+
async executeWebhook (webhookId, token, options) {
|
|
1106
|
+
return await rest.post(rest.routes.webhooks.webhook(webhookId, token, options), options);
|
|
1107
|
+
},
|
|
1108
|
+
async followAnnouncement (sourceChannelId, targetChannelId) {
|
|
1109
|
+
return await rest.post(rest.routes.channels.follow(sourceChannelId), {
|
|
1110
|
+
webhook_channel_id: targetChannelId
|
|
1111
|
+
});
|
|
1112
|
+
},
|
|
1113
|
+
async getActiveThreads (guildId) {
|
|
1114
|
+
return await rest.get(rest.routes.channels.threads.active(guildId));
|
|
1115
|
+
},
|
|
1116
|
+
async getApplicationCommandPermission (guildId, commandId) {
|
|
1117
|
+
return await rest.get(rest.routes.interactions.commands.permission(rest.applicationId, guildId, commandId));
|
|
1118
|
+
},
|
|
1119
|
+
async getApplicationCommandPermissions (guildId) {
|
|
1120
|
+
return await rest.get(rest.routes.interactions.commands.permissions(rest.applicationId, guildId));
|
|
1121
|
+
},
|
|
1122
|
+
async getApplicationInfo () {
|
|
1123
|
+
return await rest.get(rest.routes.oauth2Application());
|
|
1124
|
+
},
|
|
1125
|
+
async getAuditLog (guildId, options) {
|
|
1126
|
+
return await rest.get(rest.routes.guilds.auditlogs(guildId, options));
|
|
1127
|
+
},
|
|
1128
|
+
async getAutomodRule (guildId, ruleId) {
|
|
1129
|
+
return await rest.get(rest.routes.guilds.automod.rule(guildId, ruleId));
|
|
1130
|
+
},
|
|
1131
|
+
async getAutomodRules (guildId) {
|
|
1132
|
+
return await rest.get(rest.routes.guilds.automod.rules(guildId));
|
|
1133
|
+
},
|
|
1134
|
+
async getAvailableVoiceRegions () {
|
|
1135
|
+
return await rest.get(rest.routes.regions());
|
|
1136
|
+
},
|
|
1137
|
+
async getBan (guildId, userId) {
|
|
1138
|
+
return await rest.get(rest.routes.guilds.members.ban(guildId, userId));
|
|
1139
|
+
},
|
|
1140
|
+
async getBans (guildId, options) {
|
|
1141
|
+
return await rest.get(rest.routes.guilds.members.bans(guildId, options));
|
|
1142
|
+
},
|
|
1143
|
+
async getChannel (id) {
|
|
1144
|
+
return await rest.get(rest.routes.channels.channel(id));
|
|
1145
|
+
},
|
|
1146
|
+
async getChannelInvites (channelId) {
|
|
1147
|
+
return await rest.get(rest.routes.channels.invites(channelId));
|
|
1148
|
+
},
|
|
1149
|
+
async getChannels (guildId) {
|
|
1150
|
+
return await rest.get(rest.routes.guilds.channels(guildId));
|
|
1151
|
+
},
|
|
1152
|
+
async getChannelWebhooks (channelId) {
|
|
1153
|
+
return await rest.get(rest.routes.channels.webhooks(channelId));
|
|
1154
|
+
},
|
|
1155
|
+
async getDmChannel (userId) {
|
|
1156
|
+
return await rest.post(rest.routes.channels.dm(), {
|
|
1157
|
+
recipient_id: userId.toString()
|
|
1158
|
+
});
|
|
1159
|
+
},
|
|
1160
|
+
async getEmoji (guildId, emojiId) {
|
|
1161
|
+
return await rest.get(rest.routes.guilds.emoji(guildId, emojiId));
|
|
1162
|
+
},
|
|
1163
|
+
async getEmojis (guildId) {
|
|
1164
|
+
return await rest.get(rest.routes.guilds.emojis(guildId));
|
|
1165
|
+
},
|
|
1166
|
+
async getFollowupMessage (token, messageId) {
|
|
1167
|
+
return await rest.get(rest.routes.interactions.responses.message(rest.applicationId, token, messageId));
|
|
1168
|
+
},
|
|
1169
|
+
async getGatewayBot () {
|
|
1170
|
+
return await rest.get(rest.routes.gatewayBot());
|
|
1171
|
+
},
|
|
1172
|
+
async getGlobalApplicationCommand (commandId) {
|
|
1173
|
+
return await rest.get(rest.routes.interactions.commands.command(rest.applicationId, commandId));
|
|
1174
|
+
},
|
|
1175
|
+
async getGlobalApplicationCommands () {
|
|
1176
|
+
return await rest.get(rest.routes.interactions.commands.commands(rest.applicationId));
|
|
1177
|
+
},
|
|
1178
|
+
async getGuild (guildId, options = {
|
|
1179
|
+
counts: true
|
|
1180
|
+
}) {
|
|
1181
|
+
return await rest.get(rest.routes.guilds.guild(guildId, options.counts));
|
|
1182
|
+
},
|
|
1183
|
+
async getGuildApplicationCommand (commandId, guildId) {
|
|
1184
|
+
return await rest.get(rest.routes.interactions.commands.guilds.one(rest.applicationId, guildId, commandId));
|
|
1185
|
+
},
|
|
1186
|
+
async getGuildApplicationCommands (guildId) {
|
|
1187
|
+
return await rest.get(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId));
|
|
1188
|
+
},
|
|
1189
|
+
async getGuildPreview (guildId) {
|
|
1190
|
+
return await rest.get(rest.routes.guilds.preview(guildId));
|
|
1191
|
+
},
|
|
1192
|
+
async getGuildTemplate (templateCode) {
|
|
1193
|
+
return await rest.get(rest.routes.guilds.templates.code(templateCode));
|
|
1194
|
+
},
|
|
1195
|
+
async getGuildTemplates (guildId) {
|
|
1196
|
+
return await rest.get(rest.routes.guilds.templates.all(guildId));
|
|
1197
|
+
},
|
|
1198
|
+
async getGuildWebhooks (guildId) {
|
|
1199
|
+
return await rest.get(rest.routes.guilds.webhooks(guildId));
|
|
1200
|
+
},
|
|
1201
|
+
async getIntegrations (guildId) {
|
|
1202
|
+
return await rest.get(rest.routes.guilds.integrations(guildId));
|
|
1203
|
+
},
|
|
1204
|
+
async getInvite (inviteCode, options) {
|
|
1205
|
+
return await rest.get(rest.routes.guilds.invite(inviteCode, options));
|
|
1206
|
+
},
|
|
1207
|
+
async getInvites (guildId) {
|
|
1208
|
+
return await rest.get(rest.routes.guilds.invites(guildId));
|
|
1209
|
+
},
|
|
1210
|
+
async getMessage (channelId, messageId) {
|
|
1211
|
+
return await rest.get(rest.routes.channels.message(channelId, messageId));
|
|
1212
|
+
},
|
|
1213
|
+
async getMessages (channelId, options) {
|
|
1214
|
+
return await rest.get(rest.routes.channels.messages(channelId, options));
|
|
1215
|
+
},
|
|
1216
|
+
async getNitroStickerPacks () {
|
|
1217
|
+
return await rest.get(rest.routes.nitroStickerPacks());
|
|
1218
|
+
},
|
|
1219
|
+
async getOriginalInteractionResponse (token) {
|
|
1220
|
+
return await rest.get(rest.routes.interactions.responses.original(rest.applicationId, token));
|
|
1221
|
+
},
|
|
1222
|
+
async getPinnedMessages (channelId) {
|
|
1223
|
+
return await rest.get(rest.routes.channels.pins(channelId));
|
|
1224
|
+
},
|
|
1225
|
+
async getPrivateArchivedThreads (channelId, options) {
|
|
1226
|
+
return await rest.get(rest.routes.channels.threads.private(channelId, options));
|
|
1227
|
+
},
|
|
1228
|
+
async getPrivateJoinedArchivedThreads (channelId, options) {
|
|
1229
|
+
return await rest.get(rest.routes.channels.threads.joined(channelId, options));
|
|
1230
|
+
},
|
|
1231
|
+
async getPruneCount (guildId, options) {
|
|
1232
|
+
return await rest.get(rest.routes.guilds.prune(guildId, options));
|
|
1233
|
+
},
|
|
1234
|
+
async getPublicArchivedThreads (channelId, options) {
|
|
1235
|
+
return await rest.get(rest.routes.channels.threads.public(channelId, options));
|
|
1236
|
+
},
|
|
1237
|
+
async getRoles (guildId) {
|
|
1238
|
+
return await rest.get(rest.routes.guilds.roles.all(guildId));
|
|
1239
|
+
},
|
|
1240
|
+
async getScheduledEvent (guildId, eventId, options) {
|
|
1241
|
+
return await rest.get(rest.routes.guilds.events.event(guildId, eventId, options?.withUserCount));
|
|
1242
|
+
},
|
|
1243
|
+
async getScheduledEvents (guildId, options) {
|
|
1244
|
+
return await rest.get(rest.routes.guilds.events.events(guildId, options?.withUserCount));
|
|
1245
|
+
},
|
|
1246
|
+
async getScheduledEventUsers (guildId, eventId, options) {
|
|
1247
|
+
return await rest.get(rest.routes.guilds.events.users(guildId, eventId, options));
|
|
1248
|
+
},
|
|
1249
|
+
async getSessionInfo () {
|
|
1250
|
+
return await rest.getGatewayBot();
|
|
1251
|
+
},
|
|
1252
|
+
async getStageInstance (channelId) {
|
|
1253
|
+
return await rest.get(rest.routes.channels.stage(channelId));
|
|
1254
|
+
},
|
|
1255
|
+
async getSticker (stickerId) {
|
|
1256
|
+
return await rest.get(rest.routes.sticker(stickerId));
|
|
1257
|
+
},
|
|
1258
|
+
async getGuildSticker (guildId, stickerId) {
|
|
1259
|
+
return await rest.get(rest.routes.guilds.sticker(guildId, stickerId));
|
|
1260
|
+
},
|
|
1261
|
+
async getGuildStickers (guildId) {
|
|
1262
|
+
return await rest.get(rest.routes.guilds.stickers(guildId));
|
|
1263
|
+
},
|
|
1264
|
+
async getThreadMember (channelId, userId) {
|
|
1265
|
+
return await rest.get(rest.routes.channels.threads.user(channelId, userId));
|
|
1266
|
+
},
|
|
1267
|
+
async getThreadMembers (channelId) {
|
|
1268
|
+
return await rest.get(rest.routes.channels.threads.members(channelId));
|
|
1269
|
+
},
|
|
1270
|
+
async getReactions (channelId, messageId, reaction, options) {
|
|
1271
|
+
return await rest.get(rest.routes.channels.reactions.message(channelId, messageId, reaction, options));
|
|
1272
|
+
},
|
|
1273
|
+
async getUser (id) {
|
|
1274
|
+
return await rest.get(rest.routes.user(id));
|
|
1275
|
+
},
|
|
1276
|
+
async getVanityUrl (guildId) {
|
|
1277
|
+
return await rest.get(rest.routes.guilds.vanity(guildId));
|
|
1278
|
+
},
|
|
1279
|
+
async getVoiceRegions (guildId) {
|
|
1280
|
+
return await rest.get(rest.routes.guilds.regions(guildId));
|
|
1281
|
+
},
|
|
1282
|
+
async getWebhook (webhookId) {
|
|
1283
|
+
return await rest.get(rest.routes.webhooks.id(webhookId));
|
|
1284
|
+
},
|
|
1285
|
+
async getWebhookMessage (webhookId, token, messageId, options) {
|
|
1286
|
+
return await rest.get(rest.routes.webhooks.message(webhookId, token, messageId, options));
|
|
1287
|
+
},
|
|
1288
|
+
async getWebhookWithToken (webhookId, token) {
|
|
1289
|
+
return await rest.get(rest.routes.webhooks.webhook(webhookId, token));
|
|
1290
|
+
},
|
|
1291
|
+
async getWelcomeScreen (guildId) {
|
|
1292
|
+
return await rest.get(rest.routes.guilds.welcome(guildId));
|
|
1293
|
+
},
|
|
1294
|
+
async getWidget (guildId) {
|
|
1295
|
+
return await rest.get(rest.routes.guilds.widgetJson(guildId));
|
|
1296
|
+
},
|
|
1297
|
+
async getWidgetSettings (guildId) {
|
|
1298
|
+
return await rest.get(rest.routes.guilds.widget(guildId));
|
|
1299
|
+
},
|
|
1300
|
+
async joinThread (channelId) {
|
|
1301
|
+
return await rest.put(rest.routes.channels.threads.me(channelId));
|
|
1302
|
+
},
|
|
1303
|
+
async leaveGuild (guildId) {
|
|
1304
|
+
return await rest.delete(rest.routes.guilds.leave(guildId));
|
|
1305
|
+
},
|
|
1306
|
+
async leaveThread (channelId) {
|
|
1307
|
+
return await rest.delete(rest.routes.channels.threads.me(channelId));
|
|
1308
|
+
},
|
|
1309
|
+
async publishMessage (channelId, messageId) {
|
|
1310
|
+
return await rest.post(rest.routes.channels.crosspost(channelId, messageId));
|
|
1311
|
+
},
|
|
1312
|
+
async removeRole (guildId, userId, roleId, reason) {
|
|
1313
|
+
return await rest.delete(rest.routes.guilds.roles.member(guildId, userId, roleId), {
|
|
1314
|
+
reason
|
|
1315
|
+
});
|
|
1316
|
+
},
|
|
1317
|
+
async removeThreadMember (channelId, userId) {
|
|
1318
|
+
return await rest.delete(rest.routes.channels.threads.user(channelId, userId));
|
|
1319
|
+
},
|
|
1320
|
+
async sendFollowupMessage (token, options) {
|
|
1321
|
+
return await new Promise((resolve, reject)=>{
|
|
1322
|
+
rest.sendRequest({
|
|
1323
|
+
url: rest.routes.webhooks.webhook(rest.applicationId, token),
|
|
1324
|
+
method: 'POST',
|
|
1325
|
+
body: options,
|
|
1326
|
+
retryCount: 0,
|
|
1327
|
+
retryRequest: async function(options) {
|
|
1328
|
+
// TODO: should change to reprocess queue item
|
|
1329
|
+
await rest.sendRequest(options);
|
|
1330
|
+
},
|
|
1331
|
+
resolve: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined),
|
|
1332
|
+
reject
|
|
1333
|
+
});
|
|
1334
|
+
});
|
|
1335
|
+
},
|
|
1336
|
+
async sendInteractionResponse (interactionId, token, options) {
|
|
1337
|
+
return await new Promise((resolve, reject)=>{
|
|
1338
|
+
rest.sendRequest({
|
|
1339
|
+
url: rest.routes.interactions.responses.callback(interactionId, token),
|
|
1340
|
+
method: 'POST',
|
|
1341
|
+
body: options,
|
|
1342
|
+
retryCount: 0,
|
|
1343
|
+
retryRequest: async function(options) {
|
|
1344
|
+
// TODO: should change to reprocess queue item
|
|
1345
|
+
await rest.sendRequest(options);
|
|
1346
|
+
},
|
|
1347
|
+
resolve: (data)=>resolve(data.status !== 204 ? JSON.parse(data.body ?? '{}') : undefined),
|
|
1348
|
+
reject
|
|
1349
|
+
});
|
|
1350
|
+
});
|
|
1351
|
+
},
|
|
1352
|
+
async sendMessage (channelId, options) {
|
|
1353
|
+
return await rest.post(rest.routes.channels.messages(channelId), options);
|
|
1354
|
+
},
|
|
1355
|
+
async startThreadWithMessage (channelId, messageId, options) {
|
|
1356
|
+
return await rest.post(rest.routes.channels.threads.message(channelId, messageId), options);
|
|
1357
|
+
},
|
|
1358
|
+
async startThreadWithoutMessage (channelId, options) {
|
|
1359
|
+
return await rest.post(rest.routes.channels.threads.all(channelId), options);
|
|
1360
|
+
},
|
|
1361
|
+
async syncGuildTemplate (guildId) {
|
|
1362
|
+
return await rest.put(rest.routes.guilds.templates.all(guildId));
|
|
1363
|
+
},
|
|
1364
|
+
async banMember (guildId, userId, options) {
|
|
1365
|
+
return await rest.put(rest.routes.guilds.members.ban(guildId, userId), options);
|
|
1366
|
+
},
|
|
1367
|
+
async editBotMember (guildId, options) {
|
|
1368
|
+
return await rest.patch(rest.routes.guilds.members.bot(guildId), options);
|
|
1369
|
+
},
|
|
1370
|
+
async editMember (guildId, userId, options) {
|
|
1371
|
+
return await rest.patch(rest.routes.guilds.members.member(guildId, userId), options);
|
|
1372
|
+
},
|
|
1373
|
+
async getMember (guildId, userId) {
|
|
1374
|
+
return await rest.get(rest.routes.guilds.members.member(guildId, userId));
|
|
1375
|
+
},
|
|
1376
|
+
async getMembers (guildId, options) {
|
|
1377
|
+
return await rest.get(rest.routes.guilds.members.members(guildId, options));
|
|
1378
|
+
},
|
|
1379
|
+
async kickMember (guildId, userId, reason) {
|
|
1380
|
+
return await rest.delete(rest.routes.guilds.members.member(guildId, userId), {
|
|
1381
|
+
reason
|
|
1382
|
+
});
|
|
1383
|
+
},
|
|
1384
|
+
async pinMessage (channelId, messageId, reason) {
|
|
1385
|
+
return await rest.put(rest.routes.channels.pin(channelId, messageId), reason ? {
|
|
1386
|
+
reason
|
|
1387
|
+
} : undefined);
|
|
1388
|
+
},
|
|
1389
|
+
async pruneMembers (guildId, options) {
|
|
1390
|
+
return await rest.post(rest.routes.guilds.members.prune(guildId), options);
|
|
1391
|
+
},
|
|
1392
|
+
async searchMembers (guildId, query, options) {
|
|
1393
|
+
return await rest.get(rest.routes.guilds.members.search(guildId, query, options));
|
|
1394
|
+
},
|
|
1395
|
+
async unbanMember (guildId, userId) {
|
|
1396
|
+
return await rest.delete(rest.routes.guilds.members.ban(guildId, userId));
|
|
1397
|
+
},
|
|
1398
|
+
async unpinMessage (channelId, messageId, reason) {
|
|
1399
|
+
return await rest.delete(rest.routes.channels.pin(channelId, messageId), reason ? {
|
|
1400
|
+
reason
|
|
1401
|
+
} : undefined);
|
|
1402
|
+
},
|
|
1403
|
+
async triggerTypingIndicator (channelId) {
|
|
1404
|
+
return await rest.post(rest.routes.channels.typing(channelId));
|
|
1405
|
+
},
|
|
1406
|
+
async upsertGlobalApplicationCommands (commands) {
|
|
1407
|
+
return await rest.put(rest.routes.interactions.commands.commands(rest.applicationId), commands);
|
|
1408
|
+
},
|
|
1409
|
+
async upsertGuildApplicationCommands (guildId, commands) {
|
|
1410
|
+
return await rest.put(rest.routes.interactions.commands.guilds.all(rest.applicationId, guildId), commands);
|
|
1411
|
+
}
|
|
1412
|
+
};
|
|
1413
|
+
return rest;
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1416
|
+
//# sourceMappingURL=manager.js.map
|