@discordeno/rest 19.0.0-next.ff6dcb1 → 19.0.0-next.ffdef6c

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.
Files changed (40) hide show
  1. package/README.md +15 -1
  2. package/dist/cjs/index.cjs +25 -0
  3. package/dist/cjs/invalidBucket.cjs +86 -0
  4. package/dist/cjs/manager.cjs +1547 -0
  5. package/dist/cjs/queue.cjs +164 -0
  6. package/dist/cjs/routes.cjs +589 -0
  7. package/dist/cjs/types.cjs +6 -0
  8. package/dist/cjs/typings/routes.cjs +6 -0
  9. package/dist/esm/index.js +8 -0
  10. package/dist/esm/invalidBucket.js +82 -0
  11. package/dist/esm/manager.js +1505 -0
  12. package/dist/esm/queue.js +154 -0
  13. package/dist/esm/routes.js +579 -0
  14. package/dist/esm/types.js +3 -0
  15. package/dist/esm/typings/routes.js +3 -0
  16. package/dist/types/index.d.ts +7 -0
  17. package/dist/types/index.d.ts.map +1 -0
  18. package/dist/{invalidBucket.d.ts → types/invalidBucket.d.ts} +11 -7
  19. package/dist/types/invalidBucket.d.ts.map +1 -0
  20. package/dist/types/manager.d.ts +12 -0
  21. package/dist/types/manager.d.ts.map +1 -0
  22. package/dist/{queue.d.ts → types/queue.d.ts} +15 -2
  23. package/dist/types/queue.d.ts.map +1 -0
  24. package/dist/types/routes.d.ts +3 -0
  25. package/dist/types/routes.d.ts.map +1 -0
  26. package/dist/types/types.d.ts +2973 -0
  27. package/dist/types/types.d.ts.map +1 -0
  28. package/dist/types/typings/routes.d.ts +299 -0
  29. package/dist/types/typings/routes.d.ts.map +1 -0
  30. package/package.json +34 -30
  31. package/dist/index.d.ts +0 -4
  32. package/dist/index.d.ts.map +0 -1
  33. package/dist/index.js +0 -2
  34. package/dist/invalidBucket.d.ts.map +0 -1
  35. package/dist/invalidBucket.js +0 -2
  36. package/dist/manager.d.ts +0 -4293
  37. package/dist/manager.d.ts.map +0 -1
  38. package/dist/manager.js +0 -2
  39. package/dist/queue.d.ts.map +0 -1
  40. package/dist/queue.js +0 -2
package/README.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Discordeno Rest
2
2
 
3
- A standalone and server-less REST module with functionality of REST, independently.
3
+ <img align="right" src="https://raw.githubusercontent.com/discordeno/discordeno/main/website/static/img/logo.png" height="150px" />
4
+
5
+ Discord API library for [Node.JS](https://nodejs.org), [Deno](https://deno.land) & [Bun](https://bun.sh/)
6
+
7
+ [![Discord](https://img.shields.io/discord/785384884197392384?color=7289da&logo=discord&logoColor=dark)](https://discord.com/invite/5vBgXk3UcZ)
8
+ [![codecov](https://codecov.io/gh/discordeno/discordeno/branch/main/graph/badge.svg?token=SQI9OYJ7AK)](https://codecov.io/gh/discordeno/discordeno)
9
+ ![action status](https://github.com/discordeno/discordeno/actions/workflows/lib-check.yml/badge.svg?event=push)
10
+
11
+ A standalone REST module with functionality of REST, independently.
4
12
 
5
13
  - Easily host on any serverless infrastructure.
6
14
  - Easy to use and setup with Cloudflare Workers (FREE for 100K requests per day!)
@@ -14,3 +22,9 @@ A standalone and server-less REST module with functionality of REST, independent
14
22
  - Seamless updates! When you want to update and reboot the bot, you could potentially lose tons of messages or
15
23
  responses that are in queue. Using this you could restart your bot without ever worrying about losing any responses.
16
24
  - Scalability! Scalability! Scalability!
25
+
26
+ ## Links
27
+
28
+ - [Website](https://discordeno.js.org/)
29
+ - [Documentation](https://doc.deno.land/https/deno.land/x/discordeno/mod.ts)
30
+ - [Discord](https://discord.com/invite/5vBgXk3UcZ)
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _export_star(require("./typings/routes.cjs"), exports);
6
+ _export_star(require("./invalidBucket.cjs"), exports);
7
+ _export_star(require("./manager.cjs"), exports);
8
+ _export_star(require("./queue.cjs"), exports);
9
+ _export_star(require("./routes.cjs"), exports);
10
+ _export_star(require("./types.cjs"), exports);
11
+ function _export_star(from, to) {
12
+ Object.keys(from).forEach(function(k) {
13
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
14
+ Object.defineProperty(to, k, {
15
+ enumerable: true,
16
+ get: function() {
17
+ return from[k];
18
+ }
19
+ });
20
+ }
21
+ });
22
+ return from;
23
+ }
24
+
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3R5cGluZ3Mvcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9pbnZhbGlkQnVja2V0LmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9tYW5hZ2VyLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi9xdWV1ZS5qcydcbmV4cG9ydCAqIGZyb20gJy4vcm91dGVzLmpzJ1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcy5qcydcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFjO3FCQUNBO3FCQUNBO3FCQUNBO3FCQUNBO3FCQUNBIn0=
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "createInvalidRequestBucket", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return createInvalidRequestBucket;
9
+ }
10
+ });
11
+ const _utils = require("@discordeno/utils");
12
+ function createInvalidRequestBucket(options) {
13
+ const bucket = {
14
+ invalidRequests: options.current ?? 0,
15
+ max: options.max ?? 10000,
16
+ interval: options.interval ?? 600_000,
17
+ resetAt: options.resetAt,
18
+ safety: options.safety ?? 1,
19
+ errorStatuses: options.errorStatuses ?? [
20
+ 401,
21
+ 403,
22
+ 429
23
+ ],
24
+ activeRequests: options.requested ?? 0,
25
+ processing: false,
26
+ logger: options.logger ?? _utils.logger,
27
+ waiting: [],
28
+ requestsAllowed: function() {
29
+ if (bucket.resetAt !== undefined && Date.now() >= bucket.resetAt) {
30
+ bucket.invalidRequests = 0;
31
+ bucket.resetAt = Date.now() + bucket.interval;
32
+ }
33
+ return bucket.max - bucket.invalidRequests - bucket.activeRequests - bucket.safety;
34
+ },
35
+ isRequestAllowed: function() {
36
+ return bucket.requestsAllowed() > 0;
37
+ },
38
+ waitUntilRequestAvailable: async function() {
39
+ return await new Promise(async (resolve)=>{
40
+ // If whatever amount of requests is left is more than the safety margin, allow the request
41
+ if (bucket.isRequestAllowed()) {
42
+ bucket.activeRequests += 1;
43
+ resolve();
44
+ } else {
45
+ bucket.waiting.push(resolve);
46
+ await bucket.processWaiting();
47
+ }
48
+ });
49
+ },
50
+ processWaiting: async function() {
51
+ // If already processing, that loop will handle all waiting requests.
52
+ if (bucket.processing) return;
53
+ // Mark as processing so other loops don't start
54
+ bucket.processing = true;
55
+ while(bucket.waiting.length > 0){
56
+ bucket.logger.info(`[InvalidBucket] processing waiting queue while loop ran with ${bucket.waiting.length} pending requests to be made. ${JSON.stringify(bucket)}`);
57
+ if (!bucket.isRequestAllowed() && bucket.resetAt !== undefined) {
58
+ bucket.logger.warn(`[InvalidBucket] processing waiting queue is now paused until more requests are available. ${bucket.waiting.length} pending requests. ${JSON.stringify(bucket)}`);
59
+ await (0, _utils.delay)(bucket.resetAt - Date.now());
60
+ }
61
+ bucket.activeRequests += 1;
62
+ // Resolve the next item in the queue
63
+ bucket.waiting.shift()?.();
64
+ }
65
+ // Mark as false so next pending request can be triggered by new loop.
66
+ bucket.processing = false;
67
+ },
68
+ handleCompletedRequest: function(code, sharedScope) {
69
+ // Since request is complete, we can remove one from requested.
70
+ bucket.activeRequests -= 1;
71
+ // Since it is as a valid request, we don't need to do anything
72
+ if (!bucket.errorStatuses.includes(code)) return;
73
+ // Shared scope is not considered invalid
74
+ if (code === 429 && sharedScope) return;
75
+ // INVALID REQUEST WAS MADE
76
+ if (bucket.resetAt === undefined) {
77
+ bucket.resetAt = Date.now() + bucket.interval;
78
+ }
79
+ bucket.invalidRequests += 1;
80
+ bucket.logger.warn(`[InvalidBucket] an invalid request was made. Increasing invalidRequests count to ${bucket.invalidRequests}`);
81
+ }
82
+ };
83
+ return bucket;
84
+ }
85
+
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbnZhbGlkQnVja2V0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlbGF5LCBsb2dnZXIgfSBmcm9tICdAZGlzY29yZGVuby91dGlscydcblxuLyoqXG4gKiBBIGludmFsaWQgcmVxdWVzdCBidWNrZXQgaXMgdXNlZCBpbiBhIHNpbWlsYXIgbWFubmVyIGFzIGEgbGVha3kgYnVja2V0IGJ1dCBhIGludmFsaWQgcmVxdWVzdCBidWNrZXQgY2FuIGJlIHJlZmlsbGVkIGFzIG5lZWRlZC5cbiAqIEl0J3MgcHVycG9zZSBpcyB0byBtYWtlIHN1cmUgdGhlIGJvdCBkb2VzIG5vdCBoaXQgdGhlIGxpbWl0IHRvIGdldHRpbmcgYSAxIGhyIGJhbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW9ucyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGlzIGJ1Y2tldC5cbiAqIEByZXR1cm5zIFJlZmlsbGluZ0J1Y2tldFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSW52YWxpZFJlcXVlc3RCdWNrZXQob3B0aW9uczogSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zKTogSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICBjb25zdCBidWNrZXQ6IEludmFsaWRSZXF1ZXN0QnVja2V0ID0ge1xuICAgIGludmFsaWRSZXF1ZXN0czogb3B0aW9ucy5jdXJyZW50ID8/IDAsXG4gICAgbWF4OiBvcHRpb25zLm1heCA/PyAxMDAwMCxcbiAgICBpbnRlcnZhbDogb3B0aW9ucy5pbnRlcnZhbCA/PyA2MDBfMDAwLCAvLyAxMCBtaW51dGVzXG4gICAgcmVzZXRBdDogb3B0aW9ucy5yZXNldEF0LFxuICAgIHNhZmV0eTogb3B0aW9ucy5zYWZldHkgPz8gMSxcbiAgICBlcnJvclN0YXR1c2VzOiBvcHRpb25zLmVycm9yU3RhdHVzZXMgPz8gWzQwMSwgNDAzLCA0MjldLFxuICAgIGFjdGl2ZVJlcXVlc3RzOiBvcHRpb25zLnJlcXVlc3RlZCA/PyAwLFxuICAgIHByb2Nlc3Npbmc6IGZhbHNlLFxuICAgIGxvZ2dlcjogb3B0aW9ucy5sb2dnZXIgPz8gbG9nZ2VyLFxuXG4gICAgd2FpdGluZzogW10sXG5cbiAgICByZXF1ZXN0c0FsbG93ZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkICYmIERhdGUubm93KCkgPj0gYnVja2V0LnJlc2V0QXQpIHtcbiAgICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyA9IDBcbiAgICAgICAgYnVja2V0LnJlc2V0QXQgPSBEYXRlLm5vdygpICsgYnVja2V0LmludGVydmFsXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWNrZXQubWF4IC0gYnVja2V0LmludmFsaWRSZXF1ZXN0cyAtIGJ1Y2tldC5hY3RpdmVSZXF1ZXN0cyAtIGJ1Y2tldC5zYWZldHlcbiAgICB9LFxuXG4gICAgaXNSZXF1ZXN0QWxsb3dlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGJ1Y2tldC5yZXF1ZXN0c0FsbG93ZWQoKSA+IDBcbiAgICB9LFxuXG4gICAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgIC8vIElmIHdoYXRldmVyIGFtb3VudCBvZiByZXF1ZXN0cyBpcyBsZWZ0IGlzIG1vcmUgdGhhbiB0aGUgc2FmZXR5IG1hcmdpbiwgYWxsb3cgdGhlIHJlcXVlc3RcbiAgICAgICAgaWYgKGJ1Y2tldC5pc1JlcXVlc3RBbGxvd2VkKCkpIHtcbiAgICAgICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgKz0gMVxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJ1Y2tldC53YWl0aW5nLnB1c2gocmVzb2x2ZSlcbiAgICAgICAgICBhd2FpdCBidWNrZXQucHJvY2Vzc1dhaXRpbmcoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG5cbiAgICBwcm9jZXNzV2FpdGluZzogYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gSWYgYWxyZWFkeSBwcm9jZXNzaW5nLCB0aGF0IGxvb3Agd2lsbCBoYW5kbGUgYWxsIHdhaXRpbmcgcmVxdWVzdHMuXG4gICAgICBpZiAoYnVja2V0LnByb2Nlc3NpbmcpIHJldHVyblxuXG4gICAgICAvLyBNYXJrIGFzIHByb2Nlc3Npbmcgc28gb3RoZXIgbG9vcHMgZG9uJ3Qgc3RhcnRcbiAgICAgIGJ1Y2tldC5wcm9jZXNzaW5nID0gdHJ1ZVxuXG4gICAgICB3aGlsZSAoYnVja2V0LndhaXRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICBidWNrZXQubG9nZ2VyLmluZm8oXG4gICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgd2hpbGUgbG9vcCByYW4gd2l0aCAke2J1Y2tldC53YWl0aW5nLmxlbmd0aH0gcGVuZGluZyByZXF1ZXN0cyB0byBiZSBtYWRlLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgYnVja2V0LFxuICAgICAgICAgICl9YCxcbiAgICAgICAgKVxuXG4gICAgICAgIGlmICghYnVja2V0LmlzUmVxdWVzdEFsbG93ZWQoKSAmJiBidWNrZXQucmVzZXRBdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnVja2V0LmxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYFtJbnZhbGlkQnVja2V0XSBwcm9jZXNzaW5nIHdhaXRpbmcgcXVldWUgaXMgbm93IHBhdXNlZCB1bnRpbCBtb3JlIHJlcXVlc3RzIGFyZSBhdmFpbGFibGUuICR7XG4gICAgICAgICAgICAgIGJ1Y2tldC53YWl0aW5nLmxlbmd0aFxuICAgICAgICAgICAgfSBwZW5kaW5nIHJlcXVlc3RzLiAke0pTT04uc3RyaW5naWZ5KGJ1Y2tldCl9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgYXdhaXQgZGVsYXkoYnVja2V0LnJlc2V0QXQgLSBEYXRlLm5vdygpKVxuICAgICAgICB9XG5cbiAgICAgICAgYnVja2V0LmFjdGl2ZVJlcXVlc3RzICs9IDFcbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgbmV4dCBpdGVtIGluIHRoZSBxdWV1ZVxuICAgICAgICBidWNrZXQud2FpdGluZy5zaGlmdCgpPy4oKVxuICAgICAgfVxuXG4gICAgICAvLyBNYXJrIGFzIGZhbHNlIHNvIG5leHQgcGVuZGluZyByZXF1ZXN0IGNhbiBiZSB0cmlnZ2VyZWQgYnkgbmV3IGxvb3AuXG4gICAgICBidWNrZXQucHJvY2Vzc2luZyA9IGZhbHNlXG4gICAgfSxcblxuICAgIGhhbmRsZUNvbXBsZXRlZFJlcXVlc3Q6IGZ1bmN0aW9uIChjb2RlLCBzaGFyZWRTY29wZSkge1xuICAgICAgLy8gU2luY2UgcmVxdWVzdCBpcyBjb21wbGV0ZSwgd2UgY2FuIHJlbW92ZSBvbmUgZnJvbSByZXF1ZXN0ZWQuXG4gICAgICBidWNrZXQuYWN0aXZlUmVxdWVzdHMgLT0gMVxuICAgICAgLy8gU2luY2UgaXQgaXMgYXMgYSB2YWxpZCByZXF1ZXN0LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nXG4gICAgICBpZiAoIWJ1Y2tldC5lcnJvclN0YXR1c2VzLmluY2x1ZGVzKGNvZGUpKSByZXR1cm5cbiAgICAgIC8vIFNoYXJlZCBzY29wZSBpcyBub3QgY29uc2lkZXJlZCBpbnZhbGlkXG4gICAgICBpZiAoY29kZSA9PT0gNDI5ICYmIHNoYXJlZFNjb3BlKSByZXR1cm5cblxuICAgICAgLy8gSU5WQUxJRCBSRVFVRVNUIFdBUyBNQURFXG4gICAgICBpZiAoYnVja2V0LnJlc2V0QXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBidWNrZXQucmVzZXRBdCA9IERhdGUubm93KCkgKyBidWNrZXQuaW50ZXJ2YWxcbiAgICAgIH1cblxuICAgICAgYnVja2V0LmludmFsaWRSZXF1ZXN0cyArPSAxXG4gICAgICBidWNrZXQubG9nZ2VyLndhcm4oYFtJbnZhbGlkQnVja2V0XSBhbiBpbnZhbGlkIHJlcXVlc3Qgd2FzIG1hZGUuIEluY3JlYXNpbmcgaW52YWxpZFJlcXVlc3RzIGNvdW50IHRvICR7YnVja2V0LmludmFsaWRSZXF1ZXN0c31gKVxuICAgIH0sXG4gIH1cblxuICByZXR1cm4gYnVja2V0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXRPcHRpb25zIHtcbiAgLyoqIGN1cnJlbnQgaW52YWxpZCBhbW91bnQgKi9cbiAgY3VycmVudD86IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg/OiBudW1iZXJcbiAgLyoqIFRoZSB0aW1lIHRoYXQgZGlzY29yZCBhbGxvd3MgdG8gbWFrZSB0aGUgbWF4IG51bWJlciBvZiBpbnZhbGlkIHJlcXVlc3RzLiBEZWZhdWx0cyB0byAxMCBtaW51dGVzICovXG4gIGludGVydmFsPzogbnVtYmVyXG4gIC8qKiBXaGVuIHRoZSB0aW1lb3V0IGZvciB0aGUgYnVja2V0IGhhcyBzdGFydGVkIGF0LiAqL1xuICByZXNldEF0PzogbnVtYmVyXG4gIC8qKiBob3cgc2FmZSB0byBiZSBmcm9tIG1heC4gRGVmYXVsdHMgdG8gMSAqL1xuICBzYWZldHk/OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzPzogbnVtYmVyW11cbiAgLyoqIFRoZSBhbW91bnQgb2YgcmVxdWVzdHMgdGhhdCB3ZXJlIHJlcXVlc3RlZCBmcm9tIHRoaXMgYnVja2V0LiAqL1xuICByZXF1ZXN0ZWQ/OiBudW1iZXJcbiAgLyoqIFRoZSBsb2dnZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyPzogUGljazx0eXBlb2YgbG9nZ2VyLCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2Vycm9yJyB8ICdmYXRhbCc+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZFJlcXVlc3RCdWNrZXQge1xuICAvKiogY3VycmVudCBpbnZhbGlkIGFtb3VudCAqL1xuICBpbnZhbGlkUmVxdWVzdHM6IG51bWJlclxuICAvKiogbWF4IGludmFsaWQgcmVxdWVzdHMgYWxsb3dlZCB1bnRpbCBiYW4uIERlZmF1bHRzIHRvIDEwLDAwMCAqL1xuICBtYXg6IG51bWJlclxuICAvKiogVGhlIHRpbWUgdGhhdCBkaXNjb3JkIGFsbG93cyB0byBtYWtlIHRoZSBtYXggbnVtYmVyIG9mIGludmFsaWQgcmVxdWVzdHMuIERlZmF1bHRzIHRvIDEwIG1pbnV0ZXMgKi9cbiAgaW50ZXJ2YWw6IG51bWJlclxuICAvKiogV2hlbiB0aGUgdGltZW91dCBmb3IgdGhpcyBidWNrZXQgaGFzIHN0YXJ0ZWQgYXQuICovXG4gIHJlc2V0QXQ6IG51bWJlciB8IHVuZGVmaW5lZFxuICAvKiogaG93IHNhZmUgdG8gYmUgZnJvbSBtYXguIERlZmF1bHRzIHRvIDEgKi9cbiAgc2FmZXR5OiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0IHN0YXR1c2VzIHRoYXQgY291bnQgYXMgYW4gaW52YWxpZCByZXF1ZXN0LiAqL1xuICBlcnJvclN0YXR1c2VzOiBudW1iZXJbXVxuICAvKiogVGhlIGFtb3VudCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBidWNrZXQuICovXG4gIGFjdGl2ZVJlcXVlc3RzOiBudW1iZXJcbiAgLyoqIFRoZSByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgcGVuZGluZy4gKi9cbiAgd2FpdGluZzogQXJyYXk8KHZhbHVlOiB2b2lkIHwgUHJvbWlzZUxpa2U8dm9pZD4pID0+IHZvaWQ+XG4gIC8qKiBXaGV0aGVyIG9yIG5vdCB0aGUgd2FpdGluZyBxdWV1ZSBpcyBhbHJlYWR5IHByb2Nlc3NpbmcuICovXG4gIHByb2Nlc3Npbmc6IGJvb2xlYW5cbiAgLyoqIFRoZSBsb2dnZXIgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBidWNrZXQgKi9cbiAgbG9nZ2VyOiBQaWNrPHR5cGVvZiBsb2dnZXIsICdkZWJ1ZycgfCAnaW5mbycgfCAnd2FybicgfCAnZXJyb3InIHwgJ2ZhdGFsJz5cblxuICAvKiogR2l2ZXMgdGhlIG51bWJlciBvZiByZXF1ZXN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYWxsb3dlZC4gKi9cbiAgcmVxdWVzdHNBbGxvd2VkOiAoKSA9PiBudW1iZXJcbiAgLyoqIENoZWNrcyBpZiBhIHJlcXVlc3QgaXMgYWxsb3dlZCBhdCB0aGlzIHRpbWUuICovXG4gIGlzUmVxdWVzdEFsbG93ZWQ6ICgpID0+IGJvb2xlYW5cbiAgLyoqIFdhaXRzIHVudGlsIGEgcmVxdWVzdCBpcyBhdmFpbGFibGUgKi9cbiAgd2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZTogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICAvKiogQmVnaW5zIHByb2Nlc3NpbmcgdGhlIHdhaXRpbmcgcXVldWUgb2YgcmVxdWVzdHMuICovXG4gIHByb2Nlc3NXYWl0aW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIC8qKiBIYW5kbGVyIGZvciB3aGVuZXZlciBhIHJlcXVlc3QgaXMgdmFsaWRhdGVkLiBUaGlzIHNob3VsZCB1cGRhdGUgdGhlIHJlcXVlc3RlZCB2YWx1ZXMgb3IgdHJpZ2dlciBhbnkgb3RoZXIgbmVjZXNzYXJ5IHN0dWZmLiAqL1xuICBoYW5kbGVDb21wbGV0ZWRSZXF1ZXN0OiAoY29kZTogbnVtYmVyLCBzaGFyZWRTY29wZTogYm9vbGVhbikgPT4gdm9pZFxufVxuIl0sIm5hbWVzIjpbImNyZWF0ZUludmFsaWRSZXF1ZXN0QnVja2V0Iiwib3B0aW9ucyIsImJ1Y2tldCIsImludmFsaWRSZXF1ZXN0cyIsImN1cnJlbnQiLCJtYXgiLCJpbnRlcnZhbCIsInJlc2V0QXQiLCJzYWZldHkiLCJlcnJvclN0YXR1c2VzIiwiYWN0aXZlUmVxdWVzdHMiLCJyZXF1ZXN0ZWQiLCJwcm9jZXNzaW5nIiwibG9nZ2VyIiwid2FpdGluZyIsInJlcXVlc3RzQWxsb3dlZCIsInVuZGVmaW5lZCIsIkRhdGUiLCJub3ciLCJpc1JlcXVlc3RBbGxvd2VkIiwid2FpdFVudGlsUmVxdWVzdEF2YWlsYWJsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicHVzaCIsInByb2Nlc3NXYWl0aW5nIiwibGVuZ3RoIiwiaW5mbyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ3YXJuIiwiZGVsYXkiLCJzaGlmdCIsImhhbmRsZUNvbXBsZXRlZFJlcXVlc3QiLCJjb2RlIiwic2hhcmVkU2NvcGUiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFTZ0JBOzs7ZUFBQUE7Ozt1QkFUYztBQVN2QixTQUFTQSwyQkFBMkJDLE9BQW9DO0lBQzdFLE1BQU1DLFNBQStCO1FBQ25DQyxpQkFBaUJGLFFBQVFHLE9BQU8sSUFBSTtRQUNwQ0MsS0FBS0osUUFBUUksR0FBRyxJQUFJO1FBQ3BCQyxVQUFVTCxRQUFRSyxRQUFRLElBQUk7UUFDOUJDLFNBQVNOLFFBQVFNLE9BQU87UUFDeEJDLFFBQVFQLFFBQVFPLE1BQU0sSUFBSTtRQUMxQkMsZUFBZVIsUUFBUVEsYUFBYSxJQUFJO1lBQUM7WUFBSztZQUFLO1NBQUk7UUFDdkRDLGdCQUFnQlQsUUFBUVUsU0FBUyxJQUFJO1FBQ3JDQyxZQUFZO1FBQ1pDLFFBQVFaLFFBQVFZLE1BQU0sSUFBSUEsYUFBTTtRQUVoQ0MsU0FBUyxFQUFFO1FBRVhDLGlCQUFpQjtZQUNmLElBQUliLE9BQU9LLE9BQU8sS0FBS1MsYUFBYUMsS0FBS0MsR0FBRyxNQUFNaEIsT0FBT0ssT0FBTyxFQUFFO2dCQUNoRUwsT0FBT0MsZUFBZSxHQUFHO2dCQUN6QkQsT0FBT0ssT0FBTyxHQUFHVSxLQUFLQyxHQUFHLEtBQUtoQixPQUFPSSxRQUFRO1lBQy9DO1lBRUEsT0FBT0osT0FBT0csR0FBRyxHQUFHSCxPQUFPQyxlQUFlLEdBQUdELE9BQU9RLGNBQWMsR0FBR1IsT0FBT00sTUFBTTtRQUNwRjtRQUVBVyxrQkFBa0I7WUFDaEIsT0FBT2pCLE9BQU9hLGVBQWUsS0FBSztRQUNwQztRQUVBSywyQkFBMkI7WUFDekIsT0FBTyxNQUFNLElBQUlDLFFBQVEsT0FBT0M7Z0JBQzlCLDJGQUEyRjtnQkFDM0YsSUFBSXBCLE9BQU9pQixnQkFBZ0IsSUFBSTtvQkFDN0JqQixPQUFPUSxjQUFjLElBQUk7b0JBQ3pCWTtnQkFDRixPQUFPO29CQUNMcEIsT0FBT1ksT0FBTyxDQUFDUyxJQUFJLENBQUNEO29CQUNwQixNQUFNcEIsT0FBT3NCLGNBQWM7Z0JBQzdCO1lBQ0Y7UUFDRjtRQUVBQSxnQkFBZ0I7WUFDZCxxRUFBcUU7WUFDckUsSUFBSXRCLE9BQU9VLFVBQVUsRUFBRTtZQUV2QixnREFBZ0Q7WUFDaERWLE9BQU9VLFVBQVUsR0FBRztZQUVwQixNQUFPVixPQUFPWSxPQUFPLENBQUNXLE1BQU0sR0FBRyxFQUFHO2dCQUNoQ3ZCLE9BQU9XLE1BQU0sQ0FBQ2EsSUFBSSxDQUNoQixDQUFDLDZEQUE2RCxFQUFFeEIsT0FBT1ksT0FBTyxDQUFDVyxNQUFNLENBQUMsOEJBQThCLEVBQUVFLEtBQUtDLFNBQVMsQ0FDbEkxQixTQUNDO2dCQUdMLElBQUksQ0FBQ0EsT0FBT2lCLGdCQUFnQixNQUFNakIsT0FBT0ssT0FBTyxLQUFLUyxXQUFXO29CQUM5RGQsT0FBT1csTUFBTSxDQUFDZ0IsSUFBSSxDQUNoQixDQUFDLDBGQUEwRixFQUN6RjNCLE9BQU9ZLE9BQU8sQ0FBQ1csTUFBTSxDQUN0QixtQkFBbUIsRUFBRUUsS0FBS0MsU0FBUyxDQUFDMUIsU0FBUztvQkFFaEQsTUFBTTRCLElBQUFBLFlBQUssRUFBQzVCLE9BQU9LLE9BQU8sR0FBR1UsS0FBS0MsR0FBRztnQkFDdkM7Z0JBRUFoQixPQUFPUSxjQUFjLElBQUk7Z0JBQ3pCLHFDQUFxQztnQkFDckNSLE9BQU9ZLE9BQU8sQ0FBQ2lCLEtBQUs7WUFDdEI7WUFFQSxzRUFBc0U7WUFDdEU3QixPQUFPVSxVQUFVLEdBQUc7UUFDdEI7UUFFQW9CLHdCQUF3QixTQUFVQyxJQUFJLEVBQUVDLFdBQVc7WUFDakQsK0RBQStEO1lBQy9EaEMsT0FBT1EsY0FBYyxJQUFJO1lBQ3pCLCtEQUErRDtZQUMvRCxJQUFJLENBQUNSLE9BQU9PLGFBQWEsQ0FBQzBCLFFBQVEsQ0FBQ0YsT0FBTztZQUMxQyx5Q0FBeUM7WUFDekMsSUFBSUEsU0FBUyxPQUFPQyxhQUFhO1lBRWpDLDJCQUEyQjtZQUMzQixJQUFJaEMsT0FBT0ssT0FBTyxLQUFLUyxXQUFXO2dCQUNoQ2QsT0FBT0ssT0FBTyxHQUFHVSxLQUFLQyxHQUFHLEtBQUtoQixPQUFPSSxRQUFRO1lBQy9DO1lBRUFKLE9BQU9DLGVBQWUsSUFBSTtZQUMxQkQsT0FBT1csTUFBTSxDQUFDZ0IsSUFBSSxDQUFDLENBQUMsaUZBQWlGLEVBQUUzQixPQUFPQyxlQUFlLEVBQUU7UUFDakk7SUFDRjtJQUVBLE9BQU9EO0FBQ1QifQ==