New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

ryuu.js

Package Overview
Dependencies
Maintainers
3
Versions
54
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ryuu.js - npm Package Compare versions

Comparing version 4.0.0 to 4.0.1

10

dist/domo.d.ts

@@ -1,2 +0,2 @@

import { RequestOptions, ObjectRequestOptions, ArrayRequestOptions, QueryParams, FilterDataTypes, FilterOperators, RequestBody, ResponseBody, ObjectResponseBody, ArrayResponseBody } from './models';
import { RequestOptions, ObjectRequestOptions, ArrayRequestOptions, QueryParams, FilterDataTypes, FilterOperators, RequestBody, ResponseBody, ObjectResponseBody, ArrayResponseBody } from "./models";
export = domo;

@@ -21,3 +21,3 @@ declare class domo {

*/
static onDataUpdate(cb: (alias: string) => void): void;
static onDataUpdate(cb: (alias: string) => void): () => void;
/**

@@ -49,3 +49,3 @@ * Let the domoapp optionally handle other events

values: Date[];
dataType: 'DATE' | 'DATETIME';
dataType: "DATE" | "DATETIME";
} | {

@@ -55,3 +55,3 @@ column: string;

values: number[];
dataType: 'NUMERIC';
dataType: "NUMERIC";
} | {

@@ -61,3 +61,3 @@ column: string;

values: string[];
dataType: 'STRING';
dataType: "STRING";
})[]): void;

@@ -64,0 +64,0 @@ static env: QueryParams;

/*!
* domo.js v4.0.0
* domo.js v4.0.1
* Optional utility library for Custom Apps
*/
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.domo=t():e.domo=t()}(window,(function(){return function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(2);t.RequestMethods=o.RequestMethods;var r=n(3);t.DataFormats=r.DataFormats},function(e,t,n){"use strict";var o=n(0),r=n(4),a=function(){function e(){}return e.post=function(e,t,n){return s(o.RequestMethods.POST,e,n,!0,t)},e.put=function(e,t,n){return s(o.RequestMethods.PUT,e,n,!0,t)},e.get=function(e,t){return s(o.RequestMethods.GET,e,t)},e.delete=function(e,t){return s(o.RequestMethods.DELETE,e,t)},e.getAll=function(t,n){return Promise.all(t.map((function(t){return e.get(t,n)})))},e.onDataUpdate=function(e){window.addEventListener("message",(function(t){if(u(t.origin)&&"string"==typeof t.data&&t.data.length>0)try{var n=JSON.parse(t.data);if(!n.hasOwnProperty("alias"))return;var o=n.alias,r=JSON.stringify({event:"ack",alias:o});t.source instanceof Window&&t.source.postMessage(r,t.origin),e(o)}catch(e){console.warn("There was an error in onDataUpdate! It may be that our event listener caught a message from another source and tried to parse it, so your update still may have worked. If you would like more info, here is the error: \n",e)}}))},e.navigate=function(e,t){var n=JSON.stringify({event:"navigate",url:e,isNewWindow:t});window.parent.postMessage(n,"*")},e.filterContainer=function(e){var t=window.navigator.userAgent.toLowerCase(),n=/safari/.test(t),o=/iphone|ipod|ipad/.test(t),r=JSON.stringify({event:"filter",filter:e.map((function(e){return{columnName:e.column,operator:e.operator,values:e.values,dataType:e.dataType}}))});o&&!n?window.webkit.messageHandlers.domofilter.postMessage(e.map((function(e){return{column:e.column,operand:e.operator,values:e.values,dataType:e.dataType}}))):window.parent.postMessage(r,"*")},e.connected=!1,e.listeners={onFiltersUpdate:[]},e.connect=function(){e.connected||(e.connected=!0,e.channel=new MessageChannel,window.parent.postMessage(JSON.stringify({event:"subscribe"}),"*",[e.channel.port2]))},e.onFiltersUpdate=function(t){e.connect();var n=e.listeners.onFiltersUpdate.push(t)-1;return e.channel.port1.onmessage=function(t){var n=t.ports[0];void 0!==n&&"filtersUpdated"===t.data.event&&e.listeners.onFiltersUpdate.length>0&&(n.postMessage({}),e.listeners.onFiltersUpdate.forEach((function(e){return e(t.data.filters)})))},function(){e.listeners.onFiltersUpdate.splice(n,1)}},e.env=c(),e.__util={isVerifiedOrigin:u,getQueryParams:c,setFormatHeaders:p,isSuccess:i},e}();function s(e,t,n,r,a){return n=n||{},new Promise((function(s,u){var c=new XMLHttpRequest;if(r?c.open(e,t,r):c.open(e,t),p(c,t,n),function(e,t){t.contentType?"multipart"!==t.contentType&&e.setRequestHeader("Content-Type",t.contentType):e.setRequestHeader("Content-Type",o.DataFormats.JSON)}(c,n),function(e,t){void 0!==t.responseType&&(e.responseType=t.responseType)}(c,n),c.onload=function(){var e;if(i(c.status)){!["csv","excel"].includes(n.format)&&c.response||s(c.response),"blob"===n.responseType&&s(new Blob([c.response],{type:c.getResponseHeader("content-type")}));var t=c.response;try{e=JSON.parse(t)}catch(e){return void u(Error("Invalid JSON response"))}s(e)}else u(Error(c.statusText))},c.onerror=function(){u(Error("Network Error"))},a)if(n.contentType&&n.contentType!==o.DataFormats.JSON)c.send(a);else{var d=JSON.stringify(a);c.send(d)}else c.send()}))}function i(e){return e>=200&&e<300}function u(e){var t=e.match("^https?://([^/]+[.])?(domo|domotech|domorig).(com|io)?(/.*)?$"),n=e.match("(.*).(domoapps).(.*)");return!!t&&!n}function c(){var e=location.search.substr(1),t={};return e.split("&").forEach((function(e){var n=e.split("=");t[n[0]]=decodeURIComponent(n[1])})),t}function p(e,t,n){if(-1!==t.indexOf("data/v1")){var a=void 0!==n.format?r.domoFormatToRequestFormat(n.format):o.DataFormats.DEFAULT;e.setRequestHeader("Accept",a)}}e.exports=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.get="GET",e.GET="GET",e.post="POST",e.POST="POST",e.put="PUT",e.PUT="PUT",e.delete="DELETE",e.DELETE="DELETE"}(t.RequestMethods||(t.RequestMethods={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.DEFAULT="application/array-of-objects",e.ARRAY_OF_OBJECTS="application/array-of-objects",e.JSON="application/json",e.CSV="text/csv",e.EXCEL="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",e.PLAIN="text/plain"}(t.DataFormats||(t.DataFormats={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var o=n(0);t.domoFormatToRequestFormat=function(e){switch(e){case"array-of-objects":return o.DataFormats.ARRAY_OF_OBJECTS;case"array-of-arrays":return o.DataFormats.JSON;case"excel":return o.DataFormats.EXCEL;case"csv":return o.DataFormats.CSV;default:return o.DataFormats.DEFAULT}}}])}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2RvbW8vLi9zcmMvbW9kZWxzL2luZGV4LnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvZG9tby50cyIsIndlYnBhY2s6Ly9kb21vLy4vc3JjL21vZGVscy9lbnVtcy9yZXF1ZXN0LW1ldGhvZHMudHMiLCJ3ZWJwYWNrOi8vZG9tby8uL3NyYy9tb2RlbHMvZW51bXMvZGF0YS1mb3JtYXRzLnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvdXRpbHMvZGF0YS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJSZXF1ZXN0TWV0aG9kcyIsIkRhdGFGb3JtYXRzIiwicG9zdCIsInVybCIsImJvZHkiLCJvcHRpb25zIiwiZG9tb0h0dHAiLCJQT1NUIiwicHV0IiwiUFVUIiwiR0VUIiwiZGVsZXRlIiwiREVMRVRFIiwiZ2V0QWxsIiwidXJscyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkb21vIiwib25EYXRhVXBkYXRlIiwiY2IiLCJhZGRFdmVudExpc3RlbmVyIiwiZXZlbnQiLCJpc1ZlcmlmaWVkT3JpZ2luIiwib3JpZ2luIiwiZGF0YSIsImxlbmd0aCIsIm1lc3NhZ2UiLCJKU09OIiwicGFyc2UiLCJhbGlhcyIsImFjayIsInN0cmluZ2lmeSIsInNvdXJjZSIsIldpbmRvdyIsInBvc3RNZXNzYWdlIiwiZXJyIiwiY29uc29sZSIsIndhcm4iLCJuYXZpZ2F0ZSIsImlzTmV3V2luZG93IiwicGFyZW50IiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsInVzZXJBZ2VudCIsIm5hdmlnYXRvciIsInRvTG93ZXJDYXNlIiwic2FmYXJpIiwidGVzdCIsImlvcyIsImZpbHRlciIsImNvbHVtbk5hbWUiLCJjb2x1bW4iLCJvcGVyYXRvciIsInZhbHVlcyIsImRhdGFUeXBlIiwid2Via2l0IiwibWVzc2FnZUhhbmRsZXJzIiwiZG9tb2ZpbHRlciIsIm9wZXJhbmQiLCJjb25uZWN0ZWQiLCJsaXN0ZW5lcnMiLCJvbkZpbHRlcnNVcGRhdGUiLCJjb25uZWN0IiwiY2hhbm5lbCIsIk1lc3NhZ2VDaGFubmVsIiwicG9ydDIiLCJjYWxsYmFjayIsImluZGV4IiwicHVzaCIsInBvcnQxIiwib25tZXNzYWdlIiwiZSIsInJlc3BvbnNlUG9ydCIsInVuZGVmaW5lZCIsImZvckVhY2giLCJzcGxpY2UiLCJlbnYiLCJnZXRRdWVyeVBhcmFtcyIsIl9fdXRpbCIsInNldEZvcm1hdEhlYWRlcnMiLCJpc1N1Y2Nlc3MiLCJtZXRob2QiLCJhc3luYyIsInJlc29sdmUiLCJyZWplY3QiLCJyZXEiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJjb250ZW50VHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJzZXRDb250ZW50SGVhZGVycyIsInJlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIm9ubG9hZCIsInN0YXR1cyIsImluY2x1ZGVzIiwiZm9ybWF0IiwicmVzcG9uc2UiLCJCbG9iIiwidHlwZSIsImdldFJlc3BvbnNlSGVhZGVyIiwicmVzcG9uc2VTdHIiLCJleCIsIkVycm9yIiwic3RhdHVzVGV4dCIsIm9uZXJyb3IiLCJzZW5kIiwianNvbiIsIndoaXRlbGlzdGVkIiwibWF0Y2giLCJibGFja2xpc3RlZCIsInF1ZXJ5IiwibG9jYXRpb24iLCJzZWFyY2giLCJzdWJzdHIiLCJyZXN1bHQiLCJzcGxpdCIsInBhcnQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaW5kZXhPZiIsInJlcXVlc3RGb3JtYXQiLCJkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0IiwiQVJSQVlfT0ZfT0JKRUNUUyIsIkVYQ0VMIiwiQ1NWIiwiREVGQVVMVCJdLCJtYXBwaW5ncyI6Ijs7OztDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEsUUFBYyxLQUFJRCxJQUVsQkQsRUFBVyxLQUFJQyxJQVJqQixDQVNHSyxRQUFRLFdBQ1gsTyxZQ1RFLElBQUlDLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVQLFFBR25DLElBQUlDLEVBQVNJLEVBQWlCRSxHQUFZLENBQ3pDQyxFQUFHRCxFQUNIRSxHQUFHLEVBQ0hULFFBQVMsSUFVVixPQU5BVSxFQUFRSCxHQUFVSSxLQUFLVixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTTSxHQUcvREwsRUFBT1EsR0FBSSxFQUdKUixFQUFPRCxRQTBEZixPQXJEQU0sRUFBb0JNLEVBQUlGLEVBR3hCSixFQUFvQk8sRUFBSVIsRUFHeEJDLEVBQW9CUSxFQUFJLFNBQVNkLEVBQVNlLEVBQU1DLEdBQzNDVixFQUFvQlcsRUFBRWpCLEVBQVNlLElBQ2xDRyxPQUFPQyxlQUFlbkIsRUFBU2UsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFVixFQUFvQmdCLEVBQUksU0FBU3RCLEdBQ1gsb0JBQVh1QixRQUEwQkEs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QWMsTSw4RUNPMUIsU0FBWUMsR0FDVix5Q0FDQSxrREFDQSwwQkFDQSxpQkFDQSw0RUFDQSxxQkFORixDQUFZLEVBQUFBLGNBQUEsRUFBQUEsWUFBVyxNLDhFQ1B2QixXQUVBLHFDQUEwQ2dHLEdBQ3hDLE9BQVFBLEdBQ04sSUFBSyxtQkFDSCxPQUFPLEVBQUFoRyxZQUFZMkgsaUJBRXJCLElBQUssa0JBQ0gsT0FBTyxFQUFBM0gsWUFBWTJCLEtBRXJCLElBQUssUUFDSCxPQUFPLEVBQUEzQixZQUFZNEgsTUFFckIsSUFBSyxNQUNILE9BQU8sRUFBQTVILFlBQVk2SCxJQUVyQixRQUNFLE9BQU8sRUFBQTdILFlBQVk4SCIsImZpbGUiOiJkb21vLmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZG9tb1wiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJkb21vXCJdID0gZmFjdG9yeSgpO1xufSkod2luZG93LCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMSk7XG4iLCJleHBvcnQgeyBSZXF1ZXN0TWV0aG9kcyB9IGZyb20gJy4vZW51bXMvcmVxdWVzdC1tZXRob2RzJztcbmV4cG9ydCB7IERvbW9EYXRhRm9ybWF0cyB9IGZyb20gJy4vaW50ZXJmYWNlcy9kb21vLWRhdGEtZm9ybWF0cyc7XG5leHBvcnQgeyBEYXRhRm9ybWF0cyB9IGZyb20gJy4vZW51bXMvZGF0YS1mb3JtYXRzJztcbmV4cG9ydCB7IEZpbHRlckRhdGFUeXBlcyB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXItZGF0YS10eXBlcyc7XG5leHBvcnQgeyBGaWx0ZXJPcGVyYXRvcnMgfSBmcm9tICcuL2ludGVyZmFjZXMvZmlsdGVyLW9wZXJhdG9ycyc7XG5cbmV4cG9ydCB7IFJlcXVlc3RPcHRpb25zLCBPYmplY3RSZXF1ZXN0T3B0aW9ucywgQXJyYXlSZXF1ZXN0T3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXF1ZXN0LW9wdGlvbnMnO1xuZXhwb3J0IHsgUXVlcnlQYXJhbXMgfSBmcm9tICcuL2ludGVyZmFjZXMvcXVlcnktcGFyYW1zJztcbmV4cG9ydCB7IFJlcXVlc3RCb2R5LCBYTUxIdHRwUmVxdWVzdEJvZHkgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVxdWVzdC1ib2R5JztcbmV4cG9ydCB7IFJlc3BvbnNlQm9keSwgT2JqZWN0UmVzcG9uc2VCb2R5LCBBcnJheVJlc3BvbnNlQm9keSB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXNwb25zZS1ib2R5JztcbmV4cG9ydCB7IEpzb24gfSBmcm9tICcuL2ludGVyZmFjZXMvanNvbic7XG4iLCJpbXBvcnQge1xuICBSZXF1ZXN0TWV0aG9kcyxcbiAgUmVxdWVzdE9wdGlvbnMsXG4gIE9iamVjdFJlcXVlc3RPcHRpb25zLFxuICBBcnJheVJlcXVlc3RPcHRpb25zLFxuICBEYXRhRm9ybWF0cyxcbiAgUXVlcnlQYXJhbXMsXG4gIEZpbHRlckRhdGFUeXBlcyxcbiAgRmlsdGVyT3BlcmF0b3JzLFxuICBSZXF1ZXN0Qm9keSxcbiAgWE1MSHR0cFJlcXVlc3RCb2R5LFxuICBSZXNwb25zZUJvZHksXG4gIE9iamVjdFJlc3BvbnNlQm9keSxcbiAgQXJyYXlSZXNwb25zZUJvZHksXG59IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IGRvbW9Gb3JtYXRUb1JlcXVlc3RGb3JtYXQgfSBmcm9tICcuL3V0aWxzL2RhdGEtaGVscGVycyc7XG5cbmV4cG9ydCA9IGRvbW87XG5cbmNsYXNzIGRvbW8ge1xuICBzdGF0aWMgcG9zdCh1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVxdWVzdEJvZHksIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBwb3N0PFQ+KHVybDogc3RyaW5nLCBib2R5PzogUmVxdWVzdEJvZHksIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5QT1NULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG5cbiAgc3RhdGljIHB1dCh1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBwdXQ8VD4odXJsOiBzdHJpbmcsIGJvZHk/OiBSZXF1ZXN0Qm9keSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPjtcbiAgc3RhdGljIHB1dDxUPih1cmw6IHN0cmluZywgYm9keT86IFJlcXVlc3RCb2R5LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZG9tb0h0dHA8VD4oUmVxdWVzdE1ldGhvZHMuUFVULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG5cbiAgc3RhdGljIGdldCh1cmw6IHN0cmluZywgb3B0aW9uczogT2JqZWN0UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPE9iamVjdFJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldCh1cmw6IHN0cmluZywgb3B0aW9uczogQXJyYXlSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8QXJyYXlSZXNwb25zZUJvZHk+O1xuICBzdGF0aWMgZ2V0KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5HRVQsIHVybCwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVsZXRlKHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5ERUxFVEUsIHVybCwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsKHVybHM6IHN0cmluZ1tdLCBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8T2JqZWN0UmVzcG9uc2VCb2R5W11bXT47XG4gIHN0YXRpYyBnZXRBbGwodXJsczogc3RyaW5nW10sIG9wdGlvbnM6IEFycmF5UmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPEFycmF5UmVzcG9uc2VCb2R5W10+O1xuICBzdGF0aWMgZ2V0QWxsKHVybHM6IHN0cmluZ1tdLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldEFsbDxUPih1cmxzOiBzdHJpbmdbXSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUW10+O1xuICBzdGF0aWMgZ2V0QWxsPFQ+KHVybHM6IHN0cmluZ1tdLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbCh1cmxzLm1hcChmdW5jdGlvbiAodXJsKSB7XG4gICAgICByZXR1cm4gZG9tby5nZXQ8VD4odXJsLCBvcHRpb25zKTtcbiAgICB9KSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExldCB0aGUgZG9tb2FwcCBvcHRpb25hbGx5IGhhbmRsZSBpdHMgb3duIGRhdGEgdXBkYXRlcy5cbiAgICovXG4gIHN0YXRpYyBvbkRhdGFVcGRhdGUoY2I6IChhbGlhczogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkge1xuICAgICAgaWYgKCFpc1ZlcmlmaWVkT3JpZ2luKGV2ZW50Lm9yaWdpbikpXG4gICAgICAgIHJldHVybjtcblxuICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhID09PSAnc3RyaW5nJyAmJiBldmVudC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgICAgICBpZiAoIW1lc3NhZ2UuaGFzT3duUHJvcGVydHkoJ2FsaWFzJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhbGlhcyA9IG1lc3NhZ2UuYWxpYXM7XG5cbiAgICAgICAgICAvLyBzZW5kIGFja25vd2xlZGdlbWVudCB0byBwcmV2ZW50IGF1dG9yZWZyZXNoXG4gICAgICAgICAgY29uc3QgYWNrID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6ICdhY2snLFxuICAgICAgICAgICAgYWxpYXM6IGFsaWFzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChldmVudC5zb3VyY2UgaW5zdGFuY2VvZiBXaW5kb3cpIHtcbiAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShhY2ssIGV2ZW50Lm9yaWdpbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5mb3JtIGRvbW8gYXBwIHdoaWNoIGFsaWFzIGhhcyBiZWVuIHVwZGF0ZWRcbiAgICAgICAgICBjYihhbGlhcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnN0IGluZm8gPSAnVGhlcmUgd2FzIGFuIGVycm9yIGluIG9uRGF0YVVwZGF0ZSEgSXQgbWF5IGJlIHRoYXQgb3VyIGV2ZW50IGxpc3RlbmVyIGNhdWdodCAnICtcbiAgICAgICAgICAgICdhIG1lc3NhZ2UgZnJvbSBhbm90aGVyIHNvdXJjZSBhbmQgdHJpZWQgdG8gcGFyc2UgaXQsIHNvIHlvdXIgdXBkYXRlIHN0aWxsIG1heSBoYXZlIHdvcmtlZC4gJyArXG4gICAgICAgICAgICAnSWYgeW91IHdvdWxkIGxpa2UgbW9yZSBpbmZvLCBoZXJlIGlzIHRoZSBlcnJvcjogXFxuJ1xuICAgICAgICAgIGNvbnNvbGUud2FybihpbmZvLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExldCB0aGUgZG9tb2FwcCBvcHRpb25hbGx5IGhhbmRsZSBvdGhlciBldmVudHNcbiAgICovXG4gIHN0YXRpYyBjaGFubmVsPzogTWVzc2FnZUNoYW5uZWw7XG4gIHN0YXRpYyBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgc3RhdGljIGxpc3RlbmVyczogeyBbaW5kZXg6IHN0cmluZ106IEZ1bmN0aW9uW10gfSA9IHtcbiAgICBvbkZpbHRlcnNVcGRhdGU6IFtdLFxuICB9O1xuXG4gIHN0YXRpYyBjb25uZWN0ID0gKCkgPT4ge1xuICAgIGlmIChkb21vLmNvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGRvbW8uY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBkb21vLmNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHsgZXZlbnQ6ICdzdWJzY3JpYmUnIH0pLCAnKicsIFtcbiAgICAgIGRvbW8uY2hhbm5lbC5wb3J0MixcbiAgICBdKTtcbiAgfTtcblxuICAvKipcbiAgICogTGV0IHRoZSBkb21vYXBwIGhhbmRsZSBpdHMgb3duIGZpbHRlciB1cGRhdGVzXG4gICAqL1xuICBzdGF0aWMgb25GaWx0ZXJzVXBkYXRlID0gKGNhbGxiYWNrOiBGdW5jdGlvbikgPT4ge1xuICAgIGRvbW8uY29ubmVjdCgpO1xuICAgIGNvbnN0IGluZGV4ID0gZG9tby5saXN0ZW5lcnMub25GaWx0ZXJzVXBkYXRlLnB1c2goY2FsbGJhY2spIC0gMTtcblxuICAgIGRvbW8uY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSAoZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBbcmVzcG9uc2VQb3J0XSA9IGUucG9ydHM7XG4gICAgICBpZiAocmVzcG9uc2VQb3J0ID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgaWYgKGUuZGF0YS5ldmVudCA9PT0gJ2ZpbHRlcnNVcGRhdGVkJyAmJiBkb21vLmxpc3RlbmVycy5vbkZpbHRlcnNVcGRhdGUubGVuZ3RoID4gMCkge1xuICAgICAgICByZXNwb25zZVBvcnQucG9zdE1lc3NhZ2Uoe30pOyAvLyBQcmV2ZW50cyB0aGUgYXBwIGZyb20gcmVsb2FkaW5nLiBTYXlzIHdlJ3ZlIGhhbmRsZWQgaXRcbiAgICAgICAgZG9tby5saXN0ZW5lcnMub25GaWx0ZXJzVXBkYXRlLmZvckVhY2goKGNiKSA9PiBjYihlLmRhdGEuZmlsdGVycykpOyAvLyA8LSBzcGxpdCBvdXQgb25GaWx0ZXJzVXBkYXRlIHNvIHRoYXQgeW91IGNhbiBoYW5kbGUgZWFjaCBtZXNzYWdlIGRpZmZlcmVudGx5IGhlcmVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gdW5yZWdpc3RlclxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb21vLmxpc3RlbmVycy5vbkZpbHRlcnNVcGRhdGUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgbmF2aWdhdGlvbiBjaGFuZ2VcbiAgICovXG4gIHN0YXRpYyBuYXZpZ2F0ZSh1cmw6IHN0cmluZywgaXNOZXdXaW5kb3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnQ6ICduYXZpZ2F0ZScsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGlzTmV3V2luZG93OiBpc05ld1dpbmRvd1xuICAgIH0pO1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgXCIqXCIpO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlckNvbnRhaW5lcihmaWx0ZXJzOlxuICAgICh7IGNvbHVtbjogc3RyaW5nLCBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3JzLCB2YWx1ZXM6IChzdHJpbmcgfCBudW1iZXIgfCBEYXRlKVtdLCBkYXRhVHlwZTogRmlsdGVyRGF0YVR5cGVzIH1cbiAgICAgIHwgeyBjb2x1bW46IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycywgdmFsdWVzOiBEYXRlW10sIGRhdGFUeXBlOiAnREFURScgfCAnREFURVRJTUUnIH1cbiAgICAgIHwgeyBjb2x1bW46IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycywgdmFsdWVzOiBudW1iZXJbXSwgZGF0YVR5cGU6ICdOVU1FUklDJyB9XG4gICAgICB8IHsgY29sdW1uOiBzdHJpbmcsIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcnMsIHZhbHVlczogc3RyaW5nW10sIGRhdGFUeXBlOiAnU1RSSU5HJyB9KVtdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCksXG4gICAgICBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KHVzZXJBZ2VudCksXG4gICAgICBpb3MgPSAvaXBob25lfGlwb2R8aXBhZC8udGVzdCh1c2VyQWdlbnQpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnZmlsdGVyJyxcbiAgICAgIGZpbHRlcjogZmlsdGVycy5tYXAoZmlsdGVyID0+ICh7XG4gICAgICAgIGNvbHVtbk5hbWU6IGZpbHRlci5jb2x1bW4sXG4gICAgICAgIG9wZXJhdG9yOiBmaWx0ZXIub3BlcmF0b3IsXG4gICAgICAgIHZhbHVlczogZmlsdGVyLnZhbHVlcyxcbiAgICAgICAgZGF0YVR5cGU6IGZpbHRlci5kYXRhVHlwZVxuICAgICAgfSkpXG4gICAgfSk7XG5cbiAgICBpZiAoaW9zICYmICFzYWZhcmkpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmRvbW9maWx0ZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgIGZpbHRlcnMubWFwKGZpbHRlciA9PlxuICAgICAgICAgICh7IGNvbHVtbjogZmlsdGVyLmNvbHVtbiwgb3BlcmFuZDogZmlsdGVyLm9wZXJhdG9yLCB2YWx1ZXM6IGZpbHRlci52YWx1ZXMsIGRhdGFUeXBlOiBmaWx0ZXIuZGF0YVR5cGUgfSkpXG4gICAgICApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgXCIqXCIpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBlbnYgPSBnZXRRdWVyeVBhcmFtcygpO1xuXG4gIHN0YXRpYyBfX3V0aWwgPSB7XG4gICAgaXNWZXJpZmllZE9yaWdpbixcbiAgICBnZXRRdWVyeVBhcmFtcyxcbiAgICBzZXRGb3JtYXRIZWFkZXJzLFxuICAgIGlzU3VjY2Vzc1xuICB9XG5cbn07XG5cbmZ1bmN0aW9uIGRvbW9IdHRwKG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPE9iamVjdFJlc3BvbnNlQm9keVtdPjtcbmZ1bmN0aW9uIGRvbW9IdHRwKG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBBcnJheVJlcXVlc3RPcHRpb25zLCBhc3luYz86IGJvb2xlYW4sIGJvZHk/OiBSZXF1ZXN0Qm9keSk6IFByb21pc2U8QXJyYXlSZXNwb25zZUJvZHk+O1xuZnVuY3Rpb24gZG9tb0h0dHAobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLCBhc3luYz86IGJvb2xlYW4sIGJvZHk/OiBSZXF1ZXN0Qm9keSk6IFByb21pc2U8UmVzcG9uc2VCb2R5PjtcbmZ1bmN0aW9uIGRvbW9IdHRwPFQ+KG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsIHVybDogc3RyaW5nLCBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucywgYXN5bmM/OiBib29sZWFuLCBib2R5PzogUmVxdWVzdEJvZHkpOiBQcm9taXNlPFQ+O1xuZnVuY3Rpb24gZG9tb0h0dHAobWV0aG9kOiBSZXF1ZXN0TWV0aG9kcywgdXJsOiBzdHJpbmcsIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLCBhc3luYz86IGJvb2xlYW4sIGJvZHk/OiBSZXF1ZXN0Qm9keSk6IFByb21pc2U8UmVzcG9uc2VCb2R5PiB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmU6ICh2YWx1ZT86IFJlc3BvbnNlQm9keSkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogRXJyb3IpID0+IHZvaWQpIHtcbiAgICAvLyBEbyB0aGUgdXN1YWwgWEhSIHN0dWZmXG4gICAgbGV0IHJlcTogWE1MSHR0cFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgIHJlcS5vcGVuKG1ldGhvZCwgdXJsLCBhc3luYyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVxLm9wZW4obWV0aG9kLCB1cmwpO1xuICAgIH1cbiAgICBzZXRGb3JtYXRIZWFkZXJzKHJlcSwgdXJsLCBvcHRpb25zKTtcbiAgICBzZXRDb250ZW50SGVhZGVycyhyZXEsIG9wdGlvbnMpO1xuICAgIHNldFJlc3BvbnNlVHlwZShyZXEsIG9wdGlvbnMpO1xuXG4gICAgcmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgZXZlbiBvbiA0MDQgZXRjIHNvIGNoZWNrIHRoZSBzdGF0dXNcbiAgICAgIGlmIChpc1N1Y2Nlc3MocmVxLnN0YXR1cykpIHtcblxuICAgICAgICBpZiAoWydjc3YnLCAnZXhjZWwnXS5pbmNsdWRlcyhvcHRpb25zLmZvcm1hdCkgfHwgIXJlcS5yZXNwb25zZSkge1xuICAgICAgICAgIHJlc29sdmUocmVxLnJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5yZXNwb25zZVR5cGUgPT09ICdibG9iJykge1xuICAgICAgICAgIHJlc29sdmUobmV3IEJsb2IoW3JlcS5yZXNwb25zZV0sIHsgdHlwZTogcmVxLmdldFJlc3BvbnNlSGVhZGVyKCdjb250ZW50LXR5cGUnKSB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VTdHIgPSByZXEucmVzcG9uc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYoIXJlc3BvbnNlU3RyKSB7XG4gICAgICAgICAgLy8gICByZXNwb25zZVN0ciA9IFwie31cIjtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2VTdHIpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChleCkge1xuICAgICAgICAgIHJlamVjdChFcnJvcignSW52YWxpZCBKU09OIHJlc3BvbnNlJykpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIHdpdGggdGhlIHJlc3BvbnNlIHRleHRcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgcmVqZWN0IHdpdGggdGhlIHN0YXR1cyB0ZXh0XG4gICAgICAgIC8vIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlIGEgbWVhbmluZ2Z1bCBlcnJvclxuICAgICAgICByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZWplY3QoRXJyb3IoXCJOZXR3b3JrIEVycm9yXCIpKTtcbiAgICB9O1xuXG4gICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxuICAgIGlmIChib2R5KSB7XG4gICAgICBpZiAoIW9wdGlvbnMuY29udGVudFR5cGUgfHwgb3B0aW9ucy5jb250ZW50VHlwZSA9PT0gRGF0YUZvcm1hdHMuSlNPTikge1xuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG4gICAgICAgIC8vIE1ha2UgdGhlIHJlcXVlc3RcbiAgICAgICAgcmVxLnNlbmQoanNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBib2R5IGNhbiBubyBsb25nZXIgYmUgSlNPTlxuICAgICAgICByZXEuc2VuZChib2R5IGFzIFhNTEh0dHBSZXF1ZXN0Qm9keSk7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmVxLnNlbmQoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1N1Y2Nlc3Moc3RhdHVzOiBudW1iZXIpIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xufVxuXG5mdW5jdGlvbiBpc1ZlcmlmaWVkT3JpZ2luKG9yaWdpbjogc3RyaW5nKSB7XG4gIGNvbnN0IHdoaXRlbGlzdGVkID0gb3JpZ2luLm1hdGNoKCdeaHR0cHM/Oi8vKFteL10rWy5dKT8oZG9tb3xkb21vdGVjaHxkb21vcmlnKVxcLihjb218aW8pPygvLiopPyQnKTtcbiAgY29uc3QgYmxhY2tsaXN0ZWQgPSBvcmlnaW4ubWF0Y2goJyguKilcXC4oZG9tb2FwcHMpXFwuKC4qKScpO1xuICByZXR1cm4gISF3aGl0ZWxpc3RlZCAmJiAhYmxhY2tsaXN0ZWQ7XG59XG5cbmZ1bmN0aW9uIGdldFF1ZXJ5UGFyYW1zKCk6IFF1ZXJ5UGFyYW1zIHtcbiAgY29uc3QgcXVlcnkgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpO1xuICBsZXQgcmVzdWx0OiB7IFtpbmRleDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgcXVlcnkuc3BsaXQoXCImXCIpLmZvckVhY2goZnVuY3Rpb24gKHBhcnQpIHtcbiAgICBjb25zdCBpdGVtID0gcGFydC5zcGxpdChcIj1cIik7XG4gICAgcmVzdWx0W2l0ZW1bMF1dID0gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW1bMV0pO1xuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gc2V0Rm9ybWF0SGVhZGVycyhyZXE6IFhNTEh0dHBSZXF1ZXN0LCB1cmw6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSB7XG4gIGlmICh1cmwuaW5kZXhPZignZGF0YS92MScpID09PSAtMSkgeyByZXR1cm47IH1cbiAgLy8gc2V0IGZvcm1hdFxuICBjb25zdCByZXF1ZXN0Rm9ybWF0OiBEYXRhRm9ybWF0cyA9IChvcHRpb25zLmZvcm1hdCAhPT0gdW5kZWZpbmVkKVxuICAgID8gKGRvbW9Gb3JtYXRUb1JlcXVlc3RGb3JtYXQob3B0aW9ucy5mb3JtYXQpKVxuICAgIDogKERhdGFGb3JtYXRzLkRFRkFVTFQpO1xuXG4gIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCByZXF1ZXN0Rm9ybWF0KTtcbn1cblxuZnVuY3Rpb24gc2V0Q29udGVudEhlYWRlcnMocmVxOiBYTUxIdHRwUmVxdWVzdCwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKSB7XG4gIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlKSB7XG4gICAgLy8gc2V0IGNvbnRlbnQgdHlwZSBpZiB1c2VyIHBhc3NlZCBvcHRpb25cbiAgICBpZiAob3B0aW9ucy5jb250ZW50VHlwZSAhPT0gJ211bHRpcGFydCcpIHtcbiAgICAgIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIERhdGFGb3JtYXRzLkpTT04pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJlc3BvbnNlVHlwZShyZXE6IFhNTEh0dHBSZXF1ZXN0LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpIHtcbiAgLy9zZXQgcmVzcG9uc2UgdHlwZSBpZiB1c2VyIHBhc3NlZCBvcHRpb25cbiAgaWYgKG9wdGlvbnMucmVzcG9uc2VUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXEucmVzcG9uc2VUeXBlID0gb3B0aW9ucy5yZXNwb25zZVR5cGU7XG4gIH1cbn0iLCJleHBvcnQgZW51bSBSZXF1ZXN0TWV0aG9kcyB7XG4gIGdldCA9ICdHRVQnLFxuICBHRVQgPSAnR0VUJyxcbiAgcG9zdCA9ICdQT1NUJyxcbiAgUE9TVCA9ICdQT1NUJyxcbiAgcHV0ID0gJ1BVVCcsXG4gIFBVVCA9ICdQVVQnLFxuICBkZWxldGUgPSAnREVMRVRFJyxcbiAgREVMRVRFID0gJ0RFTEVURScsXG59XG4iLCIvKipcbiAqIFN1cHBvcnRlZCBgYWNjZXB0YCBoZWFkZXJzIGZvciBjb250cm9sbGluZyB0aGUgZm9ybWF0XG4gKiBvZiB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERvbW8uXG4gKlxuICogU2VlIFtkZXZlbG9wZXIuZG9tby5jb21dKGh0dHBzOi8vZGV2ZWxvcGVyLmRvbW8uY29tL2RvY3MvZGV2LXN0dWRpby1yZWZlcmVuY2VzL2RhdGEtYXBpI0RhdGElMjBGb3JtYXRzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGVudW0gRGF0YUZvcm1hdHMge1xuICBERUZBVUxUID0gJ2FwcGxpY2F0aW9uL2FycmF5LW9mLW9iamVjdHMnLFxuICBBUlJBWV9PRl9PQkpFQ1RTID0gJ2FwcGxpY2F0aW9uL2FycmF5LW9mLW9iamVjdHMnLFxuICBKU09OID0gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICBDU1YgPSAndGV4dC9jc3YnLFxuICBFWENFTCA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG4gIFBMQUlOID0gJ3RleHQvcGxhaW4nXG59IiwiaW1wb3J0IHsgRG9tb0RhdGFGb3JtYXRzLCBEYXRhRm9ybWF0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0KGZvcm1hdDogRG9tb0RhdGFGb3JtYXRzKTogRGF0YUZvcm1hdHMge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ2FycmF5LW9mLW9iamVjdHMnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuQVJSQVlfT0ZfT0JKRUNUUztcbiAgICB9XG4gICAgY2FzZSAnYXJyYXktb2YtYXJyYXlzJzoge1xuICAgICAgcmV0dXJuIERhdGFGb3JtYXRzLkpTT047XG4gICAgfVxuICAgIGNhc2UgJ2V4Y2VsJzoge1xuICAgICAgcmV0dXJuIERhdGFGb3JtYXRzLkVYQ0VMO1xuICAgIH1cbiAgICBjYXNlICdjc3YnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuQ1NWO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuREVGQVVMVDtcbiAgICB9XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.domo=t():e.domo=t()}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(2);t.RequestMethods=r.RequestMethods;var o=n(3);t.DataFormats=o.DataFormats},function(e,t,n){"use strict";var r=n(0),o=n(4),a=function(){function e(){}return e.post=function(e,t,n){return i(r.RequestMethods.POST,e,n,!0,t)},e.put=function(e,t,n){return i(r.RequestMethods.PUT,e,n,!0,t)},e.get=function(e,t){return i(r.RequestMethods.GET,e,t)},e.delete=function(e,t){return i(r.RequestMethods.DELETE,e,t)},e.getAll=function(t,n){return Promise.all(t.map((function(t){return e.get(t,n)})))},e.onDataUpdate=function(e){function t(t){if(c(t.origin)&&"string"==typeof t.data&&t.data.length>0)try{var n=JSON.parse(t.data);if(!n.hasOwnProperty("alias"))return;var r=n.alias,o=JSON.stringify({event:"ack",alias:r});t.source instanceof Window&&t.source.postMessage(o,t.origin),e(r)}catch(e){console.warn("There was an error in onDataUpdate! It may be that our event listener caught a message from another source and tried to parse it, so your update still may have worked. If you would like more info, here is the error: \n",e)}}return window.addEventListener("message",t),function(){return window.removeEventListener("message",t)}},e.navigate=function(e,t){var n=JSON.stringify({event:"navigate",url:e,isNewWindow:t});window.parent.postMessage(n,"*")},e.filterContainer=function(e){var t=window.navigator.userAgent.toLowerCase(),n=/safari/.test(t),r=/iphone|ipod|ipad/.test(t),o=JSON.stringify({event:"filter",filter:e.map((function(e){return{columnName:e.column,operator:e.operator,values:e.values,dataType:e.dataType}}))});r&&!n?window.webkit.messageHandlers.domofilter.postMessage(e.map((function(e){return{column:e.column,operand:e.operator,values:e.values,dataType:e.dataType}}))):window.parent.postMessage(o,"*")},e.connected=!1,e.listeners={onFiltersUpdate:[]},e.connect=function(){e.connected||(e.connected=!0,e.channel=new MessageChannel,window.parent.postMessage(JSON.stringify({event:"subscribe"}),"*",[e.channel.port2]))},e.onFiltersUpdate=function(t){e.connect();var n=e.listeners.onFiltersUpdate.push(t)-1;return e.channel.port1.onmessage=function(t){var n=t.ports[0];void 0!==n&&"filtersUpdated"===t.data.event&&e.listeners.onFiltersUpdate.length>0&&(n.postMessage({}),e.listeners.onFiltersUpdate.forEach((function(e){return e(t.data.filters)})))},function(){e.listeners.onFiltersUpdate.splice(n,1)}},e.env=d(),e.__util={isVerifiedOrigin:c,getQueryParams:d,setFormatHeaders:f,isSuccess:u},e}(),s=window.__RYUU_AUTHENTICATION_TOKEN__;function i(e,t,n,o,a){return n=n||{},new Promise((function(i,c){var d=new XMLHttpRequest;if(o?d.open(e,t,o):d.open(e,t),f(d,t,n),function(e,t){t.contentType?"multipart"!==t.contentType&&e.setRequestHeader("Content-Type",t.contentType):e.setRequestHeader("Content-Type",r.DataFormats.JSON)}(d,n),function(e){s&&e.setRequestHeader("X-DOMO-Ryuu-Token",s)}(d),function(e,t){void 0!==t.responseType&&(e.responseType=t.responseType)}(d,n),d.onload=function(){var e;if(u(d.status)){!["csv","excel"].includes(n.format)&&d.response||i(d.response),"blob"===n.responseType&&i(new Blob([d.response],{type:d.getResponseHeader("content-type")}));var t=d.response;try{e=JSON.parse(t)}catch(e){return void c(Error("Invalid JSON response"))}i(e)}else c(Error(d.statusText))},d.onerror=function(){c(Error("Network Error"))},a)if(n.contentType&&n.contentType!==r.DataFormats.JSON)d.send(a);else{var p=JSON.stringify(a);d.send(p)}else d.send()}))}function u(e){return e>=200&&e<300}function c(e){var t=e.match("^https?://([^/]+[.])?(domo|domotech|domorig).(com|io)?(/.*)?$"),n=e.match("(.*).(domoapps).(.*)");return!!t&&!n}function d(){var e=location.search.substr(1),t={};return e.split("&").forEach((function(e){var n=e.split("=");t[n[0]]=decodeURIComponent(n[1])})),t}function f(e,t,n){if(-1!==t.indexOf("data/v1")){var a=void 0!==n.format?o.domoFormatToRequestFormat(n.format):r.DataFormats.DEFAULT;e.setRequestHeader("Accept",a)}}function p(e){if(e===document.body)return function(e){for(var t=0;t<e.children.length;t++)p(e.children[t])}(e);var t,n;if(e.dataset&&e.dataset.domoHref?(t="href",n=e.dataset.domoHref):e.dataset&&e.dataset.domoSrc?(t="src",n=e.dataset.domoSrc):e.hasAttribute&&e.hasAttribute("href")?(t="href",n=e.getAttribute("href")):e.hasAttribute&&e.hasAttribute("src")&&(t="src",n=e.getAttribute("src")),n&&s){var r=new URL(n,document.location.origin);r.origin===document.location.origin&&(r.searchParams.append("rpt",s),e.setAttribute(t,r.href))}}var l=new MutationObserver((function(e){for(var t=0,n=e;t<n.length;t++){n[t].addedNodes.forEach(p)}}));l.observe(document.documentElement,{childList:!0}),l.observe(document.head,{childList:!0}),e.exports=a},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.get="GET",e.GET="GET",e.post="POST",e.POST="POST",e.put="PUT",e.PUT="PUT",e.delete="DELETE",e.DELETE="DELETE"}(t.RequestMethods||(t.RequestMethods={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.DEFAULT="application/array-of-objects",e.ARRAY_OF_OBJECTS="application/array-of-objects",e.JSON="application/json",e.CSV="text/csv",e.EXCEL="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",e.PLAIN="text/plain"}(t.DataFormats||(t.DataFormats={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(0);t.domoFormatToRequestFormat=function(e){switch(e){case"array-of-objects":return r.DataFormats.ARRAY_OF_OBJECTS;case"array-of-arrays":return r.DataFormats.JSON;case"excel":return r.DataFormats.EXCEL;case"csv":return r.DataFormats.CSV;default:return r.DataFormats.DEFAULT}}}])}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9kb21vL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL2RvbW8vLi9zcmMvbW9kZWxzL2luZGV4LnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvZG9tby50cyIsIndlYnBhY2s6Ly9kb21vLy4vc3JjL21vZGVscy9lbnVtcy9yZXF1ZXN0LW1ldGhvZHMudHMiLCJ3ZWJwYWNrOi8vZG9tby8uL3NyYy9tb2RlbHMvZW51bXMvZGF0YS1mb3JtYXRzLnRzIiwid2VicGFjazovL2RvbW8vLi9zcmMvdXRpbHMvZGF0YS1oZWxwZXJzLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsIndpbmRvdyIsImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJSZXF1ZXN0TWV0aG9kcyIsIkRhdGFGb3JtYXRzIiwicG9zdCIsInVybCIsImJvZHkiLCJvcHRpb25zIiwiZG9tb0h0dHAiLCJQT1NUIiwicHV0IiwiUFVUIiwiR0VUIiwiZGVsZXRlIiwiREVMRVRFIiwiZ2V0QWxsIiwidXJscyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJkb21vIiwib25EYXRhVXBkYXRlIiwiY2IiLCJpbm5lckNhbGxiYWNrIiwiZXZlbnQiLCJpc1ZlcmlmaWVkT3JpZ2luIiwib3JpZ2luIiwiZGF0YSIsImxlbmd0aCIsIm1lc3NhZ2UiLCJKU09OIiwicGFyc2UiLCJhbGlhcyIsImFjayIsInN0cmluZ2lmeSIsInNvdXJjZSIsIldpbmRvdyIsInBvc3RNZXNzYWdlIiwiZXJyIiwiY29uc29sZSIsIndhcm4iLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm5hdmlnYXRlIiwiaXNOZXdXaW5kb3ciLCJwYXJlbnQiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwidXNlckFnZW50IiwibmF2aWdhdG9yIiwidG9Mb3dlckNhc2UiLCJzYWZhcmkiLCJ0ZXN0IiwiaW9zIiwiZmlsdGVyIiwiY29sdW1uTmFtZSIsImNvbHVtbiIsIm9wZXJhdG9yIiwidmFsdWVzIiwiZGF0YVR5cGUiLCJ3ZWJraXQiLCJtZXNzYWdlSGFuZGxlcnMiLCJkb21vZmlsdGVyIiwib3BlcmFuZCIsImNvbm5lY3RlZCIsImxpc3RlbmVycyIsIm9uRmlsdGVyc1VwZGF0ZSIsImNvbm5lY3QiLCJjaGFubmVsIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MiIsImNhbGxiYWNrIiwiaW5kZXgiLCJwdXNoIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJlIiwicmVzcG9uc2VQb3J0IiwidW5kZWZpbmVkIiwiZm9yRWFjaCIsInNwbGljZSIsImVudiIsImdldFF1ZXJ5UGFyYW1zIiwiX191dGlsIiwic2V0Rm9ybWF0SGVhZGVycyIsImlzU3VjY2VzcyIsInRva2VuIiwiX19SWVVVX0FVVEhFTlRJQ0FUSU9OX1RPS0VOX18iLCJtZXRob2QiLCJhc3luYyIsInJlc29sdmUiLCJyZWplY3QiLCJyZXEiLCJYTUxIdHRwUmVxdWVzdCIsIm9wZW4iLCJjb250ZW50VHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJzZXRDb250ZW50SGVhZGVycyIsInNldEF1dGhUb2tlbkhlYWRlciIsInJlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIm9ubG9hZCIsInN0YXR1cyIsImluY2x1ZGVzIiwiZm9ybWF0IiwicmVzcG9uc2UiLCJCbG9iIiwidHlwZSIsImdldFJlc3BvbnNlSGVhZGVyIiwicmVzcG9uc2VTdHIiLCJleCIsIkVycm9yIiwic3RhdHVzVGV4dCIsIm9uZXJyb3IiLCJzZW5kIiwianNvbiIsIndoaXRlbGlzdGVkIiwibWF0Y2giLCJibGFja2xpc3RlZCIsInF1ZXJ5IiwibG9jYXRpb24iLCJzZWFyY2giLCJzdWJzdHIiLCJyZXN1bHQiLCJzcGxpdCIsInBhcnQiLCJpdGVtIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiaW5kZXhPZiIsInJlcXVlc3RGb3JtYXQiLCJkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0IiwiREVGQVVMVCIsImhhbmRsZU5vZGUiLCJub2RlIiwiZG9jdW1lbnQiLCJjaGlsZHJlbiIsInByb2Nlc3NCb2R5IiwiYXR0ciIsImRhdGFzZXQiLCJkb21vSHJlZiIsImRvbW9TcmMiLCJoYXNBdHRyaWJ1dGUiLCJnZXRBdHRyaWJ1dGUiLCJuZXdVcmwiLCJVUkwiLCJzZWFyY2hQYXJhbXMiLCJhcHBlbmQiLCJzZXRBdHRyaWJ1dGUiLCJocmVmIiwib2IiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zIiwiYWRkZWROb2RlcyIsIm9ic2VydmUiLCJkb2N1bWVudEVsZW1lbnQiLCJjaGlsZExpc3QiLCJoZWFkIiwiQVJSQVlfT0ZfT0JKRUNUUyIsIkVYQ0VMIiwiQ1NWIl0sIm1hcHBpbmdzIjoiOzs7O0NBQUEsU0FBMkNBLEVBQU1DLEdBQzFCLGlCQUFaQyxTQUEwQyxpQkFBWEMsT0FDeENBLE9BQU9ELFFBQVVELElBQ1EsbUJBQVhHLFFBQXlCQSxPQUFPQyxJQUM5Q0QsT0FBTyxHQUFJSCxHQUNlLGlCQUFaQyxRQUNkQSxRQUFjLEtBQUlELElBRWxCRCxFQUFXLEtBQUlDLElBUmpCLENBU0dLLFFBQVEsV0FDWCxPLFlDVEUsSUFBSUMsRUFBbUIsR0FHdkIsU0FBU0MsRUFBb0JDLEdBRzVCLEdBQUdGLEVBQWlCRSxHQUNuQixPQUFP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LElBQU15RCxFQUFTLElBQUlDLElBQUkzSSxFQUFLaUksU0FBU2QsU0FBUzlGLFFBQ3hCLEVBQVNBLFNBQVc0RyxTQUFTZCxTQUFTOUYsU0FFMURxSCxFQUFPRSxhQUFhQyxPQUFPLE1BQU81RCxHQUNsQytDLEVBQUtjLGFBQWFWLEVBQU1NLEVBQU9LLFFBV3JDLElBQU1DLEVBQUssSUFBSUMsa0JBQWlCLFNBQUNDLEdBQy9CLElBQXFCLFVBQUFBLEVBQUEsZUFBVyxDQUFmLEtBQ1JDLFdBQVd6RSxRQUFRcUQsT0FHOUJpQixFQUFHSSxRQUFRbkIsU0FBU29CLGdCQUFpQixDQUFFQyxXQUFXLElBQ2xETixFQUFHSSxRQUFRbkIsU0FBU3NCLEtBQU0sQ0FBRUQsV0FBVyxJQXpjdkMsVUFBU3ZJLEcsOEVDakJULFNBQVlsQixHQUNWLFlBQ0EsWUFDQSxjQUNBLGNBQ0EsWUFDQSxZQUNBLGtCQUNBLGtCQVJGLENBQVksRUFBQUEsaUJBQUEsRUFBQUEsZUFBYyxNLDhFQ08xQixTQUFZQyxHQUNWLHlDQUNBLGtEQUNBLDBCQUNBLGlCQUNBLDRFQUNBLHFCQU5GLENBQVksRUFBQUEsY0FBQSxFQUFBQSxZQUFXLE0sOEVDUHZCLFdBRUEscUNBQTBDcUcsR0FDeEMsT0FBUUEsR0FDTixJQUFLLG1CQUNILE9BQU8sRUFBQXJHLFlBQVkwSixpQkFFckIsSUFBSyxrQkFDSCxPQUFPLEVBQUExSixZQUFZMkIsS0FFckIsSUFBSyxRQUNILE9BQU8sRUFBQTNCLFlBQVkySixNQUVyQixJQUFLLE1BQ0gsT0FBTyxFQUFBM0osWUFBWTRKLElBRXJCLFFBQ0UsT0FBTyxFQUFBNUosWUFBWWdJIiwiZmlsZSI6ImRvbW8uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJkb21vXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImRvbW9cIl0gPSBmYWN0b3J5KCk7XG59KSh3aW5kb3csIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcbiIsImV4cG9ydCB7IFJlcXVlc3RNZXRob2RzIH0gZnJvbSAnLi9lbnVtcy9yZXF1ZXN0LW1ldGhvZHMnO1xuZXhwb3J0IHsgRG9tb0RhdGFGb3JtYXRzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RvbW8tZGF0YS1mb3JtYXRzJztcbmV4cG9ydCB7IERhdGFGb3JtYXRzIH0gZnJvbSAnLi9lbnVtcy9kYXRhLWZvcm1hdHMnO1xuZXhwb3J0IHsgRmlsdGVyRGF0YVR5cGVzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2ZpbHRlci1kYXRhLXR5cGVzJztcbmV4cG9ydCB7IEZpbHRlck9wZXJhdG9ycyB9IGZyb20gJy4vaW50ZXJmYWNlcy9maWx0ZXItb3BlcmF0b3JzJztcblxuZXhwb3J0IHsgUmVxdWVzdE9wdGlvbnMsIE9iamVjdFJlcXVlc3RPcHRpb25zLCBBcnJheVJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcXVlc3Qtb3B0aW9ucyc7XG5leHBvcnQgeyBRdWVyeVBhcmFtcyB9IGZyb20gJy4vaW50ZXJmYWNlcy9xdWVyeS1wYXJhbXMnO1xuZXhwb3J0IHsgUmVxdWVzdEJvZHksIFhNTEh0dHBSZXF1ZXN0Qm9keSB9IGZyb20gJy4vaW50ZXJmYWNlcy9yZXF1ZXN0LWJvZHknO1xuZXhwb3J0IHsgUmVzcG9uc2VCb2R5LCBPYmplY3RSZXNwb25zZUJvZHksIEFycmF5UmVzcG9uc2VCb2R5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3Jlc3BvbnNlLWJvZHknO1xuZXhwb3J0IHsgSnNvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9qc29uJztcbiIsImltcG9ydCB7XG4gIFJlcXVlc3RNZXRob2RzLFxuICBSZXF1ZXN0T3B0aW9ucyxcbiAgT2JqZWN0UmVxdWVzdE9wdGlvbnMsXG4gIEFycmF5UmVxdWVzdE9wdGlvbnMsXG4gIERhdGFGb3JtYXRzLFxuICBRdWVyeVBhcmFtcyxcbiAgRmlsdGVyRGF0YVR5cGVzLFxuICBGaWx0ZXJPcGVyYXRvcnMsXG4gIFJlcXVlc3RCb2R5LFxuICBYTUxIdHRwUmVxdWVzdEJvZHksXG4gIFJlc3BvbnNlQm9keSxcbiAgT2JqZWN0UmVzcG9uc2VCb2R5LFxuICBBcnJheVJlc3BvbnNlQm9keSxcbn0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQgeyBkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0IH0gZnJvbSBcIi4vdXRpbHMvZGF0YS1oZWxwZXJzXCI7XG5cbmV4cG9ydCA9IGRvbW87XG5cbmNsYXNzIGRvbW8ge1xuICBzdGF0aWMgcG9zdChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5PzogUmVxdWVzdEJvZHksXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVzcG9uc2VCb2R5PjtcbiAgc3RhdGljIHBvc3Q8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keT86IFJlcXVlc3RCb2R5LFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFQ+O1xuICBzdGF0aWMgcG9zdDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5PzogUmVxdWVzdEJvZHksXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5QT1NULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG5cbiAgc3RhdGljIHB1dChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5PzogUmVxdWVzdEJvZHksXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8UmVzcG9uc2VCb2R5PjtcbiAgc3RhdGljIHB1dDxUPihcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5PzogUmVxdWVzdEJvZHksXG4gICAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBwdXQ8VD4oXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgYm9keT86IFJlcXVlc3RCb2R5LFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gZG9tb0h0dHA8VD4oUmVxdWVzdE1ldGhvZHMuUFVULCB1cmwsIG9wdGlvbnMsIHRydWUsIGJvZHkpO1xuICB9XG5cbiAgc3RhdGljIGdldChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPE9iamVjdFJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldChcbiAgICB1cmw6IHN0cmluZyxcbiAgICBvcHRpb25zOiBBcnJheVJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8QXJyYXlSZXNwb25zZUJvZHk+O1xuICBzdGF0aWMgZ2V0KHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBnZXQ8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5HRVQsIHVybCwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVsZXRlKHVybDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlQm9keT47XG4gIHN0YXRpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD47XG4gIHN0YXRpYyBkZWxldGU8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBkb21vSHR0cDxUPihSZXF1ZXN0TWV0aG9kcy5ERUxFVEUsIHVybCwgb3B0aW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0QWxsKFxuICAgIHVybHM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM6IE9iamVjdFJlcXVlc3RPcHRpb25zXG4gICk6IFByb21pc2U8T2JqZWN0UmVzcG9uc2VCb2R5W11bXT47XG4gIHN0YXRpYyBnZXRBbGwoXG4gICAgdXJsczogc3RyaW5nW10sXG4gICAgb3B0aW9uczogQXJyYXlSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPEFycmF5UmVzcG9uc2VCb2R5W10+O1xuICBzdGF0aWMgZ2V0QWxsKFxuICAgIHVybHM6IHN0cmluZ1tdLFxuICAgIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc1xuICApOiBQcm9taXNlPFJlc3BvbnNlQm9keVtdPjtcbiAgc3RhdGljIGdldEFsbDxUPih1cmxzOiBzdHJpbmdbXSwgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUW10+O1xuICBzdGF0aWMgZ2V0QWxsPFQ+KHVybHM6IHN0cmluZ1tdLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFRbXT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgIHVybHMubWFwKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgcmV0dXJuIGRvbW8uZ2V0PFQ+KHVybCwgb3B0aW9ucyk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogTGV0IHRoZSBkb21vYXBwIG9wdGlvbmFsbHkgaGFuZGxlIGl0cyBvd24gZGF0YSB1cGRhdGVzLlxuICAgKi9cbiAgc3RhdGljIG9uRGF0YVVwZGF0ZShjYjogKGFsaWFzOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICBmdW5jdGlvbiBpbm5lckNhbGxiYWNrKGV2ZW50OiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgIGlmICghaXNWZXJpZmllZE9yaWdpbihldmVudC5vcmlnaW4pKSByZXR1cm47XG5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJiBldmVudC5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgICAgICBpZiAoIW1lc3NhZ2UuaGFzT3duUHJvcGVydHkoXCJhbGlhc1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFsaWFzID0gbWVzc2FnZS5hbGlhcztcblxuICAgICAgICAgIC8vIHNlbmQgYWNrbm93bGVkZ2VtZW50IHRvIHByZXZlbnQgYXV0b3JlZnJlc2hcbiAgICAgICAgICBjb25zdCBhY2sgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogXCJhY2tcIixcbiAgICAgICAgICAgIGFsaWFzOiBhbGlhcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZXZlbnQuc291cmNlIGluc3RhbmNlb2YgV2luZG93KSB7XG4gICAgICAgICAgICBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoYWNrLCBldmVudC5vcmlnaW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGluZm9ybSBkb21vIGFwcCB3aGljaCBhbGlhcyBoYXMgYmVlbiB1cGRhdGVkXG4gICAgICAgICAgY2IoYWxpYXMpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zdCBpbmZvID1cbiAgICAgICAgICAgIFwiVGhlcmUgd2FzIGFuIGVycm9yIGluIG9uRGF0YVVwZGF0ZSEgSXQgbWF5IGJlIHRoYXQgb3VyIGV2ZW50IGxpc3RlbmVyIGNhdWdodCBcIiArXG4gICAgICAgICAgICBcImEgbWVzc2FnZSBmcm9tIGFub3RoZXIgc291cmNlIGFuZCB0cmllZCB0byBwYXJzZSBpdCwgc28geW91ciB1cGRhdGUgc3RpbGwgbWF5IGhhdmUgd29ya2VkLiBcIiArXG4gICAgICAgICAgICBcIklmIHlvdSB3b3VsZCBsaWtlIG1vcmUgaW5mbywgaGVyZSBpcyB0aGUgZXJyb3I6IFxcblwiO1xuICAgICAgICAgIGNvbnNvbGUud2FybihpbmZvLCBlcnIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBpbm5lckNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGlubmVyQ2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIExldCB0aGUgZG9tb2FwcCBvcHRpb25hbGx5IGhhbmRsZSBvdGhlciBldmVudHNcbiAgICovXG4gIHN0YXRpYyBjaGFubmVsPzogTWVzc2FnZUNoYW5uZWw7XG4gIHN0YXRpYyBjb25uZWN0ZWQgPSBmYWxzZTtcbiAgc3RhdGljIGxpc3RlbmVyczogeyBbaW5kZXg6IHN0cmluZ106IEZ1bmN0aW9uW10gfSA9IHtcbiAgICBvbkZpbHRlcnNVcGRhdGU6IFtdLFxuICB9O1xuXG4gIHN0YXRpYyBjb25uZWN0ID0gKCkgPT4ge1xuICAgIGlmIChkb21vLmNvbm5lY3RlZCkgcmV0dXJuO1xuICAgIGRvbW8uY29ubmVjdGVkID0gdHJ1ZTtcbiAgICBkb21vLmNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHsgZXZlbnQ6IFwic3Vic2NyaWJlXCIgfSksIFwiKlwiLCBbXG4gICAgICBkb21vLmNoYW5uZWwucG9ydDIsXG4gICAgXSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIExldCB0aGUgZG9tb2FwcCBoYW5kbGUgaXRzIG93biBmaWx0ZXIgdXBkYXRlc1xuICAgKi9cbiAgc3RhdGljIG9uRmlsdGVyc1VwZGF0ZSA9IChjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgICBkb21vLmNvbm5lY3QoKTtcbiAgICBjb25zdCBpbmRleCA9IGRvbW8ubGlzdGVuZXJzLm9uRmlsdGVyc1VwZGF0ZS5wdXNoKGNhbGxiYWNrKSAtIDE7XG5cbiAgICBkb21vLmNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gKGU6IE1lc3NhZ2VFdmVudCkgPT4ge1xuICAgICAgY29uc3QgW3Jlc3BvbnNlUG9ydF0gPSBlLnBvcnRzO1xuICAgICAgaWYgKHJlc3BvbnNlUG9ydCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIGlmIChcbiAgICAgICAgZS5kYXRhLmV2ZW50ID09PSBcImZpbHRlcnNVcGRhdGVkXCIgJiZcbiAgICAgICAgZG9tby5saXN0ZW5lcnMub25GaWx0ZXJzVXBkYXRlLmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICByZXNwb25zZVBvcnQucG9zdE1lc3NhZ2Uoe30pOyAvLyBQcmV2ZW50cyB0aGUgYXBwIGZyb20gcmVsb2FkaW5nLiBTYXlzIHdlJ3ZlIGhhbmRsZWQgaXRcbiAgICAgICAgZG9tby5saXN0ZW5lcnMub25GaWx0ZXJzVXBkYXRlLmZvckVhY2goKGNiKSA9PiBjYihlLmRhdGEuZmlsdGVycykpOyAvLyA8LSBzcGxpdCBvdXQgb25GaWx0ZXJzVXBkYXRlIHNvIHRoYXQgeW91IGNhbiBoYW5kbGUgZWFjaCBtZXNzYWdlIGRpZmZlcmVudGx5IGhlcmVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gdW5yZWdpc3RlclxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb21vLmxpc3RlbmVycy5vbkZpbHRlcnNVcGRhdGUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgbmF2aWdhdGlvbiBjaGFuZ2VcbiAgICovXG4gIHN0YXRpYyBuYXZpZ2F0ZSh1cmw6IHN0cmluZywgaXNOZXdXaW5kb3c6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnQ6IFwibmF2aWdhdGVcIixcbiAgICAgIHVybDogdXJsLFxuICAgICAgaXNOZXdXaW5kb3c6IGlzTmV3V2luZG93LFxuICAgIH0pO1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UobWVzc2FnZSwgXCIqXCIpO1xuICB9XG5cbiAgc3RhdGljIGZpbHRlckNvbnRhaW5lcihcbiAgICBmaWx0ZXJzOiAoXG4gICAgICB8IHtcbiAgICAgICAgICBjb2x1bW46IHN0cmluZztcbiAgICAgICAgICBvcGVyYXRvcjogRmlsdGVyT3BlcmF0b3JzO1xuICAgICAgICAgIHZhbHVlczogKHN0cmluZyB8IG51bWJlciB8IERhdGUpW107XG4gICAgICAgICAgZGF0YVR5cGU6IEZpbHRlckRhdGFUeXBlcztcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgY29sdW1uOiBzdHJpbmc7XG4gICAgICAgICAgb3BlcmF0b3I6IEZpbHRlck9wZXJhdG9ycztcbiAgICAgICAgICB2YWx1ZXM6IERhdGVbXTtcbiAgICAgICAgICBkYXRhVHlwZTogXCJEQVRFXCIgfCBcIkRBVEVUSU1FXCI7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGNvbHVtbjogc3RyaW5nO1xuICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcnM7XG4gICAgICAgICAgdmFsdWVzOiBudW1iZXJbXTtcbiAgICAgICAgICBkYXRhVHlwZTogXCJOVU1FUklDXCI7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIGNvbHVtbjogc3RyaW5nO1xuICAgICAgICAgIG9wZXJhdG9yOiBGaWx0ZXJPcGVyYXRvcnM7XG4gICAgICAgICAgdmFsdWVzOiBzdHJpbmdbXTtcbiAgICAgICAgICBkYXRhVHlwZTogXCJTVFJJTkdcIjtcbiAgICAgICAgfVxuICAgIClbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCB1c2VyQWdlbnQgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLFxuICAgICAgc2FmYXJpID0gL3NhZmFyaS8udGVzdCh1c2VyQWdlbnQpLFxuICAgICAgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KTtcblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudDogXCJmaWx0ZXJcIixcbiAgICAgIGZpbHRlcjogZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gKHtcbiAgICAgICAgY29sdW1uTmFtZTogZmlsdGVyLmNvbHVtbixcbiAgICAgICAgb3BlcmF0b3I6IGZpbHRlci5vcGVyYXRvcixcbiAgICAgICAgdmFsdWVzOiBmaWx0ZXIudmFsdWVzLFxuICAgICAgICBkYXRhVHlwZTogZmlsdGVyLmRhdGFUeXBlLFxuICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgaWYgKGlvcyAmJiAhc2FmYXJpKSB7XG4gICAgICAod2luZG93IGFzIGFueSkud2Via2l0Lm1lc3NhZ2VIYW5kbGVycy5kb21vZmlsdGVyLnBvc3RNZXNzYWdlKFxuICAgICAgICBmaWx0ZXJzLm1hcCgoZmlsdGVyKSA9PiAoe1xuICAgICAgICAgIGNvbHVtbjogZmlsdGVyLmNvbHVtbixcbiAgICAgICAgICBvcGVyYW5kOiBmaWx0ZXIub3BlcmF0b3IsXG4gICAgICAgICAgdmFsdWVzOiBmaWx0ZXIudmFsdWVzLFxuICAgICAgICAgIGRhdGFUeXBlOiBmaWx0ZXIuZGF0YVR5cGUsXG4gICAgICAgIH0pKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShtZXNzYWdlLCBcIipcIik7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGVudiA9IGdldFF1ZXJ5UGFyYW1zKCk7XG5cbiAgc3RhdGljIF9fdXRpbCA9IHtcbiAgICBpc1ZlcmlmaWVkT3JpZ2luLFxuICAgIGdldFF1ZXJ5UGFyYW1zLFxuICAgIHNldEZvcm1hdEhlYWRlcnMsXG4gICAgaXNTdWNjZXNzLFxuICB9O1xufVxuXG5jb25zdCB0b2tlbiA9ICh3aW5kb3cgYXMgYW55KS5fX1JZVVVfQVVUSEVOVElDQVRJT05fVE9LRU5fXztcblxuZnVuY3Rpb24gZG9tb0h0dHAoXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBPYmplY3RSZXF1ZXN0T3B0aW9ucyxcbiAgYXN5bmM/OiBib29sZWFuLFxuICBib2R5PzogUmVxdWVzdEJvZHlcbik6IFByb21pc2U8T2JqZWN0UmVzcG9uc2VCb2R5W10+O1xuZnVuY3Rpb24gZG9tb0h0dHAoXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBBcnJheVJlcXVlc3RPcHRpb25zLFxuICBhc3luYz86IGJvb2xlYW4sXG4gIGJvZHk/OiBSZXF1ZXN0Qm9keVxuKTogUHJvbWlzZTxBcnJheVJlc3BvbnNlQm9keT47XG5mdW5jdGlvbiBkb21vSHR0cChcbiAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kcyxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLFxuICBhc3luYz86IGJvb2xlYW4sXG4gIGJvZHk/OiBSZXF1ZXN0Qm9keVxuKTogUHJvbWlzZTxSZXNwb25zZUJvZHk+O1xuZnVuY3Rpb24gZG9tb0h0dHA8VD4oXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZHMsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyxcbiAgYXN5bmM/OiBib29sZWFuLFxuICBib2R5PzogUmVxdWVzdEJvZHlcbik6IFByb21pc2U8VD47XG5mdW5jdGlvbiBkb21vSHR0cChcbiAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kcyxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLFxuICBhc3luYz86IGJvb2xlYW4sXG4gIGJvZHk/OiBSZXF1ZXN0Qm9keVxuKTogUHJvbWlzZTxSZXNwb25zZUJvZHk+IHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoXG4gICAgcmVzb2x2ZTogKHZhbHVlPzogUmVzcG9uc2VCb2R5KSA9PiB2b2lkLFxuICAgIHJlamVjdDogKHJlYXNvbj86IEVycm9yKSA9PiB2b2lkXG4gICkge1xuICAgIC8vIERvIHRoZSB1c3VhbCBYSFIgc3R1ZmZcbiAgICBsZXQgcmVxOiBYTUxIdHRwUmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGlmIChhc3luYykge1xuICAgICAgcmVxLm9wZW4obWV0aG9kLCB1cmwsIGFzeW5jKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxLm9wZW4obWV0aG9kLCB1cmwpO1xuICAgIH1cbiAgICBzZXRGb3JtYXRIZWFkZXJzKHJlcSwgdXJsLCBvcHRpb25zKTtcbiAgICBzZXRDb250ZW50SGVhZGVycyhyZXEsIG9wdGlvbnMpO1xuICAgIHNldEF1dGhUb2tlbkhlYWRlcihyZXEpO1xuICAgIHNldFJlc3BvbnNlVHlwZShyZXEsIG9wdGlvbnMpO1xuXG4gICAgcmVxLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCBkYXRhO1xuICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgZXZlbiBvbiA0MDQgZXRjIHNvIGNoZWNrIHRoZSBzdGF0dXNcbiAgICAgIGlmIChpc1N1Y2Nlc3MocmVxLnN0YXR1cykpIHtcbiAgICAgICAgaWYgKFtcImNzdlwiLCBcImV4Y2VsXCJdLmluY2x1ZGVzKG9wdGlvbnMuZm9ybWF0KSB8fCAhcmVxLnJlc3BvbnNlKSB7XG4gICAgICAgICAgcmVzb2x2ZShyZXEucmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLnJlc3BvbnNlVHlwZSA9PT0gXCJibG9iXCIpIHtcbiAgICAgICAgICByZXNvbHZlKFxuICAgICAgICAgICAgbmV3IEJsb2IoW3JlcS5yZXNwb25zZV0sIHtcbiAgICAgICAgICAgICAgdHlwZTogcmVxLmdldFJlc3BvbnNlSGVhZGVyKFwiY29udGVudC10eXBlXCIpLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlU3RyID0gcmVxLnJlc3BvbnNlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmKCFyZXNwb25zZVN0cikge1xuICAgICAgICAgIC8vICAgcmVzcG9uc2VTdHIgPSBcInt9XCI7XG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlU3RyKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICByZWplY3QoRXJyb3IoXCJJbnZhbGlkIEpTT04gcmVzcG9uc2VcIikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlIHdpdGggdGhlIHJlc3BvbnNlIHRleHRcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSByZWplY3Qgd2l0aCB0aGUgc3RhdHVzIHRleHRcbiAgICAgICAgLy8gd2hpY2ggd2lsbCBob3BlZnVsbHkgYmUgYSBtZWFuaW5nZnVsIGVycm9yXG4gICAgICAgIHJlamVjdChFcnJvcihyZXEuc3RhdHVzVGV4dCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbmV0d29yayBlcnJvcnNcbiAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJlamVjdChFcnJvcihcIk5ldHdvcmsgRXJyb3JcIikpO1xuICAgIH07XG5cbiAgICAvLyBNYWtlIHRoZSByZXF1ZXN0XG4gICAgaWYgKGJvZHkpIHtcbiAgICAgIGlmICghb3B0aW9ucy5jb250ZW50VHlwZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlID09PSBEYXRhRm9ybWF0cy5KU09OKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcbiAgICAgICAgLy8gTWFrZSB0aGUgcmVxdWVzdFxuICAgICAgICByZXEuc2VuZChqc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGJvZHkgY2FuIG5vIGxvbmdlciBiZSBKU09OXG4gICAgICAgIHJlcS5zZW5kKGJvZHkgYXMgWE1MSHR0cFJlcXVlc3RCb2R5KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVxLnNlbmQoKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpc1N1Y2Nlc3Moc3RhdHVzOiBudW1iZXIpIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwO1xufVxuXG5mdW5jdGlvbiBpc1ZlcmlmaWVkT3JpZ2luKG9yaWdpbjogc3RyaW5nKSB7XG4gIGNvbnN0IHdoaXRlbGlzdGVkID0gb3JpZ2luLm1hdGNoKFxuICAgIFwiXmh0dHBzPzovLyhbXi9dK1suXSk/KGRvbW98ZG9tb3RlY2h8ZG9tb3JpZykuKGNvbXxpbyk/KC8uKik/JFwiXG4gICk7XG4gIGNvbnN0IGJsYWNrbGlzdGVkID0gb3JpZ2luLm1hdGNoKFwiKC4qKS4oZG9tb2FwcHMpLiguKilcIik7XG4gIHJldHVybiAhIXdoaXRlbGlzdGVkICYmICFibGFja2xpc3RlZDtcbn1cblxuZnVuY3Rpb24gZ2V0UXVlcnlQYXJhbXMoKTogUXVlcnlQYXJhbXMge1xuICBjb25zdCBxdWVyeSA9IGxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSk7XG4gIGxldCByZXN1bHQ6IHsgW2luZGV4OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBxdWVyeS5zcGxpdChcIiZcIikuZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuICAgIGNvbnN0IGl0ZW0gPSBwYXJ0LnNwbGl0KFwiPVwiKTtcbiAgICByZXN1bHRbaXRlbVswXV0gPSBkZWNvZGVVUklDb21wb25lbnQoaXRlbVsxXSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzZXRGb3JtYXRIZWFkZXJzKFxuICByZXE6IFhNTEh0dHBSZXF1ZXN0LFxuICB1cmw6IHN0cmluZyxcbiAgb3B0aW9ucz86IFJlcXVlc3RPcHRpb25zXG4pIHtcbiAgaWYgKHVybC5pbmRleE9mKFwiZGF0YS92MVwiKSA9PT0gLTEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2V0IGZvcm1hdFxuICBjb25zdCByZXF1ZXN0Rm9ybWF0OiBEYXRhRm9ybWF0cyA9XG4gICAgb3B0aW9ucy5mb3JtYXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0KG9wdGlvbnMuZm9ybWF0KVxuICAgICAgOiBEYXRhRm9ybWF0cy5ERUZBVUxUO1xuXG4gIHJlcS5zZXRSZXF1ZXN0SGVhZGVyKFwiQWNjZXB0XCIsIHJlcXVlc3RGb3JtYXQpO1xufVxuXG5mdW5jdGlvbiBzZXRDb250ZW50SGVhZGVycyhyZXE6IFhNTEh0dHBSZXF1ZXN0LCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMuY29udGVudFR5cGUpIHtcbiAgICAvLyBzZXQgY29udGVudCB0eXBlIGlmIHVzZXIgcGFzc2VkIG9wdGlvblxuICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlICE9PSBcIm11bHRpcGFydFwiKSB7XG4gICAgICByZXEuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBvcHRpb25zLmNvbnRlbnRUeXBlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgRGF0YUZvcm1hdHMuSlNPTik7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0QXV0aFRva2VuSGVhZGVyKHJlcTogWE1MSHR0cFJlcXVlc3QpIHtcbiAgaWYgKHRva2VuKSB7XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ1gtRE9NTy1SeXV1LVRva2VuJywgdG9rZW4pO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2V0UmVzcG9uc2VUeXBlKHJlcTogWE1MSHR0cFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9ucykge1xuICAvL3NldCByZXNwb25zZSB0eXBlIGlmIHVzZXIgcGFzc2VkIG9wdGlvblxuICBpZiAob3B0aW9ucy5yZXNwb25zZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJlcS5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVOb2RlKG5vZGU6IEhUTUxFbGVtZW50KXtcbiAgaWYgKG5vZGUgPT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICByZXR1cm4gcHJvY2Vzc0JvZHkobm9kZSk7XG4gIH1cbiAgbGV0IGF0dHI7XG4gIGxldCB1cmw7XG4gIGlmIChub2RlLmRhdGFzZXQgJiYgbm9kZS5kYXRhc2V0LmRvbW9IcmVmKSB7XG4gICAgYXR0ciA9ICdocmVmJztcbiAgICB1cmwgPSBub2RlLmRhdGFzZXQuZG9tb0hyZWY7XG4gIH0gZWxzZSBpZiAobm9kZS5kYXRhc2V0ICYmIG5vZGUuZGF0YXNldC5kb21vU3JjKSB7XG4gICAgYXR0ciA9ICdzcmMnO1xuICAgIHVybCA9IG5vZGUuZGF0YXNldC5kb21vU3JjO1xuICB9IGVsc2UgaWYgKG5vZGUuaGFzQXR0cmlidXRlICYmIG5vZGUuaGFzQXR0cmlidXRlKCdocmVmJykpIHtcbiAgICBhdHRyID0gJ2hyZWYnO1xuICAgIHVybCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gIH0gZWxzZSBpZiAobm9kZS5oYXNBdHRyaWJ1dGUgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgYXR0ciA9ICdzcmMnO1xuICAgIHVybCA9IG5vZGUuZ2V0QXR0cmlidXRlKCdzcmMnKTtcbiAgfVxuXG4gIGlmICh1cmwgJiYgdG9rZW4pIHtcbiAgICBjb25zdCBuZXdVcmwgPSBuZXcgVVJMKHVybCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKTtcbiAgICBjb25zdCBpc1JlbGF0aXZlVXJsID0gKG5ld1VybCkub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW47XG4gICAgaWYgKGlzUmVsYXRpdmVVcmwpIHtcbiAgICAgIG5ld1VybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdycHQnLCB0b2tlbik7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCBuZXdVcmwuaHJlZik7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBwcm9jZXNzQm9keShub2RlOiBFbGVtZW50KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgIGhhbmRsZU5vZGUoPEhUTUxFbGVtZW50Pm5vZGUuY2hpbGRyZW5baV0pO1xuICB9XG59XG5cbmNvbnN0IG9iID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiBtdXRhdGlvbnMpIHtcbiAgICByZWNvcmQuYWRkZWROb2Rlcy5mb3JFYWNoKGhhbmRsZU5vZGUpO1xuICB9XG59KTtcbm9iLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbm9iLm9ic2VydmUoZG9jdW1lbnQuaGVhZCwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4iLCJleHBvcnQgZW51bSBSZXF1ZXN0TWV0aG9kcyB7XG4gIGdldCA9ICdHRVQnLFxuICBHRVQgPSAnR0VUJyxcbiAgcG9zdCA9ICdQT1NUJyxcbiAgUE9TVCA9ICdQT1NUJyxcbiAgcHV0ID0gJ1BVVCcsXG4gIFBVVCA9ICdQVVQnLFxuICBkZWxldGUgPSAnREVMRVRFJyxcbiAgREVMRVRFID0gJ0RFTEVURScsXG59XG4iLCIvKipcbiAqIFN1cHBvcnRlZCBgYWNjZXB0YCBoZWFkZXJzIGZvciBjb250cm9sbGluZyB0aGUgZm9ybWF0XG4gKiBvZiB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERvbW8uXG4gKlxuICogU2VlIFtkZXZlbG9wZXIuZG9tby5jb21dKGh0dHBzOi8vZGV2ZWxvcGVyLmRvbW8uY29tL2RvY3MvZGV2LXN0dWRpby1yZWZlcmVuY2VzL2RhdGEtYXBpI0RhdGElMjBGb3JtYXRzKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGVudW0gRGF0YUZvcm1hdHMge1xuICBERUZBVUxUID0gJ2FwcGxpY2F0aW9uL2FycmF5LW9mLW9iamVjdHMnLFxuICBBUlJBWV9PRl9PQkpFQ1RTID0gJ2FwcGxpY2F0aW9uL2FycmF5LW9mLW9iamVjdHMnLFxuICBKU09OID0gJ2FwcGxpY2F0aW9uL2pzb24nLFxuICBDU1YgPSAndGV4dC9jc3YnLFxuICBFWENFTCA9ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCcsXG4gIFBMQUlOID0gJ3RleHQvcGxhaW4nXG59IiwiaW1wb3J0IHsgRG9tb0RhdGFGb3JtYXRzLCBEYXRhRm9ybWF0cyB9IGZyb20gJy4uL21vZGVscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21vRm9ybWF0VG9SZXF1ZXN0Rm9ybWF0KGZvcm1hdDogRG9tb0RhdGFGb3JtYXRzKTogRGF0YUZvcm1hdHMge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgJ2FycmF5LW9mLW9iamVjdHMnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuQVJSQVlfT0ZfT0JKRUNUUztcbiAgICB9XG4gICAgY2FzZSAnYXJyYXktb2YtYXJyYXlzJzoge1xuICAgICAgcmV0dXJuIERhdGFGb3JtYXRzLkpTT047XG4gICAgfVxuICAgIGNhc2UgJ2V4Y2VsJzoge1xuICAgICAgcmV0dXJuIERhdGFGb3JtYXRzLkVYQ0VMO1xuICAgIH1cbiAgICBjYXNlICdjc3YnOiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuQ1NWO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gRGF0YUZvcm1hdHMuREVGQVVMVDtcbiAgICB9XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
{
"name": "ryuu.js",
"version": "4.0.0",
"version": "4.0.1",
"description": "Ryuu JavaScript Utility Library",

@@ -20,2 +20,2 @@ "main": "dist/domo.js",

"author": "Domo"
}
}

