UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

317 lines (316 loc) • 37.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "API", { enumerable: true, get: function() { return API; } }); const _react = /*#__PURE__*/ _interop_require_wildcard(require("react")); const _reacti18next = require("react-i18next"); const _ = require("../.."); const _api = require("../../../api"); const _CopyToClipboard = /*#__PURE__*/ _interop_require_default(require("../../elements/CopyToClipboard")); const _Gutter = require("../../elements/Gutter"); const _Input = require("../../forms/field-types/Checkbox/Input"); const _Input1 = /*#__PURE__*/ _interop_require_default(require("../../forms/field-types/Select/Input")); const _MinimizeMaximize = require("../../icons/MinimizeMaximize"); const _ActionsProvider = require("../../utilities/ActionsProvider"); const _Config = require("../../utilities/Config"); const _DocumentInfo = require("../../utilities/DocumentInfo"); const _Locale = require("../../utilities/Locale"); const _SetStepNav = require("../collections/Edit/SetStepNav"); require("./index.scss"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const chars = { leftCurlyBracket: '\u007B', leftSquareBracket: '\u005B', rightCurlyBracket: '\u007D', rightSquareBracket: '\u005D' }; const baseClass = 'query-inspector'; const Bracket = ({ comma = false, position, type })=>{ const rightBracket = type === 'object' ? chars.rightCurlyBracket : chars.rightSquareBracket; const leftBracket = type === 'object' ? chars.leftCurlyBracket : chars.leftSquareBracket; const bracketToRender = position === 'end' ? rightBracket : leftBracket; return /*#__PURE__*/ _react.createElement("span", { className: `${baseClass}__bracket ${baseClass}__bracket--position-${position}` }, bracketToRender, position === 'end' && comma ? ',' : null); }; const RecursivelyRenderObjectData = ({ isEmpty = false, object, objectKey, parentType = 'object', trailingComma = false })=>{ const objectKeys = Object.keys(object); const objectLength = objectKeys.length; const [isOpen, setIsOpen] = _react.useState(true); return /*#__PURE__*/ _react.createElement("li", null, /*#__PURE__*/ _react.createElement("button", { "aria-label": "toggle", className: `${baseClass}__list-toggle ${isEmpty ? `${baseClass}__list-toggle--empty` : ''}`, onClick: ()=>setIsOpen(!isOpen), type: "button" }, isEmpty ? null : /*#__PURE__*/ _react.createElement(_.Chevron, { className: `${baseClass}__toggle-row-icon ${baseClass}__toggle-row-icon--${isOpen ? 'open' : 'closed'}` }), /*#__PURE__*/ _react.createElement("span", null, objectKey && `"${objectKey}": `, /*#__PURE__*/ _react.createElement(Bracket, { position: "start", type: parentType }), isEmpty ? /*#__PURE__*/ _react.createElement(Bracket, { comma: trailingComma, position: "end", type: parentType }) : null)), /*#__PURE__*/ _react.createElement("ul", { className: `${baseClass}__json-children` }, isOpen && objectKeys.map((key, keyIndex)=>{ let value = object[key]; let type = 'string'; const isLastKey = keyIndex === objectLength - 1; if (value === null) { type = 'null'; } else if (value instanceof Date) { type = 'date'; value = value.toISOString(); } else if (Array.isArray(value)) { type = 'array'; } else if (typeof value === 'object') { type = 'object'; } else if (typeof value === 'number') { type = 'number'; } else if (typeof value === 'boolean') { type = 'boolean'; } else { type = 'string'; } if (type === 'object' || type === 'array') { return /*#__PURE__*/ _react.createElement(RecursivelyRenderObjectData, { isEmpty: value.length === 0 || Object.keys(value).length === 0, key: `${key}-${keyIndex}`, object: value, objectKey: parentType === 'object' ? key : undefined, parentType: type, trailingComma: !isLastKey }); } if (type === 'date' || type === 'string' || type === 'null' || type === 'number' || type === 'boolean') { const parentHasKey = Boolean(parentType === 'object' && key); const rowClasses = [ `${baseClass}__row-line`, `${baseClass}__value-type--${type}`, `${baseClass}__row-line--${objectKey ? 'nested' : 'top'}` ].filter(Boolean).join(' '); return /*#__PURE__*/ _react.createElement("li", { className: rowClasses, key: `${key}-${keyIndex}` }, parentHasKey ? /*#__PURE__*/ _react.createElement("span", null, `"${key}": `) : null, /*#__PURE__*/ _react.createElement("span", { className: `${baseClass}__value` }, JSON.stringify(value)), isLastKey ? '' : ','); } })), !isEmpty && /*#__PURE__*/ _react.createElement("span", null, /*#__PURE__*/ _react.createElement(Bracket, { comma: trailingComma, position: "end", type: parentType }))); }; function createURL(url) { if (url.startsWith('/')) { const domain = window.location.origin; return new URL(url, domain); } else { return new URL(url); } } const API = (props)=>{ const { apiURL } = props; const { i18n } = (0, _reacti18next.useTranslation)(); const { localization, routes: { api }, serverURL } = (0, _Config.useConfig)(); const { id, collection, global } = (0, _DocumentInfo.useDocumentInfo)(); const { code } = (0, _Locale.useLocale)(); const url = createURL(apiURL); const { setViewActions } = (0, _ActionsProvider.useActions)(); const draftsEnabled = collection?.versions?.drafts || global?.versions?.drafts; const docEndpoint = global ? `/globals/${global.slug}` : `/${collection.slug}/${id}`; const [data, setData] = _react.useState({}); const [draft, setDraft] = _react.useState(url.searchParams.get('draft') === 'true'); const [locale, setLocale] = _react.useState(url.searchParams.get('locale') || code); const [depth, setDepth] = _react.useState(url.searchParams.get('depth') || '1'); const [authenticated, setAuthenticated] = _react.useState(true); const [fullscreen, setFullscreen] = _react.useState(false); const fetchURL = `${serverURL}${api}${docEndpoint}?locale=${locale}&draft=${draft}&depth=${depth}`; _react.useEffect(()=>{ const fetchData = async ()=>{ const request = await _api.requests.get(fetchURL, { credentials: authenticated ? 'include' : 'omit', headers: { 'Accept-Language': i18n.language } }); const json = await request.json(); setData(json); }; fetchData(); }, [ i18n.language, fetchURL, authenticated ]); _react.useEffect(()=>{ const editConfig = (collection || global)?.admin?.components?.views?.Edit; const apiActions = editConfig && 'API' in editConfig && 'actions' in editConfig.API ? editConfig.API.actions : []; setViewActions(apiActions); return ()=>{ setViewActions([]); }; }, [ collection, global, setViewActions ]); const localeOptions = localization && localization.locales.map((locale)=>({ label: locale.label, value: locale.code })); const classes = [ baseClass, fullscreen && `${baseClass}--fullscreen` ].filter(Boolean).join(' '); let isEditing; if ('collection' in props) { isEditing = props?.isEditing; } return /*#__PURE__*/ _react.createElement(_Gutter.Gutter, { className: classes, right: false }, /*#__PURE__*/ _react.createElement(_SetStepNav.SetStepNav, { collection: collection, global: global, id: id, isEditing: isEditing, view: "API" }), /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__configuration` }, /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__api-url` }, /*#__PURE__*/ _react.createElement("span", { className: `${baseClass}__label` }, "API URL ", /*#__PURE__*/ _react.createElement(_CopyToClipboard.default, { value: fetchURL })), /*#__PURE__*/ _react.createElement("a", { href: fetchURL, rel: "noopener noreferrer", target: "_blank" }, fetchURL)), /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__form-fields` }, /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__filter-query-checkboxes` }, draftsEnabled && /*#__PURE__*/ _react.createElement(_Input.CheckboxInput, { checked: draft, id: "draft-checkbox", label: "Draft", onToggle: ()=>setDraft(!draft) }), /*#__PURE__*/ _react.createElement(_Input.CheckboxInput, { checked: authenticated, id: "auth-checkbox", label: "Authenticated", onToggle: ()=>setAuthenticated(!authenticated) })), localeOptions && /*#__PURE__*/ _react.createElement(_Input1.default, { defaultValue: { label: locale, value: locale }, label: "Locale", name: "locale", onChange: (e)=>setLocale(e.value), options: localeOptions, path: "locale" }), /*#__PURE__*/ _react.createElement(_Input1.default, { defaultValue: { label: depth, value: depth }, label: "Depth", name: "depth", onChange: (e)=>setDepth(e.value), options: [ { label: '0', value: '0' }, { label: '1', value: '1' }, { label: '2', value: '2' }, { label: '3', value: '3' }, { label: '4', value: '4' } ], path: "depth" }))), /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__results-wrapper` }, /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__toggle-fullscreen-button-container` }, /*#__PURE__*/ _react.createElement("button", { "aria-label": "toggle fullscreen", className: `${baseClass}__toggle-fullscreen-button`, onClick: ()=>setFullscreen(!fullscreen), type: "button" }, /*#__PURE__*/ _react.createElement(_MinimizeMaximize.MinimizeMaximize, { isMinimized: !fullscreen }))), /*#__PURE__*/ _react.createElement("div", { className: `${baseClass}__results` }, /*#__PURE__*/ _react.createElement(RecursivelyRenderObjectData, { object: data })))); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3ZpZXdzL0FQSS9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5cbmltcG9ydCB0eXBlIHsgRWRpdFZpZXdQcm9wcyB9IGZyb20gJy4uL3R5cGVzJ1xuXG5pbXBvcnQgeyBDaGV2cm9uIH0gZnJvbSAnLi4vLi4nXG5pbXBvcnQgeyByZXF1ZXN0cyB9IGZyb20gJy4uLy4uLy4uL2FwaSdcbmltcG9ydCBDb3B5VG9DbGlwYm9hcmQgZnJvbSAnLi4vLi4vZWxlbWVudHMvQ29weVRvQ2xpcGJvYXJkJ1xuaW1wb3J0IHsgR3V0dGVyIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvR3V0dGVyJ1xuaW1wb3J0IHsgQ2hlY2tib3hJbnB1dCB9IGZyb20gJy4uLy4uL2Zvcm1zL2ZpZWxkLXR5cGVzL0NoZWNrYm94L0lucHV0J1xuaW1wb3J0IFNlbGVjdElucHV0IGZyb20gJy4uLy4uL2Zvcm1zL2ZpZWxkLXR5cGVzL1NlbGVjdC9JbnB1dCdcbmltcG9ydCB7IE1pbmltaXplTWF4aW1pemUgfSBmcm9tICcuLi8uLi9pY29ucy9NaW5pbWl6ZU1heGltaXplJ1xuaW1wb3J0IHsgdXNlQWN0aW9ucyB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9BY3Rpb25zUHJvdmlkZXInXG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvQ29uZmlnJ1xuaW1wb3J0IHsgdXNlRG9jdW1lbnRJbmZvIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0RvY3VtZW50SW5mbydcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Mb2NhbGUnXG5pbXBvcnQgeyBTZXRTdGVwTmF2IH0gZnJvbSAnLi4vY29sbGVjdGlvbnMvRWRpdC9TZXRTdGVwTmF2J1xuaW1wb3J0ICcuL2luZGV4LnNjc3MnXG5cbmNvbnN0IGNoYXJzID0ge1xuICBsZWZ0Q3VybHlCcmFja2V0OiAnXFx1MDA3QicsXG4gIGxlZnRTcXVhcmVCcmFja2V0OiAnXFx1MDA1QicsXG4gIHJpZ2h0Q3VybHlCcmFja2V0OiAnXFx1MDA3RCcsXG4gIHJpZ2h0U3F1YXJlQnJhY2tldDogJ1xcdTAwNUQnLFxufVxuXG5jb25zdCBiYXNlQ2xhc3MgPSAncXVlcnktaW5zcGVjdG9yJ1xuXG5jb25zdCBCcmFja2V0ID0gKHtcbiAgY29tbWEgPSBmYWxzZSxcbiAgcG9zaXRpb24sXG4gIHR5cGUsXG59OiB7XG4gIGNvbW1hPzogYm9vbGVhblxuICBwb3NpdGlvbjogJ2VuZCcgfCAnc3RhcnQnXG4gIHR5cGU6ICdhcnJheScgfCAnb2JqZWN0J1xufSkgPT4ge1xuICBjb25zdCByaWdodEJyYWNrZXQgPSB0eXBlID09PSAnb2JqZWN0JyA/IGNoYXJzLnJpZ2h0Q3VybHlCcmFja2V0IDogY2hhcnMucmlnaHRTcXVhcmVCcmFja2V0XG4gIGNvbnN0IGxlZnRCcmFja2V0ID0gdHlwZSA9PT0gJ29iamVjdCcgPyBjaGFycy5sZWZ0Q3VybHlCcmFja2V0IDogY2hhcnMubGVmdFNxdWFyZUJyYWNrZXRcbiAgY29uc3QgYnJhY2tldFRvUmVuZGVyID0gcG9zaXRpb24gPT09ICdlbmQnID8gcmlnaHRCcmFja2V0IDogbGVmdEJyYWNrZXRcbiAgcmV0dXJuIChcbiAgICA8c3BhbiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2JyYWNrZXQgJHtiYXNlQ2xhc3N9X19icmFja2V0LS1wb3NpdGlvbi0ke3Bvc2l0aW9ufWB9PlxuICAgICAge2JyYWNrZXRUb1JlbmRlcn1cbiAgICAgIHtwb3NpdGlvbiA9PT0gJ2VuZCcgJiYgY29tbWEgPyAnLCcgOiBudWxsfVxuICAgIDwvc3Bhbj5cbiAgKVxufVxuXG50eXBlIEFyZ3MgPSB7XG4gIGlzRW1wdHk/OiBib29sZWFuXG4gIG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55PiB8IGFueVtdXG4gIG9iamVjdEtleT86IHN0cmluZ1xuICBwYXJlbnRUeXBlPzogJ2FycmF5JyB8ICdvYmplY3QnXG4gIHRyYWlsaW5nQ29tbWE/OiBib29sZWFuXG59XG5cbmNvbnN0IFJlY3Vyc2l2ZWx5UmVuZGVyT2JqZWN0RGF0YSA9ICh7XG4gIGlzRW1wdHkgPSBmYWxzZSxcbiAgb2JqZWN0LFxuICBvYmplY3RLZXksXG4gIHBhcmVudFR5cGUgPSAnb2JqZWN0JyxcbiAgdHJhaWxpbmdDb21tYSA9IGZhbHNlLFxufTogQXJncykgPT4ge1xuICBjb25zdCBvYmplY3RLZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KVxuICBjb25zdCBvYmplY3RMZW5ndGggPSBvYmplY3RLZXlzLmxlbmd0aFxuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gUmVhY3QudXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSlcblxuICByZXR1cm4gKFxuICAgIDxsaT5cbiAgICAgIDxidXR0b25cbiAgICAgICAgYXJpYS1sYWJlbD1cInRvZ2dsZVwiXG4gICAgICAgIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fbGlzdC10b2dnbGUgJHtpc0VtcHR5ID8gYCR7YmFzZUNsYXNzfV9fbGlzdC10b2dnbGUtLWVtcHR5YCA6ICcnfWB9XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzT3BlbighaXNPcGVuKX1cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICA+XG4gICAgICAgIHtpc0VtcHR5ID8gbnVsbCA6IChcbiAgICAgICAgICA8Q2hldnJvblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtiYXNlQ2xhc3N9X190b2dnbGUtcm93LWljb24gJHtiYXNlQ2xhc3N9X190b2dnbGUtcm93LWljb24tLSR7XG4gICAgICAgICAgICAgIGlzT3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnXG4gICAgICAgICAgICB9YH1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICB7b2JqZWN0S2V5ICYmIGBcIiR7b2JqZWN0S2V5fVwiOiBgfVxuICAgICAgICAgIDxCcmFja2V0IHBvc2l0aW9uPVwic3RhcnRcIiB0eXBlPXtwYXJlbnRUeXBlfSAvPlxuICAgICAgICAgIHtpc0VtcHR5ID8gPEJyYWNrZXQgY29tbWE9e3RyYWlsaW5nQ29tbWF9IHBvc2l0aW9uPVwiZW5kXCIgdHlwZT17cGFyZW50VHlwZX0gLz4gOiBudWxsfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cblxuICAgICAgPHVsIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fanNvbi1jaGlsZHJlbmB9PlxuICAgICAgICB7aXNPcGVuICYmXG4gICAgICAgICAgb2JqZWN0S2V5cy5tYXAoKGtleSwga2V5SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9iamVjdFtrZXldXG4gICAgICAgICAgICBsZXQgdHlwZSA9ICdzdHJpbmcnXG4gICAgICAgICAgICBjb25zdCBpc0xhc3RLZXkgPSBrZXlJbmRleCA9PT0gb2JqZWN0TGVuZ3RoIC0gMVxuXG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdHlwZSA9ICdudWxsJ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgdHlwZSA9ICdkYXRlJ1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgdHlwZSA9ICdhcnJheSdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0eXBlID0gJ29iamVjdCdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICB0eXBlID0gJ251bWJlcidcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgdHlwZSA9ICdib29sZWFuJ1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHlwZSA9ICdzdHJpbmcnXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPFJlY3Vyc2l2ZWx5UmVuZGVyT2JqZWN0RGF0YVxuICAgICAgICAgICAgICAgICAgaXNFbXB0eT17dmFsdWUubGVuZ3RoID09PSAwIHx8IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgICBrZXk9e2Ake2tleX0tJHtrZXlJbmRleH1gfVxuICAgICAgICAgICAgICAgICAgb2JqZWN0PXt2YWx1ZX1cbiAgICAgICAgICAgICAgICAgIG9iamVjdEtleT17cGFyZW50VHlwZSA9PT0gJ29iamVjdCcgPyBrZXkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICBwYXJlbnRUeXBlPXt0eXBlfVxuICAgICAgICAgICAgICAgICAgdHJhaWxpbmdDb21tYT17IWlzTGFzdEtleX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgdHlwZSA9PT0gJ2RhdGUnIHx8XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgIHR5cGUgPT09ICdudWxsJyB8fFxuICAgICAgICAgICAgICB0eXBlID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgICB0eXBlID09PSAnYm9vbGVhbidcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBwYXJlbnRIYXNLZXkgPSBCb29sZWFuKHBhcmVudFR5cGUgPT09ICdvYmplY3QnICYmIGtleSlcblxuICAgICAgICAgICAgICBjb25zdCByb3dDbGFzc2VzID0gW1xuICAgICAgICAgICAgICAgIGAke2Jhc2VDbGFzc31fX3Jvdy1saW5lYCxcbiAgICAgICAgICAgICAgICBgJHtiYXNlQ2xhc3N9X192YWx1ZS10eXBlLS0ke3R5cGV9YCxcbiAgICAgICAgICAgICAgICBgJHtiYXNlQ2xhc3N9X19yb3ctbGluZS0tJHtvYmplY3RLZXkgPyAnbmVzdGVkJyA6ICd0b3AnfWAsXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJyAnKVxuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT17cm93Q2xhc3Nlc30ga2V5PXtgJHtrZXl9LSR7a2V5SW5kZXh9YH0+XG4gICAgICAgICAgICAgICAgICB7cGFyZW50SGFzS2V5ID8gPHNwYW4+e2BcIiR7a2V5fVwiOiBgfTwvc3Bhbj4gOiBudWxsfVxuXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX3ZhbHVlYH0+e0pTT04uc3RyaW5naWZ5KHZhbHVlKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICB7aXNMYXN0S2V5ID8gJycgOiAnLCd9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pfVxuICAgICAgPC91bD5cblxuICAgICAgeyFpc0VtcHR5ICYmIChcbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPEJyYWNrZXQgY29tbWE9e3RyYWlsaW5nQ29tbWF9IHBvc2l0aW9uPVwiZW5kXCIgdHlwZT17cGFyZW50VHlwZX0gLz5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgKX1cbiAgICA8L2xpPlxuICApXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVSTCh1cmw6IHN0cmluZykge1xuICBpZiAodXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIGNvbnN0IGRvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW5cbiAgICByZXR1cm4gbmV3IFVSTCh1cmwsIGRvbWFpbilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IFVSTCh1cmwpXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEFQSTogUmVhY3QuRkM8RWRpdFZpZXdQcm9wcz4gPSAocHJvcHMpID0+IHtcbiAgY29uc3QgeyBhcGlVUkwgfSA9IHByb3BzXG4gIGNvbnN0IHsgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oKVxuICBjb25zdCB7XG4gICAgbG9jYWxpemF0aW9uLFxuICAgIHJvdXRlczogeyBhcGkgfSxcbiAgICBzZXJ2ZXJVUkwsXG4gIH0gPSB1c2VDb25maWcoKVxuICBjb25zdCB7IGlkLCBjb2xsZWN0aW9uLCBnbG9iYWwgfSA9IHVzZURvY3VtZW50SW5mbygpXG4gIGNvbnN0IHsgY29kZSB9ID0gdXNlTG9jYWxlKClcbiAgY29uc3QgdXJsID0gY3JlYXRlVVJMKGFwaVVSTClcblxuICBjb25zdCB7IHNldFZpZXdBY3Rpb25zIH0gPSB1c2VBY3Rpb25zKClcblxuICBjb25zdCBkcmFmdHNFbmFibGVkID0gY29sbGVjdGlvbj8udmVyc2lvbnM/LmRyYWZ0cyB8fCBnbG9iYWw/LnZlcnNpb25zPy5kcmFmdHNcbiAgY29uc3QgZG9jRW5kcG9pbnQgPSBnbG9iYWwgPyBgL2dsb2JhbHMvJHtnbG9iYWwuc2x1Z31gIDogYC8ke2NvbGxlY3Rpb24uc2x1Z30vJHtpZH1gXG5cbiAgY29uc3QgW2RhdGEsIHNldERhdGFdID0gUmVhY3QudXNlU3RhdGU8YW55Pih7fSlcbiAgY29uc3QgW2RyYWZ0LCBzZXREcmFmdF0gPSBSZWFjdC51c2VTdGF0ZTxib29sZWFuPih1cmwuc2VhcmNoUGFyYW1zLmdldCgnZHJhZnQnKSA9PT0gJ3RydWUnKVxuICBjb25zdCBbbG9jYWxlLCBzZXRMb2NhbGVdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nPih1cmwuc2VhcmNoUGFyYW1zLmdldCgnbG9jYWxlJykgfHwgY29kZSlcbiAgY29uc3QgW2RlcHRoLCBzZXREZXB0aF0gPSBSZWFjdC51c2VTdGF0ZTxzdHJpbmc+KHVybC5zZWFyY2hQYXJhbXMuZ2V0KCdkZXB0aCcpIHx8ICcxJylcbiAgY29uc3QgW2F1dGhlbnRpY2F0ZWQsIHNldEF1dGhlbnRpY2F0ZWRdID0gUmVhY3QudXNlU3RhdGU8Ym9vbGVhbj4odHJ1ZSlcbiAgY29uc3QgW2Z1bGxzY3JlZW4sIHNldEZ1bGxzY3JlZW5dID0gUmVhY3QudXNlU3RhdGU8Ym9vbGVhbj4oZmFsc2UpXG5cbiAgY29uc3QgZmV0Y2hVUkwgPSBgJHtzZXJ2ZXJVUkx9JHthcGl9JHtkb2NFbmRwb2ludH0/bG9jYWxlPSR7bG9jYWxlfSZkcmFmdD0ke2RyYWZ0fSZkZXB0aD0ke2RlcHRofWBcblxuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGZldGNoRGF0YSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBhd2FpdCByZXF1ZXN0cy5nZXQoZmV0Y2hVUkwsIHtcbiAgICAgICAgY3JlZGVudGlhbHM6IGF1dGhlbnRpY2F0ZWQgPyAnaW5jbHVkZScgOiAnb21pdCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG5cbiAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXF1ZXN0Lmpzb24oKVxuICAgICAgc2V0RGF0YShqc29uKVxuICAgIH1cblxuICAgIGZldGNoRGF0YSgpXG4gIH0sIFtpMThuLmxhbmd1YWdlLCBmZXRjaFVSTCwgYXV0aGVudGljYXRlZF0pXG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBlZGl0Q29uZmlnID0gKGNvbGxlY3Rpb24gfHwgZ2xvYmFsKT8uYWRtaW4/LmNvbXBvbmVudHM/LnZpZXdzPy5FZGl0XG4gICAgY29uc3QgYXBpQWN0aW9ucyA9XG4gICAgICBlZGl0Q29uZmlnICYmICdBUEknIGluIGVkaXRDb25maWcgJiYgJ2FjdGlvbnMnIGluIGVkaXRDb25maWcuQVBJID8gZWRpdENvbmZpZy5BUEkuYWN0aW9ucyA6IFtdXG5cbiAgICBzZXRWaWV3QWN0aW9ucyhhcGlBY3Rpb25zKVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHNldFZpZXdBY3Rpb25zKFtdKVxuICAgIH1cbiAgfSwgW2NvbGxlY3Rpb24sIGdsb2JhbCwgc2V0Vmlld0FjdGlvbnNdKVxuXG4gIGNvbnN0IGxvY2FsZU9wdGlvbnMgPVxuICAgIGxvY2FsaXphdGlvbiAmJlxuICAgIGxvY2FsaXphdGlvbi5sb2NhbGVzLm1hcCgobG9jYWxlKSA9PiAoeyBsYWJlbDogbG9jYWxlLmxhYmVsLCB2YWx1ZTogbG9jYWxlLmNvZGUgfSkpXG5cbiAgY29uc3QgY2xhc3NlcyA9IFtiYXNlQ2xhc3MsIGZ1bGxzY3JlZW4gJiYgYCR7YmFzZUNsYXNzfS0tZnVsbHNjcmVlbmBdLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJylcblxuICBsZXQgaXNFZGl0aW5nOiBib29sZWFuXG5cbiAgaWYgKCdjb2xsZWN0aW9uJyBpbiBwcm9wcykge1xuICAgIGlzRWRpdGluZyA9IHByb3BzPy5pc0VkaXRpbmdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPEd1dHRlciBjbGFzc05hbWU9e2NsYXNzZXN9IHJpZ2h0PXtmYWxzZX0+XG4gICAgICA8U2V0U3RlcE5hdlxuICAgICAgICBjb2xsZWN0aW9uPXtjb2xsZWN0aW9ufVxuICAgICAgICBnbG9iYWw9e2dsb2JhbH1cbiAgICAgICAgaWQ9e2lkfVxuICAgICAgICBpc0VkaXRpbmc9e2lzRWRpdGluZ31cbiAgICAgICAgdmlldz1cIkFQSVwiXG4gICAgICAvPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2NvbmZpZ3VyYXRpb25gfT5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2FwaS11cmxgfT5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2xhYmVsYH0+XG4gICAgICAgICAgICBBUEkgVVJMIDxDb3B5VG9DbGlwYm9hcmQgdmFsdWU9e2ZldGNoVVJMfSAvPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YSBocmVmPXtmZXRjaFVSTH0gcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAge2ZldGNoVVJMfVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2Zvcm0tZmllbGRzYH0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX2ZpbHRlci1xdWVyeS1jaGVja2JveGVzYH0+XG4gICAgICAgICAgICB7ZHJhZnRzRW5hYmxlZCAmJiAoXG4gICAgICAgICAgICAgIDxDaGVja2JveElucHV0XG4gICAgICAgICAgICAgICAgY2hlY2tlZD17ZHJhZnR9XG4gICAgICAgICAgICAgICAgaWQ9XCJkcmFmdC1jaGVja2JveFwiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJEcmFmdFwiXG4gICAgICAgICAgICAgICAgb25Ub2dnbGU9eygpID0+IHNldERyYWZ0KCFkcmFmdCl9XG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPENoZWNrYm94SW5wdXRcbiAgICAgICAgICAgICAgY2hlY2tlZD17YXV0aGVudGljYXRlZH1cbiAgICAgICAgICAgICAgaWQ9XCJhdXRoLWNoZWNrYm94XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJBdXRoZW50aWNhdGVkXCJcbiAgICAgICAgICAgICAgb25Ub2dnbGU9eygpID0+IHNldEF1dGhlbnRpY2F0ZWQoIWF1dGhlbnRpY2F0ZWQpfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHtsb2NhbGVPcHRpb25zICYmIChcbiAgICAgICAgICAgIDxTZWxlY3RJbnB1dFxuICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e3tcbiAgICAgICAgICAgICAgICBsYWJlbDogbG9jYWxlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBsb2NhbGUsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGxhYmVsPVwiTG9jYWxlXCJcbiAgICAgICAgICAgICAgbmFtZT1cImxvY2FsZVwiXG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0TG9jYWxlKGUudmFsdWUgYXMgc3RyaW5nKX1cbiAgICAgICAgICAgICAgb3B0aW9ucz17bG9jYWxlT3B0aW9uc31cbiAgICAgICAgICAgICAgcGF0aD1cImxvY2FsZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgPFNlbGVjdElucHV0XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU9e3tcbiAgICAgICAgICAgICAgbGFiZWw6IGRlcHRoLFxuICAgICAgICAgICAgICB2YWx1ZTogZGVwdGgsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgbGFiZWw9XCJEZXB0aFwiXG4gICAgICAgICAgICBuYW1lPVwiZGVwdGhcIlxuICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXREZXB0aChlLnZhbHVlIGFzIHN0cmluZyl9XG4gICAgICAgICAgICBvcHRpb25zPXtbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJzAnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJzEnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJzInLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJzMnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnMycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJzQnLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAnNCcsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdfVxuICAgICAgICAgICAgcGF0aD1cImRlcHRoXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fcmVzdWx0cy13cmFwcGVyYH0+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtiYXNlQ2xhc3N9X190b2dnbGUtZnVsbHNjcmVlbi1idXR0b24tY29udGFpbmVyYH0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cInRvZ2dsZSBmdWxsc2NyZWVuXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YCR7YmFzZUNsYXNzfV9fdG9nZ2xlLWZ1bGxzY3JlZW4tYnV0dG9uYH1cbiAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEZ1bGxzY3JlZW4oIWZ1bGxzY3JlZW4pfVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1pbmltaXplTWF4aW1pemUgaXNNaW5pbWl6ZWQ9eyFmdWxsc2NyZWVufSAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake2Jhc2VDbGFzc31fX3Jlc3VsdHNgfT5cbiAgICAgICAgICA8UmVjdXJzaXZlbHlSZW5kZXJPYmplY3REYXRhIG9iamVjdD17ZGF0YX0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L0d1dHRlcj5cbiAgKVxufVxuIl0sIm5hbWVzIjpbIkFQSSIsImNoYXJzIiwibGVmdEN1cmx5QnJhY2tldCIsImxlZnRTcXVhcmVCcmFja2V0IiwicmlnaHRDdXJseUJyYWNrZXQiLCJyaWdodFNxdWFyZUJyYWNrZXQiLCJiYXNlQ2xhc3MiLCJCcmFja2V0IiwiY29tbWEiLCJwb3NpdGlvbiIsInR5cGUiLCJyaWdodEJyYWNrZXQiLCJsZWZ0QnJhY2tldCIsImJyYWNrZXRUb1JlbmRlciIsInNwYW4iLCJjbGFzc05hbWUiLCJSZWN1cnNpdmVseVJlbmRlck9iamVjdERhdGEiLCJpc0VtcHR5Iiwib2JqZWN0Iiwib2JqZWN0S2V5IiwicGFyZW50VHlwZSIsInRyYWlsaW5nQ29tbWEiLCJvYmplY3RLZXlzIiwiT2JqZWN0Iiwia2V5cyIsIm9iamVjdExlbmd0aCIsImxlbmd0aCIsImlzT3BlbiIsInNldElzT3BlbiIsIlJlYWN0IiwidXNlU3RhdGUiLCJsaSIsImJ1dHRvbiIsImFyaWEtbGFiZWwiLCJvbkNsaWNrIiwiQ2hldnJvbiIsInVsIiwibWFwIiwia2V5Iiwia2V5SW5kZXgiLCJ2YWx1ZSIsImlzTGFzdEtleSIsIkRhdGUiLCJ0b0lTT1N0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsInVuZGVmaW5lZCIsInBhcmVudEhhc0tleSIsIkJvb2xlYW4iLCJyb3dDbGFzc2VzIiwiZmlsdGVyIiwiam9pbiIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVhdGVVUkwiLCJ1cmwiLCJzdGFydHNXaXRoIiwiZG9tYWluIiwid2luZG93IiwibG9jYXRpb24iLCJvcmlnaW4iLCJVUkwiLCJwcm9wcyIsImFwaVVSTCIsImkxOG4iLCJ1c2VUcmFuc2xhdGlvbiIsImxvY2FsaXphdGlvbiIsInJvdXRlcyIsImFwaSIsInNlcnZlclVSTCIsInVzZUNvbmZpZyIsImlkIiwiY29sbGVjdGlvbiIsImdsb2JhbCIsInVzZURvY3VtZW50SW5mbyIsImNvZGUiLCJ1c2VMb2NhbGUiLCJzZXRWaWV3QWN0aW9ucyIsInVzZUFjdGlvbnMiLCJkcmFmdHNFbmFibGVkIiwidmVyc2lvbnMiLCJkcmFmdHMiLCJkb2NFbmRwb2ludCIsInNsdWciLCJkYXRhIiwic2V0RGF0YSIsImRyYWZ0Iiwic2V0RHJhZnQiLCJzZWFyY2hQYXJhbXMiLCJnZXQiLCJsb2NhbGUiLCJzZXRMb2NhbGUiLCJkZXB0aCIsInNldERlcHRoIiwiYXV0aGVudGljYXRlZCIsInNldEF1dGhlbnRpY2F0ZWQiLCJmdWxsc2NyZWVuIiwic2V0RnVsbHNjcmVlbiIsImZldGNoVVJMIiwidXNlRWZmZWN0IiwiZmV0Y2hEYXRhIiwicmVxdWVzdCIsInJlcXVlc3RzIiwiY3JlZGVudGlhbHMiLCJoZWFkZXJzIiwibGFuZ3VhZ2UiLCJqc29uIiwiZWRpdENvbmZpZyIsImFkbWluIiwiY29tcG9uZW50cyIsInZpZXdzIiwiRWRpdCIsImFwaUFjdGlvbnMiLCJhY3Rpb25zIiwibG9jYWxlT3B0aW9ucyIsImxvY2FsZXMiLCJsYWJlbCIsImNsYXNzZXMiLCJpc0VkaXRpbmciLCJHdXR0ZXIiLCJyaWdodCIsIlNldFN0ZXBOYXYiLCJ2aWV3IiwiZGl2IiwiQ29weVRvQ2xpcGJvYXJkIiwiYSIsImhyZWYiLCJyZWwiLCJ0YXJnZXQiLCJDaGVja2JveElucHV0IiwiY2hlY2tlZCIsIm9uVG9nZ2xlIiwiU2VsZWN0SW5wdXQiLCJkZWZhdWx0VmFsdWUiLCJuYW1lIiwib25DaGFuZ2UiLCJlIiwib3B0aW9ucyIsInBhdGgiLCJNaW5pbWl6ZU1heGltaXplIiwiaXNNaW5pbWl6ZWQiXSwibWFwcGluZ3MiOiI7Ozs7K0JBNkthQTs7O2VBQUFBOzs7K0RBN0tVOzhCQUNRO2tCQUlQO3FCQUNDO3dFQUNHO3dCQUNMO3VCQUNPOytEQUNOO2tDQUNTO2lDQUNOO3dCQUNEOzhCQUNNO3dCQUNOOzRCQUNDO1FBQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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