@@ -15,4 +15,4 @@ import {

ArrayResponseBody,
} from './models';
import { domoFormatToRequestFormat } from './utils/data-helpers';
} from "./models";
import { domoFormatToRequestFormat } from "./utils/data-helpers";

@@ -22,16 +22,46 @@ export = domo;

class domo {
static post(url: string, body?: RequestBody, options?: RequestOptions): Promise<ResponseBody>;
static post<T>(url: string, body?: RequestBody, options?: RequestOptions): Promise<T>;
static post<T>(url: string, body?: RequestBody, options?: RequestOptions): Promise<T> {
static post(
url: string,
body?: RequestBody,
options?: RequestOptions
): Promise<ResponseBody>;
static post<T>(
url: string,
body?: RequestBody,
options?: RequestOptions
): Promise<T>;
static post<T>(
url: string,
body?: RequestBody,
options?: RequestOptions
): Promise<T> {
return domoHttp<T>(RequestMethods.POST, url, options, true, body);
}
static put(url: string, body?: RequestBody, options?: RequestOptions): Promise<ResponseBody>;
static put<T>(url: string, body?: RequestBody, options?: RequestOptions): Promise<T>;
static put<T>(url: string, body?: RequestBody, options?: RequestOptions): Promise<T> {
static put(
url: string,
body?: RequestBody,
options?: RequestOptions
): Promise<ResponseBody>;
static put<T>(
url: string,
body?: RequestBody,
options?: RequestOptions
): Promise<T>;
static put<T>(
url: string,
body?: RequestBody,
options?: RequestOptions
): Promise<T> {
return domoHttp<T>(RequestMethods.PUT, url, options, true, body);
}
static get(url: string, options: ObjectRequestOptions): Promise<ObjectResponseBody[]>;
static get(url: string, options: ArrayRequestOptions): Promise<ArrayResponseBody>;
static get(
url: string,
options: ObjectRequestOptions
): Promise<ObjectResponseBody[]>;
static get(
url: string,
options: ArrayRequestOptions
): Promise<ArrayResponseBody>;
static get(url: string, options?: RequestOptions): Promise<ResponseBody>;

@@ -49,11 +79,22 @@ static get<T>(url: string, options?: RequestOptions): Promise<T>;

static getAll(urls: string[], options: ObjectRequestOptions): Promise<ObjectResponseBody[][]>;
static getAll(urls: string[], options: ArrayRequestOptions): Promise<ArrayResponseBody[]>;
static getAll(urls: string[], options?: RequestOptions): Promise<ResponseBody[]>;
static getAll(
urls: string[],
options: ObjectRequestOptions
): Promise<ObjectResponseBody[][]>;
static getAll(
urls: string[],
options: ArrayRequestOptions
): Promise<ArrayResponseBody[]>;
static getAll(
urls: string[],
options?: RequestOptions
): Promise<ResponseBody[]>;
static getAll<T>(urls: string[], options?: RequestOptions): Promise<T[]>;
static getAll<T>(urls: string[], options?: RequestOptions): Promise<T[]> {
return Promise.all(urls.map(function (url) {
return domo.get<T>(url, options);
}));
};
return Promise.all(
urls.map(function (url) {
return domo.get<T>(url, options);
})
);
}

@@ -64,10 +105,9 @@ /**

static onDataUpdate(cb: (alias: string) => void) {
window.addEventListener('message', function (event: MessageEvent) {
if (!isVerifiedOrigin(event.origin))
return;
function innerCallback(event: MessageEvent) {
if (!isVerifiedOrigin(event.origin)) return;
if (typeof event.data === 'string' && event.data.length > 0) {
if (typeof event.data === "string" && event.data.length > 0) {
try {
const message = JSON.parse(event.data);
if (!message.hasOwnProperty('alias')) {
if (!message.hasOwnProperty("alias")) {
return;

@@ -80,3 +120,3 @@ }

const ack = JSON.stringify({
event: 'ack',
event: "ack",
alias: alias,

@@ -91,10 +131,13 @@ });

} catch (err) {
const info = 'There was an error in onDataUpdate! It may be that our event listener caught ' +
'a message from another source and tried to parse it, so your update still may have worked. ' +
'If you would like more info, here is the error: \n'
const info =
"There was an error in onDataUpdate! It may be that our event listener caught " +
"a message from another source and tried to parse it, so your update still may have worked. " +
"If you would like more info, here is the error: \n";
console.warn(info, err);
}
}
});
};
}
window.addEventListener("message", innerCallback);
return () => window.removeEventListener("message", innerCallback);
}

@@ -114,3 +157,3 @@ /**

domo.channel = new MessageChannel();
window.parent.postMessage(JSON.stringify({ event: 'subscribe' }), '*', [
window.parent.postMessage(JSON.stringify({ event: "subscribe" }), "*", [
domo.channel.port2,

@@ -131,3 +174,6 @@ ]);

if (e.data.event === 'filtersUpdated' && domo.listeners.onFiltersUpdate.length > 0) {
if (
e.data.event === "filtersUpdated" &&
domo.listeners.onFiltersUpdate.length > 0
) {
responsePort.postMessage({}); // Prevents the app from reloading. Says we've handled it

@@ -149,5 +195,5 @@ domo.listeners.onFiltersUpdate.forEach((cb) => cb(e.data.filters)); // <- split out onFiltersUpdate so that you can handle each message differently here

const message = JSON.stringify({
event: 'navigate',
event: "navigate",
url: url,
isNewWindow: isNewWindow
isNewWindow: isNewWindow,
});

@@ -157,7 +203,29 @@ window.parent.postMessage(message, "*");

static filterContainer(filters:
({ column: string, operator: FilterOperators, values: (string | number | Date)[], dataType: FilterDataTypes }
| { column: string, operator: FilterOperators, values: Date[], dataType: 'DATE' | 'DATETIME' }
| { column: string, operator: FilterOperators, values: number[], dataType: 'NUMERIC' }
| { column: string, operator: FilterOperators, values: string[], dataType: 'STRING' })[]
static filterContainer(
filters: (
| {
column: string;
operator: FilterOperators;
values: (string | number | Date)[];
dataType: FilterDataTypes;
}
| {
column: string;
operator: FilterOperators;
values: Date[];
dataType: "DATE" | "DATETIME";
}
| {
column: string;
operator: FilterOperators;
values: number[];
dataType: "NUMERIC";
}
| {
column: string;
operator: FilterOperators;
values: string[];
dataType: "STRING";
}
)[]
): void {

@@ -169,9 +237,9 @@ const userAgent = window.navigator.userAgent.toLowerCase(),

const message = JSON.stringify({
event: 'filter',
filter: filters.map(filter => ({
event: "filter",
filter: filters.map((filter) => ({
columnName: filter.column,
operator: filter.operator,
values: filter.values,
dataType: filter.dataType
}))
dataType: filter.dataType,
})),
});

@@ -181,7 +249,10 @@

(window as any).webkit.messageHandlers.domofilter.postMessage(
filters.map(filter =>
({ column: filter.column, operand: filter.operator, values: filter.values, dataType: filter.dataType }))
filters.map((filter) => ({
column: filter.column,
operand: filter.operator,
values: filter.values,
dataType: filter.dataType,
}))
);
}
else {
} else {
window.parent.postMessage(message, "*");

@@ -197,14 +268,48 @@ }

setFormatHeaders,
isSuccess
}
isSuccess,
};
}
};
const token = (window as any).__RYUU_AUTHENTICATION_TOKEN__;
function domoHttp(method: RequestMethods, url: string, options: ObjectRequestOptions, async?: boolean, body?: RequestBody): Promise<ObjectResponseBody[]>;
function domoHttp(method: RequestMethods, url: string, options: ArrayRequestOptions, async?: boolean, body?: RequestBody): Promise<ArrayResponseBody>;
function domoHttp(method: RequestMethods, url: string, options: RequestOptions, async?: boolean, body?: RequestBody): Promise<ResponseBody>;
function domoHttp<T>(method: RequestMethods, url: string, options: RequestOptions, async?: boolean, body?: RequestBody): Promise<T>;
function domoHttp(method: RequestMethods, url: string, options: RequestOptions, async?: boolean, body?: RequestBody): Promise<ResponseBody> {
function domoHttp(
method: RequestMethods,
url: string,
options: ObjectRequestOptions,
async?: boolean,
body?: RequestBody
): Promise<ObjectResponseBody[]>;
function domoHttp(
method: RequestMethods,
url: string,
options: ArrayRequestOptions,
async?: boolean,
body?: RequestBody
): Promise<ArrayResponseBody>;
function domoHttp(
method: RequestMethods,
url: string,
options: RequestOptions,
async?: boolean,
body?: RequestBody
): Promise<ResponseBody>;
function domoHttp<T>(
method: RequestMethods,
url: string,
options: RequestOptions,
async?: boolean,
body?: RequestBody
): Promise<T>;
function domoHttp(
method: RequestMethods,
url: string,
options: RequestOptions,
async?: boolean,
body?: RequestBody
): Promise<ResponseBody> {
options = options || {};
return new Promise(function (resolve: (value?: ResponseBody) => void, reject: (reason?: Error) => void) {
return new Promise(function (
resolve: (value?: ResponseBody) => void,
reject: (reason?: Error) => void
) {
// Do the usual XHR stuff

@@ -214,4 +319,3 @@ let req: XMLHttpRequest = new XMLHttpRequest();

req.open(method, url, async);
}
else {
} else {
req.open(method, url);

@@ -221,2 +325,3 @@ }

setContentHeaders(req, options);
setAuthTokenHeader(req);
setResponseType(req, options);

@@ -228,8 +333,11 @@

if (isSuccess(req.status)) {
if (['csv', 'excel'].includes(options.format) || !req.response) {
if (["csv", "excel"].includes(options.format) || !req.response) {
resolve(req.response);
}
if (options.responseType === 'blob') {
resolve(new Blob([req.response], { type: req.getResponseHeader('content-type') }));
if (options.responseType === "blob") {
resolve(
new Blob([req.response], {
type: req.getResponseHeader("content-type"),
})
);
}

@@ -243,5 +351,4 @@

data = JSON.parse(responseStr);
}
catch (ex) {
reject(Error('Invalid JSON response'));
} catch (ex) {
reject(Error("Invalid JSON response"));
return;

@@ -251,4 +358,3 @@ }

resolve(data);
}
else {
} else {
// Otherwise reject with the status text

@@ -275,4 +381,3 @@ // which will hopefully be a meaningful error

}
}
else {
} else {
req.send();

@@ -288,4 +393,6 @@ }

function isVerifiedOrigin(origin: string) {
const whitelisted = origin.match('^https?://([^/]+[.])?(domo|domotech|domorig)\.(com|io)?(/.*)?$');
const blacklisted = origin.match('(.*)\.(domoapps)\.(.*)');
const whitelisted = origin.match(
"^https?://([^/]+[.])?(domo|domotech|domorig).(com|io)?(/.*)?$"
);
const blacklisted = origin.match("(.*).(domoapps).(.*)");
return !!whitelisted && !blacklisted;

@@ -304,10 +411,17 @@ }

function setFormatHeaders(req: XMLHttpRequest, url: string, options?: RequestOptions) {
if (url.indexOf('data/v1') === -1) { return; }
function setFormatHeaders(
req: XMLHttpRequest,
url: string,
options?: RequestOptions
) {
if (url.indexOf("data/v1") === -1) {
return;
}
// set format
const requestFormat: DataFormats = (options.format !== undefined)
? (domoFormatToRequestFormat(options.format))
: (DataFormats.DEFAULT);
const requestFormat: DataFormats =
options.format !== undefined
? domoFormatToRequestFormat(options.format)
: DataFormats.DEFAULT;
req.setRequestHeader('Accept', requestFormat);
req.setRequestHeader("Accept", requestFormat);
}

@@ -318,11 +432,17 @@

// set content type if user passed option
if (options.contentType !== 'multipart') {
req.setRequestHeader('Content-Type', options.contentType);
if (options.contentType !== "multipart") {
req.setRequestHeader("Content-Type", options.contentType);
}
} else {
req.setRequestHeader("Content-Type", DataFormats.JSON);
}
else {
req.setRequestHeader('Content-Type', DataFormats.JSON);
}
function setAuthTokenHeader(req: XMLHttpRequest) {
if (token) {
req.setRequestHeader('X-DOMO-Ryuu-Token', token);
}
}
function setResponseType(req: XMLHttpRequest, options?: RequestOptions) {

@@ -333,2 +453,46 @@ //set response type if user passed option

}
}
}
function handleNode(node: HTMLElement){
if (node === document.body) {
return processBody(node);
}
let attr;
let url;
if (node.dataset && node.dataset.domoHref) {
attr = 'href';
url = node.dataset.domoHref;
} else if (node.dataset && node.dataset.domoSrc) {
attr = 'src';
url = node.dataset.domoSrc;
} else if (node.hasAttribute && node.hasAttribute('href')) {
attr = 'href';
url = node.getAttribute('href');
} else if (node.hasAttribute && node.hasAttribute('src')) {
attr = 'src';
url = node.getAttribute('src');
}
if (url && token) {
const newUrl = new URL(url, document.location.origin);
const isRelativeUrl = (newUrl).origin === document.location.origin;
if (isRelativeUrl) {
newUrl.searchParams.append('rpt', token);
node.setAttribute(attr, newUrl.href);
}
}
};
function processBody(node: Element) {
for (let i = 0; i < node.children.length; i++) {
handleNode(<HTMLElement>node.children[i]);
}
}
const ob = new MutationObserver((mutations) => {
for (const record of mutations) {
record.addedNodes.forEach(handleNode);
}
});
ob.observe(document.documentElement, { childList: true });
ob.observe(document.head, { childList: true });
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc