@hotstaq/admin-panel 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/.env +3 -2
  2. package/.vscode/launch.json +16 -23
  3. package/.vscode/tasks.json +11 -0
  4. package/HotSite.json +17 -4
  5. package/assets/html/admin-footer.hott +0 -4
  6. package/assets/html/admin-header.hott +7 -3
  7. package/assets/html/admin-sidebar.hott +13 -3
  8. package/build/src/WebExport.js +2 -2
  9. package/build/src/WebExport.js.map +1 -1
  10. package/build/src/cli.d.ts +2 -0
  11. package/build/src/cli.d.ts.map +1 -0
  12. package/{assets/components/admin-button.js → build/src/cli.js} +11 -41
  13. package/build/src/cli.js.map +1 -0
  14. package/build/src/components/admin-button.d.ts.map +1 -1
  15. package/build/src/components/admin-button.js.map +1 -1
  16. package/build/src/components/admin-dashboard.d.ts.map +1 -1
  17. package/build/src/components/admin-dashboard.js +2 -1
  18. package/build/src/components/admin-dashboard.js.map +1 -1
  19. package/build/src/components/admin-edit.d.ts +1 -1
  20. package/build/src/components/admin-edit.d.ts.map +1 -1
  21. package/build/src/components/admin-edit.js +2 -1
  22. package/build/src/components/admin-edit.js.map +1 -1
  23. package/build/src/components/admin-table-field.d.ts.map +1 -1
  24. package/build/src/components/admin-table-field.js +4 -2
  25. package/build/src/components/admin-table-field.js.map +1 -1
  26. package/build/src/components/admin-table-row.d.ts +3 -1
  27. package/build/src/components/admin-table-row.d.ts.map +1 -1
  28. package/build/src/components/admin-table-row.js +2 -6
  29. package/build/src/components/admin-table-row.js.map +1 -1
  30. package/build/src/components/admin-table.d.ts.map +1 -1
  31. package/build/src/components/admin-table.js +2 -1
  32. package/build/src/components/admin-table.js.map +1 -1
  33. package/build/src/components/admin-text.d.ts +1 -1
  34. package/build/src/components/admin-text.d.ts.map +1 -1
  35. package/build/src/components/admin-text.js +2 -1
  36. package/build/src/components/admin-text.js.map +1 -1
  37. package/build-web/AdminPanelComponents.js +2 -0
  38. package/build-web/AdminPanelWeb_AppAPI.js +238 -0
  39. package/docker-compose.yaml +39 -0
  40. package/env-example +1 -0
  41. package/package.json +5 -5
  42. package/src/WebExport.ts +2 -2
  43. package/src/cli.ts +7 -0
  44. package/src/components/admin-button.ts +3 -3
  45. package/src/components/admin-dashboard.ts +1 -2
  46. package/src/components/admin-edit.ts +3 -2
  47. package/src/components/admin-table-field.ts +3 -3
  48. package/src/components/admin-table-row.ts +4 -8
  49. package/src/components/admin-table.ts +1 -2
  50. package/src/components/admin-text.ts +2 -1
  51. package/start.sh +9 -0
  52. package/stop.sh +9 -0
  53. package/webpack.config.cjs +2 -2
  54. package/assets/components/admin-dashboard.js +0 -89
  55. package/assets/components/admin-edit.js +0 -124
  56. package/assets/components/admin-table-field.js +0 -91
  57. package/assets/components/admin-table-row.js +0 -104
  58. package/assets/components/admin-table.js +0 -190
  59. package/assets/components/admin-text.js +0 -94
  60. package/build-web/AdminPanel.js +0 -2
  61. package/build-web/admin-panel.yaml +0 -75
  62. package/public/index.hott +0 -16
@@ -0,0 +1,2 @@
1
+ var AdminPanelComponentsWeb;(()=>{"use strict";var t={1:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminText=e.AdminTableRow=e.AdminTableField=e.AdminTable=e.AdminEdit=e.AdminDashboard=e.AdminButton=e.buildAssets=void 0;const o=n(176);Object.defineProperty(e,"AdminButton",{enumerable:!0,get:function(){return o.AdminButton}});const a=n(50);Object.defineProperty(e,"AdminDashboard",{enumerable:!0,get:function(){return a.AdminDashboard}});const s=n(703);Object.defineProperty(e,"AdminEdit",{enumerable:!0,get:function(){return s.AdminEdit}});const d=n(952);Object.defineProperty(e,"AdminTable",{enumerable:!0,get:function(){return d.AdminTable}});const r=n(505);Object.defineProperty(e,"AdminTableField",{enumerable:!0,get:function(){return r.AdminTableField}});const l=n(412);Object.defineProperty(e,"AdminTableRow",{enumerable:!0,get:function(){return l.AdminTableRow}});const c=n(80);Object.defineProperty(e,"AdminText",{enumerable:!0,get:function(){return c.AdminText}}),e.buildAssets=function(){return i(this,void 0,void 0,(function*(){return{import:[{name:"bootstrap",files:["bootstrap.min.js","bootstrap.min.css"]},{name:"jquery",files:["jquery.min.js"]},"chart.js","feather-icons","@popperjs/core"],html:["./assets/html/*.*"],css:["./assets/css/*.*"],js:["./assets/js/*.*","./build-web/AdminPanelComponents.js"],componentLibrary:"AdminPanelComponentsWeb",components:[o.AdminButton,a.AdminDashboard,s.AdminEdit,d.AdminTable,r.AdminTableField,l.AdminTableRow,c.AdminText]}}))}},176:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminButton=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-button"}buttonClicked(){return i(this,void 0,void 0,(function*(){}))}output(){return i(this,void 0,void 0,(function*(){return`<button id = "${this.htmlElements[0].id}" onclick = "this.buttonClicked ();"></button>`}))}}e.AdminButton=a},50:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminDashboard=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-dashboard",this.title="",this.base=""}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){""!=this.base&&(o.Hot.Data.baseUrl=this.base)}))}output(){return i(this,void 0,void 0,(function*(){return`\n\t\t<main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">\n\t\t\t<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">\n\t\t\t\t<h1 class="h2">${this.title}</h1>\n\t\t\t\t<div class="btn-toolbar mb-2 mb-md-0">\n\t\t\t\t\t<div class="btn-group me-2">\n\t\t\t\t\t\t<hot-place-here name = "buttons"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<hot-place-here name = "body"></hot-place-here>\n\t\t</main>`}))}}e.AdminDashboard=a},703:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminEdit=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-edit",this.title="",this.button_title="",this.attached_list="",this.schema="",this.fieldElements={},this.modalId=""}onSave(){return i(this,void 0,void 0,(function*(){let t={};for(let e in this.fieldElements){let n=this.fieldElements[e].value;t[e]=n}yield o.Hot.jsonRequest(`${o.Hot.Data.baseUrl}/v1/data/add`,{schema:this.schema,fields:t});let e=document.getElementById(this.attached_list);yield e.hotComponent.refreshList(),$(`#${this.modalId}`).modal("hide")}))}output(){return i(this,void 0,void 0,(function*(){if(""===this.name)throw new Error("You must specify a name for each admin-edit element!");return this.modalId=`${this.name}Modal`,[{html:`\n\t\t\t\x3c!-- ${this.title} Modal Start --\x3e\n\t\t\t<div class="modal fade" id="${this.modalId}" tabindex="-1" aria-labelledby="${this.name}ModalLabel" aria-hidden="true">\n\t\t\t\t<div class="modal-dialog">\n\t\t\t\t\t<div class="modal-content">\n\t\t\t\t\t<div class="modal-header">\n\t\t\t\t\t\t<h5 class="modal-title" id="${this.name}ModalLabel">${this.title}</h5>\n\t\t\t\t\t\t<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-body">\n\t\t\t\t\t\t<hot-place-here name = "modalBody" type = "modal"></hot-place-here>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="modal-footer">\n\t\t\t\t\t\t<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>\n\t\t\t\t\t\t<button type="button" class="btn btn-primary" onclick = "document.getElementById('${this.modalId}').onSave ();">${this.button_title}</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t\x3c!-- ${this.title} Modal End --\x3e`,parentSelector:"body"},{html:`<button id = "${this.modalId}-add-btn" type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#${this.modalId}">Add</button>`,parentSelector:'hot-place-here[name="buttons"]'}]}))}}e.AdminEdit=a},505:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableField=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-field",this.field=0}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){let n=t.parentNode.parentNode.parentNode.hotComponent;null!=n&&n.addHeaderDataOnly(this,e)}))}output(){return i(this,void 0,void 0,(function*(){return[{html:`<th>${this.inner}</th>`,placeHereParent:"header"}]}))}}e.AdminTableField=a},412:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTableRow=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-table-row",this.fields=[]}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){t.parentNode.parentNode.parentNode.hotComponent.rowElements.push({fields:this.fields,element:e})}))}output(){return i(this,void 0,void 0,(function*(){let t="";for(let e=0;e<this.fields.length;e++){let n=this.fields[e];for(let e in n)t+=`<td>${n[e]}</td>`}return[{html:`<tr>${t}</tr>`,placeHereParent:"results"}]}))}}e.AdminTableRow=a},952:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminTable=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.headerElements={},this.rowElements=[],this.tag="admin-table",this.title="",this.schema="",this.headerElements={},this.headerIndicies=[],this.rowElements=[]}addHeader(t){let e=this.htmlElements[0].getElementsByTagName("thead")[0];this.headerIndicies.push(t.hotComponent.field),e.appendChild(t)}addHeaderDataOnly(t,e){this.headerIndicies.push(t.field),this.headerElements[t.field]=e}addRow(t){let e=this.htmlElements[1].getElementsByTagName("tbody")[0],n="<tr>";for(let e=0;e<this.headerIndicies.length;e++){let i=this.headerIndicies[e],o=t[i];null!=this.headerElements[i]&&(n+=`<td>${o}</td>`)}n+="</tr>",o.HotStaq.addHtml(e,n)}clearRows(){return i(this,void 0,void 0,(function*(){this.htmlElements[1].getElementsByTagName("tbody")[0].innerHTML=""}))}refreshList(){return i(this,void 0,void 0,(function*(){let t=yield o.Hot.jsonRequest(`${o.Hot.Data.baseUrl}/v1/data/list`,{schema:this.schema});this.clearRows();for(let e=0;e<t.length;e++){let n=t[e];this.addRow(n)}}))}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){setTimeout((()=>i(this,void 0,void 0,(function*(){yield this.refreshList()}))),50)}))}output(){return i(this,void 0,void 0,(function*(){return`\n\t\t<div id = "${this.htmlElements[0].id}">\n\t\t\t<h2>${this.title}</h2>\n\t\t\t<div class="table-responsive">\n\t\t\t<table class="table table-striped table-sm">\n\t\t\t\t<thead hot-place-here = "header">\n\t\t\t\t</thead>\n\t\t\t\t<tbody hot-place-here = "results">\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t\t</div>\n\t\t</div>`}))}}e.AdminTable=a},80:function(t,e,n){var i=this&&this.__awaiter||function(t,e,n,i){return new(n||(n=Promise))((function(o,a){function s(t){try{r(i.next(t))}catch(t){a(t)}}function d(t){try{r(i.throw(t))}catch(t){a(t)}}function r(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,d)}r((i=i.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.AdminText=void 0;const o=n(607);class a extends o.HotComponent{constructor(t,e){super(t,e),this.tag="admin-text",this.field=""}onPostPlace(t,e){return i(this,void 0,void 0,(function*(){let n=t.querySelectorAll('hot-place-here[type="modal"]');if(n.length>0){let i=n[0];t.removeChild(e),i.appendChild(e),t.hotComponent.fieldElements[this.field]=e.querySelector("input")}}))}output(){return i(this,void 0,void 0,(function*(){return`<div>\n\t\t\t<label class="form-label">${this.inner}</label><input class="form-control" type = "text" value = "" />\n\t\t</div>`}))}}e.AdminText=a},607:t=>{t.exports=HotStaqWeb}},e={},n=function n(i){var o=e[i];if(void 0!==o)return o.exports;var a=e[i]={exports:{}};return t[i].call(a.exports,a,a.exports,n),a.exports}(1);AdminPanelComponentsWeb=n})();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRtaW5QYW5lbENvbXBvbmVudHMuanMiLCJtYXBwaW5ncyI6Im9qQkFBQSxlQWlDRSwyRUFqQ08sRUFBQUEsV0FBVyxJQUNwQixjQWlDRSw4RUFqQ08sRUFBQUMsY0FBYyxJQUN2QixlQWlDRSx5RUFqQ08sRUFBQUMsU0FBUyxJQUNsQixlQWlDRSwwRUFqQ08sRUFBQUMsVUFBVSxJQUNuQixlQWlDRSwrRUFqQ08sRUFBQUMsZUFBZSxJQUN4QixlQWlDRSw2RUFqQ08sRUFBQUMsYUFBYSxJQUN0QixjQWlDRSx5RUFqQ08sRUFBQUMsU0FBUyxJQTBCaEIsRUFBQUMsWUF4QkYsVyx5Q0FFQyxNQUFPLENBQ0xDLE9BQVEsQ0FBQyxDQUFFQyxLQUFNLFlBQWFDLE1BQU8sQ0FBQyxtQkFBb0Isc0JBQ3pELENBQUVELEtBQU0sU0FBVUMsTUFBTyxDQUFDLGtCQUMxQixXQUNBLGdCQUNBLGtCQUNEQyxLQUFNLENBQUMscUJBQ1BDLElBQUssQ0FBQyxvQkFDTkMsR0FBSSxDQUFDLGtCQUFtQix1Q0FDeEJDLGlCQUFrQiwwQkFDbEJDLFdBQVksQ0FDWCxFQUFBZixZQUNBLEVBQUFDLGVBQ0EsRUFBQUMsVUFDQSxFQUFBQyxXQUNBLEVBQUFDLGdCQUNBLEVBQUFDLGNBQ0EsRUFBQUMsV0FFSixHLDZaQzdCQSxlQUVBLE1BQWFOLFVBQW9CLEVBQUFnQixhQUVoQ0MsWUFBYUMsRUFBOEJDLEdBRTFDQyxNQUFPRixFQUFNQyxHQUViRSxLQUFLQyxJQUFNLGNBQ1osQ0FFTUMsZ0IseUNBRU4sRyxDQUVNQyxTLHlDQUVMLE1BQU8saUJBQWtCSCxLQUFLSSxhQUFhLEdBQUdDLGtEQUMvQyxHLEVBaEJELGUsOFpDRkEsZUFFQSxNQUFhekIsVUFBdUIsRUFBQWUsYUFXbkNDLFlBQWFDLEVBQThCQyxHQUUxQ0MsTUFBT0YsRUFBTUMsR0FFYkUsS0FBS0MsSUFBTSxrQkFDWEQsS0FBS00sTUFBUSxHQUNiTixLQUFLTyxLQUFPLEVBQ2IsQ0FNTUMsWUFBYUMsRUFBZ0NDLEcseUNBR2pDLElBQWJWLEtBQUtPLE9BQ1IsRUFBQUksSUFBSUMsS0FBS0MsUUFBVWIsS0FBS08sS0FDMUIsRyxDQUVNSixTLHlDQUVMLE1BQU8sbU5BR1lILEtBQUtNLHdSQVN6QixHLEVBN0NELGtCLDBaQ0ZBLGVBRUEsTUFBYXpCLFVBQWtCLEVBQUFjLGFBMkI5QkMsWUFBYUMsRUFBOEJDLEdBRTFDQyxNQUFPRixFQUFNQyxHQUViRSxLQUFLQyxJQUFNLGFBQ1hELEtBQUtNLE1BQVEsR0FDYk4sS0FBS2MsYUFBZSxHQUNwQmQsS0FBS2UsY0FBZ0IsR0FDckJmLEtBQUtnQixPQUFTLEdBRWRoQixLQUFLaUIsY0FBZ0IsQ0FBQyxFQUV0QmpCLEtBQUtrQixRQUFVLEVBQ2hCLENBS01DLFMseUNBRUwsSUFBSUMsRUFBYyxDQUFDLEVBRW5CLElBQUssSUFBSUMsS0FBT3JCLEtBQUtpQixjQUNyQixDQUNDLElBQ0lLLEVBRGV0QixLQUFLaUIsY0FBY0ksR0FDYkMsTUFFekJGLEVBQU9DLEdBQU9DLEMsT0FHVCxFQUFBWCxJQUFJWSxZQUFhLEdBQUcsRUFBQVosSUFBSUMsS0FBS0Msc0JBQXVCLENBQ3hERyxPQUFRaEIsS0FBS2dCLE9BQ2JRLE9BQVFKLElBR1YsSUFBSUssRUFBZUMsU0FBU0MsZUFBZ0IzQixLQUFLZSxxQkFHM0NVLEVBQWFHLGFBQWFDLGNBR2hDQyxFQUFFLElBQUk5QixLQUFLa0IsV0FBV2EsTUFBTyxPQUM5QixHLENBRU01QixTLHlDQUVMLEdBQWtCLEtBQWRILEtBQUtaLEtBQ1IsTUFBTSxJQUFJNEMsTUFBTyx3REFJbEIsT0FGQWhDLEtBQUtrQixRQUFVLEdBQUdsQixLQUFLWixZQUVoQixDQUFFLENBQ1JFLEtBQU0sbUJBQ0NVLEtBQUtNLCtEQUNrQk4sS0FBS2tCLDJDQUEyQ2xCLEtBQUtaLGlNQUlsRFksS0FBS1osbUJBQW1CWSxLQUFLTSwyZkFReUJOLEtBQUtrQix5QkFBeUJsQixLQUFLYywwR0FLbkhkLEtBQUtNLHlCQUNaMkIsZUFBZ0IsUUFFakIsQ0FDQzNDLEtBQU0saUJBQWlCVSxLQUFLa0IsbUhBQW1IbEIsS0FBS2tCLHdCQUVwSmUsZUFBZ0Isa0NBRWxCLEcsRUExR0QsYSxnYUNGQSxlQUVBLE1BQWFsRCxVQUF3QixFQUFBWSxhQU9wQ0MsWUFBYUMsRUFBOEJDLEdBRTFDQyxNQUFPRixFQUFNQyxHQUViRSxLQUFLQyxJQUFNLG9CQUNYRCxLQUFLa0MsTUFBUSxDQUNkLENBTU0xQixZQUFhQyxFQUFnQ0MsRyx5Q0FHbEQsSUFBSWtCLEVBQWVuQixFQUFrQjBCLFdBQVdBLFdBQVdBLFdBQVdQLGFBRWxELE1BQWhCQSxHQUNIQSxFQUFhUSxrQkFBbUJwQyxLQUFNVSxFQUN4QyxHLENBRU1QLFMseUNBRUwsTUFBTyxDQUFFLENBQ1JiLEtBQU0sT0FBT1UsS0FBS3FDLGFBQ2xCQyxnQkFBaUIsVUFFbkIsRyxFQWxDRCxtQiw4WkNGQSxlQUVBLE1BQWF0RCxVQUFzQixFQUFBVyxhQVNsQ0MsWUFBYUMsRUFBOEJDLEdBRTFDQyxNQUFPRixFQUFNQyxHQUViRSxLQUFLQyxJQUFNLGtCQUNYRCxLQUFLd0IsT0FBUyxFQUNmLENBTU1oQixZQUFhQyxFQUFnQ0MsRyx5Q0FHbERELEVBQWtCMEIsV0FBV0EsV0FBV0EsV0FBV1AsYUFBYVcsWUFBWUMsS0FBTSxDQUFFaEIsT0FBUXhCLEtBQUt3QixPQUFRaUIsUUFBUy9CLEdBQ25ILEcsQ0FFTVAsUyx5Q0FFTCxJQUFJdUMsRUFBVSxHQUVkLElBQUssSUFBSUMsRUFBTyxFQUFHQSxFQUFPM0MsS0FBS3dCLE9BQU9vQixPQUFRRCxJQUM5QyxDQUNDLElBQUlFLEVBQVc3QyxLQUFLd0IsT0FBT21CLEdBRTNCLElBQUssSUFBSXRCLEtBQU93QixFQUlmSCxHQUFXLE9BRkNHLEVBQVN4QixTLENBTXZCLE1BQU8sQ0FBRSxDQUNSL0IsS0FBTSxPQUFPb0QsU0FDYkosZ0JBQWlCLFdBRW5CLEcsRUEvQ0QsaUIsMlpDRkEsZUFHQSxNQUFheEQsVUFBbUIsRUFBQWEsYUFzQy9CQyxZQUFhQyxFQUE4QkMsR0FFMUNDLE1BQU9GLEVBQU1DLEdBekJkLEtBQUFnRCxlQUEyQyxDQUFDLEVBcUI1QyxLQUFBUCxZQUFrRCxHQU1qRHZDLEtBQUtDLElBQU0sY0FDWEQsS0FBS00sTUFBUSxHQUNiTixLQUFLZ0IsT0FBUyxHQUNkaEIsS0FBSzhDLGVBQWlCLENBQUMsRUFDdkI5QyxLQUFLK0MsZUFBaUIsR0FDdEIvQyxLQUFLdUMsWUFBYyxFQUNwQixDQUtBUyxVQUFXQyxHQUVWLElBQUlDLEVBQVNsRCxLQUFLSSxhQUFhLEdBQUcrQyxxQkFBc0IsU0FBUyxHQUdqRW5ELEtBQUsrQyxlQUFlUCxLQUFNUyxFQUFrQnJCLGFBQWFNLE9BQ3pEZ0IsRUFBT0UsWUFBYUgsRUFDckIsQ0FLQWIsa0JBQW1CaUIsRUFBNkIzQyxHQUUvQ1YsS0FBSytDLGVBQWVQLEtBQU1hLEVBQVduQixPQUNyQ2xDLEtBQUs4QyxlQUFlTyxFQUFXbkIsT0FBU3hCLENBQ3pDLENBT0E0QyxPQUFROUIsR0FFUCxJQUFJK0IsRUFBUXZELEtBQUtJLGFBQWEsR0FBRytDLHFCQUFzQixTQUFTLEdBQzVESyxFQUFTLE9BRWIsSUFBSyxJQUFJYixFQUFPLEVBQUdBLEVBQU8zQyxLQUFLK0MsZUFBZUgsT0FBUUQsSUFDdEQsQ0FDQyxJQUFJdEIsRUFBTXJCLEtBQUsrQyxlQUFlSixHQUMxQnJCLEVBQVFFLEVBQU9ILEdBRWEsTUFBNUJyQixLQUFLOEMsZUFBZXpCLEtBQ3ZCbUMsR0FBVSxPQUFPbEMsUyxDQUduQmtDLEdBQVUsUUFFVixFQUFBQyxRQUFRQyxRQUFTSCxFQUFPQyxFQUN6QixDQUtNRyxZLHlDQUVPM0QsS0FBS0ksYUFBYSxHQUFHK0MscUJBQXNCLFNBQVMsR0FFMURTLFVBQVksRUFDbkIsRyxDQUtNL0IsYyx5Q0FFTCxJQUFJZ0MsUUFBYSxFQUFBbEQsSUFBSVksWUFBYSxHQUFHLEVBQUFaLElBQUlDLEtBQUtDLHVCQUF3QixDQUNwRUcsT0FBUWhCLEtBQUtnQixTQUdmaEIsS0FBSzJELFlBRUwsSUFBSyxJQUFJaEIsRUFBTyxFQUFHQSxFQUFPa0IsRUFBS2pCLE9BQVFELElBQ3ZDLENBQ0MsSUFBSW5CLEVBQVNxQyxFQUFLbEIsR0FFbEIzQyxLQUFLc0QsT0FBUTlCLEUsQ0FFZixHLENBTU1oQixZQUFhQyxFQUFnQ0MsRyx5Q0FFbERvRCxZQUFZLElBQVcsd0NBRWY5RCxLQUFLNkIsYUFDWixLQUFHLEdBQ0wsRyxDQUVNMUIsUyx5Q0FFTCxNQUFPLG9CQUNNSCxLQUFLSSxhQUFhLEdBQUdDLG1CQUMzQkwsS0FBS00sMlFBVWIsRyxFQXRKRCxjLHlaQ0hBLGVBRUEsTUFBYXJCLFVBQWtCLEVBQUFVLGFBTzlCQyxZQUFhQyxFQUE4QkMsR0FFMUNDLE1BQU9GLEVBQU1DLEdBRWJFLEtBQUtDLElBQU0sYUFDWEQsS0FBS2tDLE1BQVEsRUFDZCxDQU1NMUIsWUFBYUMsRUFBZ0NDLEcseUNBRWxELElBQUlxRCxFQUFpQnRELEVBQWtCdUQsaUJBQWtCLGdDQUV6RCxHQUFJRCxFQUFlbkIsT0FBUyxFQUM1QixDQUNDLElBQUlxQixFQUFZRixFQUFlLEdBQy9CdEQsRUFBa0J5RCxZQUFheEQsR0FDL0J1RCxFQUFVYixZQUFhMUMsR0FHdkJELEVBQWtCbUIsYUFBYVgsY0FBY2pCLEtBQUtrQyxPQUFTeEIsRUFBWXlELGNBQWUsUSxDQUV4RixHLENBRU1oRSxTLHlDQUVMLE1BQU8sMENBQ3NCSCxLQUFLcUMsa0ZBRW5DLEcsRUF2Q0QsYSxVQ0ZBK0IsRUFBT0MsUUFBVUMsVSxHQ0NiQyxFQUEyQixDQUFDLEVDRTVCQyxFRENKLFNBQVNDLEVBQW9CQyxHQUU1QixJQUFJQyxFQUFlSixFQUF5QkcsR0FDNUMsUUFBcUJFLElBQWpCRCxFQUNILE9BQU9BLEVBQWFOLFFBR3JCLElBQUlELEVBQVNHLEVBQXlCRyxHQUFZLENBR2pETCxRQUFTLENBQUMsR0FPWCxPQUhBUSxFQUFvQkgsR0FBVUksS0FBS1YsRUFBT0MsUUFBU0QsRUFBUUEsRUFBT0MsUUFBU0ksR0FHcEVMLEVBQU9DLE9BQ2YsQ0NuQjBCSSxDQUFvQixHIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQWRtaW5QYW5lbENvbXBvbmVudHNXZWIvLi9zcmMvV2ViRXhwb3J0LnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tYnV0dG9uLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZGFzaGJvYXJkLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tZWRpdC50cyIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi8uL3NyYy9jb21wb25lbnRzL2FkbWluLXRhYmxlLWZpZWxkLnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUtcm93LnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViLy4vc3JjL2NvbXBvbmVudHMvYWRtaW4tdGFibGUudHMiLCJ3ZWJwYWNrOi8vQWRtaW5QYW5lbENvbXBvbmVudHNXZWIvLi9zcmMvY29tcG9uZW50cy9hZG1pbi10ZXh0LnRzIiwid2VicGFjazovL0FkbWluUGFuZWxDb21wb25lbnRzV2ViL2V4dGVybmFsIHZhciBcIkhvdFN0YXFXZWJcIiIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9BZG1pblBhbmVsQ29tcG9uZW50c1dlYi93ZWJwYWNrL3N0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWRtaW5CdXR0b24gfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWJ1dHRvblwiO1xuaW1wb3J0IHsgQWRtaW5EYXNoYm9hcmQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLWRhc2hib2FyZFwiO1xuaW1wb3J0IHsgQWRtaW5FZGl0IH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi1lZGl0XCI7XG5pbXBvcnQgeyBBZG1pblRhYmxlIH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi10YWJsZVwiO1xuaW1wb3J0IHsgQWRtaW5UYWJsZUZpZWxkIH0gZnJvbSBcIi4vY29tcG9uZW50cy9hZG1pbi10YWJsZS1maWVsZFwiO1xuaW1wb3J0IHsgQWRtaW5UYWJsZVJvdyB9IGZyb20gXCIuL2NvbXBvbmVudHMvYWRtaW4tdGFibGUtcm93XCI7XG5pbXBvcnQgeyBBZG1pblRleHQgfSBmcm9tIFwiLi9jb21wb25lbnRzL2FkbWluLXRleHRcIjtcblxuYXN5bmMgZnVuY3Rpb24gYnVpbGRBc3NldHMgKCk6IFByb21pc2U8YW55Plxue1xuXHRyZXR1cm4gKHtcblx0XHRcdGltcG9ydDogW3sgbmFtZTogXCJib290c3RyYXBcIiwgZmlsZXM6IFtcImJvb3RzdHJhcC5taW4uanNcIiwgXCJib290c3RyYXAubWluLmNzc1wiXSB9LCBcblx0XHRcdFx0eyBuYW1lOiBcImpxdWVyeVwiLCBmaWxlczogW1wianF1ZXJ5Lm1pbi5qc1wiXSB9LCBcblx0XHRcdFx0XCJjaGFydC5qc1wiLCBcblx0XHRcdFx0XCJmZWF0aGVyLWljb25zXCIsIFxuXHRcdFx0XHRcIkBwb3BwZXJqcy9jb3JlXCJdLFxuXHRcdFx0aHRtbDogW1wiLi9hc3NldHMvaHRtbC8qLipcIl0sXG5cdFx0XHRjc3M6IFtcIi4vYXNzZXRzL2Nzcy8qLipcIl0sXG5cdFx0XHRqczogW1wiLi9hc3NldHMvanMvKi4qXCIsIFwiLi9idWlsZC13ZWIvQWRtaW5QYW5lbENvbXBvbmVudHMuanNcIl0sXG5cdFx0XHRjb21wb25lbnRMaWJyYXJ5OiBcIkFkbWluUGFuZWxDb21wb25lbnRzV2ViXCIsXG5cdFx0XHRjb21wb25lbnRzOiBbXG5cdFx0XHRcdEFkbWluQnV0dG9uLFxuXHRcdFx0XHRBZG1pbkRhc2hib2FyZCxcblx0XHRcdFx0QWRtaW5FZGl0LFxuXHRcdFx0XHRBZG1pblRhYmxlLFxuXHRcdFx0XHRBZG1pblRhYmxlRmllbGQsXG5cdFx0XHRcdEFkbWluVGFibGVSb3csXG5cdFx0XHRcdEFkbWluVGV4dF1cblx0XHR9KTtcbn1cblxuZXhwb3J0IHtcblx0XHRidWlsZEFzc2V0cyxcblx0XHRBZG1pbkJ1dHRvbixcblx0XHRBZG1pbkRhc2hib2FyZCxcblx0XHRBZG1pbkVkaXQsXG5cdFx0QWRtaW5UYWJsZSxcblx0XHRBZG1pblRhYmxlRmllbGQsXG5cdFx0QWRtaW5UYWJsZVJvdyxcblx0XHRBZG1pblRleHRcblx0fTsiLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluQnV0dG9uIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWJ1dHRvblwiO1xuXHR9XG5cblx0YXN5bmMgYnV0dG9uQ2xpY2tlZCAoKVxuXHR7XG5cdH1cblxuXHRhc3luYyBvdXRwdXQgKClcblx0e1xuXHRcdHJldHVybiAoYDxidXR0b24gaWQgPSBcIiR7dGhpcy5odG1sRWxlbWVudHNbMF0uaWR9XCIgb25jbGljayA9IFwidGhpcy5idXR0b25DbGlja2VkICgpO1wiPjwvYnV0dG9uPmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluRGFzaGJvYXJkIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGl0bGUgb2YgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHR0aXRsZTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJhc2UgdXJsIHRvIHVzZSBmb3IgdGhpcyBkYXNoYm9hcmQuXG5cdCAqL1xuXHRiYXNlOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tZGFzaGJvYXJkXCI7XG5cdFx0dGhpcy50aXRsZSA9IFwiXCI7XG5cdFx0dGhpcy5iYXNlID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhpcyB0YWJsZSBmaWVsZCB0byB0aGUgdGFibGVcblx0ICovXG5cdC8vIEB0cy1pZ25vcmVcblx0YXN5bmMgb25Qb3N0UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTxIVE1MRWxlbWVudD5cblx0e1xuXHRcdC8vIFNldCB0aGUgYmFzZSBBUEkgdXJsIHRvIHVzZSBmb3IgdGhpcyBkYXNoYm9hcmQuXG5cdFx0aWYgKHRoaXMuYmFzZSAhPSBcIlwiKVxuXHRcdFx0SG90LkRhdGEuYmFzZVVybCA9IHRoaXMuYmFzZTtcblx0fVxuXG5cdGFzeW5jIG91dHB1dCAoKTogUHJvbWlzZTxzdHJpbmc+XG5cdHtcblx0XHRyZXR1cm4gKGBcblx0XHQ8bWFpbiBjbGFzcz1cImNvbC1tZC05IG1zLXNtLWF1dG8gY29sLWxnLTEwIHB4LW1kLTRcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gZmxleC13cmFwIGZsZXgtbWQtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBwdC0zIHBiLTIgbWItMyBib3JkZXItYm90dG9tXCI+XG5cdFx0XHRcdDxoMSBjbGFzcz1cImgyXCI+JHt0aGlzLnRpdGxlfTwvaDE+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJidG4tdG9vbGJhciBtYi0yIG1iLW1kLTBcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1lLTJcIj5cblx0XHRcdFx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJidXR0b25zXCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJib2R5XCI+PC9ob3QtcGxhY2UtaGVyZT5cblx0XHQ8L21haW4+YCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEhvdFN0YXEsIEhvdCwgSG90QVBJLCBIb3RDb21wb25lbnQgfSBmcm9tIFwiaG90c3RhcVwiO1xuXG5leHBvcnQgY2xhc3MgQWRtaW5FZGl0IGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGl0bGUgb2YgdGhpcyBlZGl0IG1vZGFsLlxuXHQgKi9cblx0dGl0bGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBidXR0b24gdGl0bGUuXG5cdCAqL1xuXHRidXR0b25fdGl0bGU6IHN0cmluZztcblx0LyoqXG5cdCAqIFRoZSBhdHRhY2hlZCBsaXN0LlxuXHQgKi9cblx0YXR0YWNoZWRfbGlzdDogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGF0dGFjaGVkIHNjaGVtYS5cblx0ICovXG5cdHNjaGVtYTogc3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGZpZWxkIGVsZW1lbnRzIGluIHRoZSBlZGl0IG1vZGFsLlxuXHQgKi9cblx0ZmllbGRFbGVtZW50czogeyBbbmFtZTogc3RyaW5nXTogYW55OyB9O1xuXHQvKipcblx0ICogVGhlIG1vZGFsIGlkLlxuXHQgKi9cblx0bW9kYWxJZDogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLWVkaXRcIjtcblx0XHR0aGlzLnRpdGxlID0gXCJcIjtcblx0XHR0aGlzLmJ1dHRvbl90aXRsZSA9IFwiXCI7XG5cdFx0dGhpcy5hdHRhY2hlZF9saXN0ID0gXCJcIjtcblx0XHR0aGlzLnNjaGVtYSA9IFwiXCI7XG5cblx0XHR0aGlzLmZpZWxkRWxlbWVudHMgPSB7fTtcblxuXHRcdHRoaXMubW9kYWxJZCA9IFwiXCI7XG5cdH1cblxuXHQvKipcblx0ICogU2F2ZSB0aGlzIGZvcm0uXG5cdCAqL1xuXHRhc3luYyBvblNhdmUgKClcblx0e1xuXHRcdGxldCB2YWx1ZXM6IGFueSA9IHt9O1xuXG5cdFx0Zm9yIChsZXQga2V5IGluIHRoaXMuZmllbGRFbGVtZW50cylcblx0XHR7XG5cdFx0XHRsZXQgZmllbGRFbGVtZW50ID0gdGhpcy5maWVsZEVsZW1lbnRzW2tleV07XG5cdFx0XHRsZXQgdmFsdWUgPSBmaWVsZEVsZW1lbnQudmFsdWU7XG5cblx0XHRcdHZhbHVlc1trZXldID0gdmFsdWU7XG5cdFx0fVxuXG5cdFx0YXdhaXQgSG90Lmpzb25SZXF1ZXN0IChgJHtIb3QuRGF0YS5iYXNlVXJsfS92MS9kYXRhL2FkZGAsIHtcblx0XHRcdFx0c2NoZW1hOiB0aGlzLnNjaGVtYSxcblx0XHRcdFx0ZmllbGRzOiB2YWx1ZXNcblx0XHRcdH0pO1xuXG5cdFx0bGV0IGF0dGFjaGVkTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICh0aGlzLmF0dGFjaGVkX2xpc3QpO1xuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGF3YWl0IGF0dGFjaGVkTGlzdC5ob3RDb21wb25lbnQucmVmcmVzaExpc3QgKCk7XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0JChgIyR7dGhpcy5tb2RhbElkfWApLm1vZGFsIChcImhpZGVcIik7XG5cdH1cblxuXHRhc3luYyBvdXRwdXQgKClcblx0e1xuXHRcdGlmICh0aGlzLm5hbWUgPT09IFwiXCIpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IgKGBZb3UgbXVzdCBzcGVjaWZ5IGEgbmFtZSBmb3IgZWFjaCBhZG1pbi1lZGl0IGVsZW1lbnQhYCk7XG5cblx0XHR0aGlzLm1vZGFsSWQgPSBgJHt0aGlzLm5hbWV9TW9kYWxgO1xuXG5cdFx0cmV0dXJuIChbe1xuXHRcdFx0aHRtbDogYFxuXHRcdFx0PCEtLSAke3RoaXMudGl0bGV9IE1vZGFsIFN0YXJ0IC0tPlxuXHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cIiR7dGhpcy5tb2RhbElkfVwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCIke3RoaXMubmFtZX1Nb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIj5cblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cblx0XHRcdFx0XHRcdDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCIke3RoaXMubmFtZX1Nb2RhbExhYmVsXCI+JHt0aGlzLnRpdGxlfTwvaDU+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cblx0XHRcdFx0XHRcdDxob3QtcGxhY2UtaGVyZSBuYW1lID0gXCJtb2RhbEJvZHlcIiB0eXBlID0gXCJtb2RhbFwiPjwvaG90LXBsYWNlLWhlcmU+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuXHRcdFx0XHRcdFx0PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XG5cdFx0XHRcdFx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIG9uY2xpY2sgPSBcImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCcke3RoaXMubW9kYWxJZH0nKS5vblNhdmUgKCk7XCI+JHt0aGlzLmJ1dHRvbl90aXRsZX08L2J1dHRvbj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHRcdDwhLS0gJHt0aGlzLnRpdGxlfSBNb2RhbCBFbmQgLS0+YCxcblx0XHRcdHBhcmVudFNlbGVjdG9yOiBcImJvZHlcIlxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0aHRtbDogYDxidXR0b24gaWQgPSBcIiR7dGhpcy5tb2RhbElkfS1hZGQtYnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS1icy10YXJnZXQ9XCIjJHt0aGlzLm1vZGFsSWR9XCI+QWRkPC9idXR0b24+YCxcblx0XHRcdC8vYDxidXR0b24gaWQgPSBcIiR7dGhpcy5tb2RhbElkfS1hZGQtYnRuXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCIgb25jbGljayA9IFwiJCgnIyR7dGhpcy5tb2RhbElkfScpLm1vZGFsICgnc2hvdycpO1wiPkFkZDwvYnV0dG9uPmAsXG5cdFx0XHRwYXJlbnRTZWxlY3RvcjogYGhvdC1wbGFjZS1oZXJlW25hbWU9XCJidXR0b25zXCJdYFxuXHRcdH1dKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pblRhYmxlRmllbGQgZXh0ZW5kcyBIb3RDb21wb25lbnRcbntcblx0LyoqXG5cdCAqIFRoZSB0YWJsZSBmaWVsZC5cblx0ICovXG5cdGZpZWxkOiBudW1iZXI7XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tdGFibGUtZmllbGRcIjtcblx0XHR0aGlzLmZpZWxkID0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhpcyB0YWJsZSBmaWVsZCB0byB0aGUgdGFibGVcblx0ICovXG5cdC8vIEB0cy1pZ25vcmVcblx0YXN5bmMgb25Qb3N0UGxhY2UgKHBhcmVudEh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCwgaHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUHJvbWlzZTxIVE1MRWxlbWVudD5cblx0e1xuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRsZXQgaG90Q29tcG9uZW50ID0gcGFyZW50SHRtbEVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50O1xuXG5cdFx0aWYgKGhvdENvbXBvbmVudCAhPSBudWxsKVxuXHRcdFx0aG90Q29tcG9uZW50LmFkZEhlYWRlckRhdGFPbmx5ICh0aGlzLCBodG1sRWxlbWVudCk7XG5cdH1cblxuXHRhc3luYyBvdXRwdXQgKClcblx0e1xuXHRcdHJldHVybiAoW3tcblx0XHRcdGh0bWw6IGA8dGg+JHt0aGlzLmlubmVyfTwvdGg+YCxcblx0XHRcdHBsYWNlSGVyZVBhcmVudDogXCJoZWFkZXJcIlxuXHRcdH1dKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSG90U3RhcSwgSG90LCBIb3RBUEksIEhvdENvbXBvbmVudCB9IGZyb20gXCJob3RzdGFxXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pblRhYmxlUm93IGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgZmllbGRzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGUgeyBcIm5hbWVcIjogXCJKb2huIFNtaXRoXCIsIFwiZW1haWxcIjogXCJqb2huLnNtaXRoQGVtYWlsLmNvbVwiIH1cblx0ICovXG5cdGZpZWxkczogYW55W107XG5cblx0Y29uc3RydWN0b3IgKGNvcHk6IEhvdENvbXBvbmVudCB8IEhvdFN0YXEsIGFwaTogSG90QVBJKVxuXHR7XG5cdFx0c3VwZXIgKGNvcHksIGFwaSk7XG5cblx0XHR0aGlzLnRhZyA9IFwiYWRtaW4tdGFibGUtcm93XCI7XG5cdFx0dGhpcy5maWVsZHMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgdGhpcyB0YWJsZSByb3cgdG8gdGhlIHRhYmxlXG5cdCAqL1xuXHQvLyBAdHMtaWdub3JlXG5cdGFzeW5jIG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IFByb21pc2U8SFRNTEVsZW1lbnQ+XG5cdHtcblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0cGFyZW50SHRtbEVsZW1lbnQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuaG90Q29tcG9uZW50LnJvd0VsZW1lbnRzLnB1c2ggKHsgZmllbGRzOiB0aGlzLmZpZWxkcywgZWxlbWVudDogaHRtbEVsZW1lbnR9KTtcblx0fVxuXG5cdGFzeW5jIG91dHB1dCAoKVxuXHR7XG5cdFx0bGV0IHJvd0h0bWwgPSBcIlwiO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCB0aGlzLmZpZWxkcy5sZW5ndGg7IGlJZHgrKylcblx0XHR7XG5cdFx0XHRsZXQgZmllbGRPYmogPSB0aGlzLmZpZWxkc1tpSWR4XTtcblxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGZpZWxkT2JqKVxuXHRcdFx0e1xuXHRcdFx0XHRsZXQgdmFsdWUgPSBmaWVsZE9ialtrZXldO1xuXG5cdFx0XHRcdHJvd0h0bWwgKz0gYDx0ZD4ke3ZhbHVlfTwvdGQ+YDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gKFt7XG5cdFx0XHRodG1sOiBgPHRyPiR7cm93SHRtbH08L3RyPmAsXG5cdFx0XHRwbGFjZUhlcmVQYXJlbnQ6IFwicmVzdWx0c1wiXG5cdFx0fV0pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcbmltcG9ydCB7IEFkbWluVGFibGVGaWVsZCB9IGZyb20gXCIuL2FkbWluLXRhYmxlLWZpZWxkXCI7XG5cbmV4cG9ydCBjbGFzcyBBZG1pblRhYmxlIGV4dGVuZHMgSG90Q29tcG9uZW50XG57XG5cdC8qKlxuXHQgKiBUaGUgdGl0bGUgb2YgdGhpcyB0YWJsZS5cblx0ICovXG5cdHRpdGxlOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgYXR0YWNoZWQgc2NoZW1hLlxuXHQgKi9cblx0c2NoZW1hOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBUaGUgaGVhZGVycyBhcmUgc3RvcmVkIGluIGEga2V5L3ZhbHVlIG9iamVjdC5cblx0ICogXG5cdCAqIEBleGFtcGxlIHsgXCJuYW1lXCI6IFwiPHRoPk5hbWU8L3RoPlwiLCBcImVtYWlsXCI6IFwiPHRoPkVtYWlsPC90aD5cIiB9XG5cdCAqL1xuXHRoZWFkZXJFbGVtZW50czogeyBbbmFtZTogc3RyaW5nXTogYW55OyB9ID0ge307XG5cdC8qKlxuXHQgKiBUaGUgaGVhZGVyIGluZGljaWVzIGFyZSBzdG9yZWQgaW4gYSBrZXkvdmFsdWUgb2JqZWN0LlxuXHQgKiBcblx0ICogQGV4YW1wbGUgY29uc29sZS5sb2cgKHRoaXMuaGVhZGVySW5kaWNpZXNbXCJuYW1lXCJdKTsgLy8gT3V0cHV0cyAwXG5cdCAqL1xuXHRoZWFkZXJJbmRpY2llczogbnVtYmVyW107XG5cdC8qKlxuXHQgKiBUaGUgcm93IGVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYW4gYXJyYXkgd2l0aCBrZXkvdmFsdWUgZmllbGRzIGFuZCBpdCdzIGF0dGFjaGVkIGh0bWwgZWxlbWVudC5cblx0ICogXG5cdCAqIEBleGFtcGxlXG5cdCAqIHtcblx0ICogICBcImZpZWxkc1wiOiBbXG5cdCAqICAgICAgIHtcblx0ICogICAgICAgICBcIm5hbWVcIjogXCJKb2huIFNtaXRoXCIsXG5cdCAqICAgICAgICAgXCJlbWFpbFwiOiBcImpvaG4uc21pdGhAdGVzdC5jb21cIlxuXHQgKiAgICAgICB9XG5cdCAqICAgICBdLFxuXHQgKiAgIFwiaHRtbFwiOiBcIjx0cj48dGQ+Sm9obiBTbWl0aDwvdGQ+PHRkPmpvaG4uc21pdGhAdGVzdC5jb208L3RkPjwvdHI+XCJcblx0ICogfVxuXHQgKi9cblx0cm93RWxlbWVudHM6IHsgZmllbGRzOiBhbnlbXTsgaHRtbDogc3RyaW5nOyB9W10gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoY29weTogSG90Q29tcG9uZW50IHwgSG90U3RhcSwgYXBpOiBIb3RBUEkpXG5cdHtcblx0XHRzdXBlciAoY29weSwgYXBpKTtcblxuXHRcdHRoaXMudGFnID0gXCJhZG1pbi10YWJsZVwiO1xuXHRcdHRoaXMudGl0bGUgPSBcIlwiO1xuXHRcdHRoaXMuc2NoZW1hID0gXCJcIjtcblx0XHR0aGlzLmhlYWRlckVsZW1lbnRzID0ge307XG5cdFx0dGhpcy5oZWFkZXJJbmRpY2llcyA9IFtdO1xuXHRcdHRoaXMucm93RWxlbWVudHMgPSBbXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSBoZWFkZXIgdG8gdGhlIHRhYmxlLlxuXHQgKi9cblx0YWRkSGVhZGVyICh0YWJsZUZpZWxkRWxlbWVudDogSFRNTEVsZW1lbnQpXG5cdHtcblx0XHRsZXQgaGVhZGVyID0gdGhpcy5odG1sRWxlbWVudHNbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUgKFwidGhlYWRcIilbMF07XG5cblx0XHQvLyBAdHMtaWdub3JlXG5cdFx0dGhpcy5oZWFkZXJJbmRpY2llcy5wdXNoICh0YWJsZUZpZWxkRWxlbWVudC5ob3RDb21wb25lbnQuZmllbGQpO1xuXHRcdGhlYWRlci5hcHBlbmRDaGlsZCAodGFibGVGaWVsZEVsZW1lbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhIGhlYWRlciB0byB0aGUgdGFibGUuXG5cdCAqL1xuXHRhZGRIZWFkZXJEYXRhT25seSAodGFibGVGaWVsZDogQWRtaW5UYWJsZUZpZWxkLCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpXG5cdHtcblx0XHR0aGlzLmhlYWRlckluZGljaWVzLnB1c2ggKHRhYmxlRmllbGQuZmllbGQpO1xuXHRcdHRoaXMuaGVhZGVyRWxlbWVudHNbdGFibGVGaWVsZC5maWVsZF0gPSBodG1sRWxlbWVudDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGQgYSByb3cgdG8gdGhlIHRhYmxlLlxuXHQgKiBcblx0ICogQHBhcmFtIHtBcnJheX0gZmllbGRzIEEgbGlzdCBvZiB2YWx1ZXMgdG8gYXBwZW5kLlxuXHQgKi9cblx0YWRkUm93IChmaWVsZHM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10pXG5cdHtcblx0XHRsZXQgdGJvZHkgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0Ym9keVwiKVswXTtcblx0XHRsZXQgcm93U3RyID0gXCI8dHI+XCI7XG5cblx0XHRmb3IgKGxldCBpSWR4ID0gMDsgaUlkeCA8IHRoaXMuaGVhZGVySW5kaWNpZXMubGVuZ3RoOyBpSWR4KyspXG5cdFx0e1xuXHRcdFx0bGV0IGtleSA9IHRoaXMuaGVhZGVySW5kaWNpZXNbaUlkeF07XG5cdFx0XHRsZXQgdmFsdWUgPSBmaWVsZHNba2V5XTtcblxuXHRcdFx0aWYgKHRoaXMuaGVhZGVyRWxlbWVudHNba2V5XSAhPSBudWxsKVxuXHRcdFx0XHRyb3dTdHIgKz0gYDx0ZD4ke3ZhbHVlfTwvdGQ+YDtcblx0XHR9XG5cblx0XHRyb3dTdHIgKz0gXCI8L3RyPlwiO1xuXG5cdFx0SG90U3RhcS5hZGRIdG1sICh0Ym9keSwgcm93U3RyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhciB0aGUgbGlzdCBvZiByb3dzLlxuXHQgKi9cblx0YXN5bmMgY2xlYXJSb3dzICgpXG5cdHtcblx0XHRsZXQgdGJvZHkgPSB0aGlzLmh0bWxFbGVtZW50c1sxXS5nZXRFbGVtZW50c0J5VGFnTmFtZSAoXCJ0Ym9keVwiKVswXTtcblxuXHRcdHRib2R5LmlubmVySFRNTCA9IFwiXCI7XG5cdH1cblxuXHQvKipcblx0ICogUmVmcmVzaCB0aGUgbGlzdC5cblx0ICovXG5cdGFzeW5jIHJlZnJlc2hMaXN0ICgpXG5cdHtcblx0XHRsZXQgbGlzdCA9IGF3YWl0IEhvdC5qc29uUmVxdWVzdCAoYCR7SG90LkRhdGEuYmFzZVVybH0vdjEvZGF0YS9saXN0YCwge1xuXHRcdFx0XHRzY2hlbWE6IHRoaXMuc2NoZW1hXG5cdFx0XHR9KTtcblxuXHRcdHRoaXMuY2xlYXJSb3dzICgpO1xuXG5cdFx0Zm9yIChsZXQgaUlkeCA9IDA7IGlJZHggPCBsaXN0Lmxlbmd0aDsgaUlkeCsrKVxuXHRcdHtcblx0XHRcdGxldCBmaWVsZHMgPSBsaXN0W2lJZHhdO1xuXG5cdFx0XHR0aGlzLmFkZFJvdyAoZmllbGRzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBsaXN0IG9mIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxuXHQgKi9cblx0Ly8gQHRzLWlnbm9yZVxuXHRhc3luYyBvblBvc3RQbGFjZSAocGFyZW50SHRtbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBodG1sRWxlbWVudDogSFRNTEVsZW1lbnQpOiBQcm9taXNlPEhUTUxFbGVtZW50PlxuXHR7XG5cdFx0c2V0VGltZW91dCAoYXN5bmMgKCkgPT5cblx0XHRcdHtcblx0XHRcdFx0YXdhaXQgdGhpcy5yZWZyZXNoTGlzdCAoKTtcblx0XHRcdH0sIDUwKTtcblx0fVxuXG5cdGFzeW5jIG91dHB1dCAoKVxuXHR7XG5cdFx0cmV0dXJuIChgXG5cdFx0PGRpdiBpZCA9IFwiJHt0aGlzLmh0bWxFbGVtZW50c1swXS5pZH1cIj5cblx0XHRcdDxoMj4ke3RoaXMudGl0bGV9PC9oMj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XG5cdFx0XHQ8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLXNtXCI+XG5cdFx0XHRcdDx0aGVhZCBob3QtcGxhY2UtaGVyZSA9IFwiaGVhZGVyXCI+XG5cdFx0XHRcdDwvdGhlYWQ+XG5cdFx0XHRcdDx0Ym9keSBob3QtcGxhY2UtaGVyZSA9IFwicmVzdWx0c1wiPlxuXHRcdFx0XHQ8L3Rib2R5PlxuXHRcdFx0PC90YWJsZT5cblx0XHRcdDwvZGl2PlxuXHRcdDwvZGl2PmApO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBIb3RTdGFxLCBIb3QsIEhvdEFQSSwgSG90Q29tcG9uZW50IH0gZnJvbSBcImhvdHN0YXFcIjtcblxuZXhwb3J0IGNsYXNzIEFkbWluVGV4dCBleHRlbmRzIEhvdENvbXBvbmVudFxue1xuXHQvKipcblx0ICogVGhlIGFzc29jaWF0ZWQgZGF0YWJhc2UgZmllbGQuXG5cdCAqL1xuXHRmaWVsZDogc3RyaW5nO1xuXG5cdGNvbnN0cnVjdG9yIChjb3B5OiBIb3RDb21wb25lbnQgfCBIb3RTdGFxLCBhcGk6IEhvdEFQSSlcblx0e1xuXHRcdHN1cGVyIChjb3B5LCBhcGkpO1xuXG5cdFx0dGhpcy50YWcgPSBcImFkbWluLXRleHRcIjtcblx0XHR0aGlzLmZpZWxkID0gXCJcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWN0cyB0aGUgcGxhY2VtZW50IG9mIHRoZSB0ZXh0IGVsZW1lbnRzIGZvciBtb2RhbHMuXG5cdCAqL1xuXHQvLyBAdHMtaWdub3JlXG5cdGFzeW5jIG9uUG9zdFBsYWNlIChwYXJlbnRIdG1sRWxlbWVudDogSFRNTEVsZW1lbnQsIGh0bWxFbGVtZW50OiBIVE1MRWxlbWVudCk6IFByb21pc2U8SFRNTEVsZW1lbnQ+XG5cdHtcblx0XHRsZXQgcGxhY2VIZXJlQXJyYXkgPSBwYXJlbnRIdG1sRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsIChgaG90LXBsYWNlLWhlcmVbdHlwZT1cIm1vZGFsXCJdYCk7XG5cblx0XHRpZiAocGxhY2VIZXJlQXJyYXkubGVuZ3RoID4gMClcblx0XHR7XG5cdFx0XHRsZXQgcGxhY2VIZXJlID0gcGxhY2VIZXJlQXJyYXlbMF07XG5cdFx0XHRwYXJlbnRIdG1sRWxlbWVudC5yZW1vdmVDaGlsZCAoaHRtbEVsZW1lbnQpO1xuXHRcdFx0cGxhY2VIZXJlLmFwcGVuZENoaWxkIChodG1sRWxlbWVudCk7XG5cblx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdHBhcmVudEh0bWxFbGVtZW50LmhvdENvbXBvbmVudC5maWVsZEVsZW1lbnRzW3RoaXMuZmllbGRdID0gaHRtbEVsZW1lbnQucXVlcnlTZWxlY3RvciAoXCJpbnB1dFwiKTtcblx0XHR9XG5cdH1cblxuXHRhc3luYyBvdXRwdXQgKClcblx0e1xuXHRcdHJldHVybiAoYDxkaXY+XG5cdFx0XHQ8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+JHt0aGlzLmlubmVyfTwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZSA9IFwidGV4dFwiIHZhbHVlID0gXCJcIiAvPlxuXHRcdDwvZGl2PmApO1xuXHR9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IEhvdFN0YXFXZWI7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcbiJdLCJuYW1lcyI6WyJBZG1pbkJ1dHRvbiIsIkFkbWluRGFzaGJvYXJkIiwiQWRtaW5FZGl0IiwiQWRtaW5UYWJsZSIsIkFkbWluVGFibGVGaWVsZCIsIkFkbWluVGFibGVSb3ciLCJBZG1pblRleHQiLCJidWlsZEFzc2V0cyIsImltcG9ydCIsIm5hbWUiLCJmaWxlcyIsImh0bWwiLCJjc3MiLCJqcyIsImNvbXBvbmVudExpYnJhcnkiLCJjb21wb25lbnRzIiwiSG90Q29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJjb3B5IiwiYXBpIiwic3VwZXIiLCJ0aGlzIiwidGFnIiwiYnV0dG9uQ2xpY2tlZCIsIm91dHB1dCIsImh0bWxFbGVtZW50cyIsImlkIiwidGl0bGUiLCJiYXNlIiwib25Qb3N0UGxhY2UiLCJwYXJlbnRIdG1sRWxlbWVudCIsImh0bWxFbGVtZW50IiwiSG90IiwiRGF0YSIsImJhc2VVcmwiLCJidXR0b25fdGl0bGUiLCJhdHRhY2hlZF9saXN0Iiwic2NoZW1hIiwiZmllbGRFbGVtZW50cyIsIm1vZGFsSWQiLCJvblNhdmUiLCJ2YWx1ZXMiLCJrZXkiLCJ2YWx1ZSIsImpzb25SZXF1ZXN0IiwiZmllbGRzIiwiYXR0YWNoZWRMaXN0IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImhvdENvbXBvbmVudCIsInJlZnJlc2hMaXN0IiwiJCIsIm1vZGFsIiwiRXJyb3IiLCJwYXJlbnRTZWxlY3RvciIsImZpZWxkIiwicGFyZW50Tm9kZSIsImFkZEhlYWRlckRhdGFPbmx5IiwiaW5uZXIiLCJwbGFjZUhlcmVQYXJlbnQiLCJyb3dFbGVtZW50cyIsInB1c2giLCJlbGVtZW50Iiwicm93SHRtbCIsImlJZHgiLCJsZW5ndGgiLCJmaWVsZE9iaiIsImhlYWRlckVsZW1lbnRzIiwiaGVhZGVySW5kaWNpZXMiLCJhZGRIZWFkZXIiLCJ0YWJsZUZpZWxkRWxlbWVudCIsImhlYWRlciIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiYXBwZW5kQ2hpbGQiLCJ0YWJsZUZpZWxkIiwiYWRkUm93IiwidGJvZHkiLCJyb3dTdHIiLCJIb3RTdGFxIiwiYWRkSHRtbCIsImNsZWFyUm93cyIsImlubmVySFRNTCIsImxpc3QiLCJzZXRUaW1lb3V0IiwicGxhY2VIZXJlQXJyYXkiLCJxdWVyeVNlbGVjdG9yQWxsIiwicGxhY2VIZXJlIiwicmVtb3ZlQ2hpbGQiLCJxdWVyeVNlbGVjdG9yIiwibW9kdWxlIiwiZXhwb3J0cyIsIkhvdFN0YXFXZWIiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwidW5kZWZpbmVkIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsImNhbGwiXSwic291cmNlUm9vdCI6IiJ9
@@ -0,0 +1,238 @@
1
+ if (typeof (AdminPanelWeb) === "undefined")
2
+ AdminPanelWeb = {};
3
+
4
+ var HotAPIGlobal = undefined;
5
+
6
+ if (typeof (HotAPI) !== "undefined")
7
+ HotAPIGlobal = HotAPI;
8
+
9
+ if (typeof (window) !== "undefined")
10
+ {
11
+ if (typeof (window.HotAPI) !== "undefined")
12
+ HotAPIGlobal = window.HotAPI;
13
+ }
14
+
15
+ /**
16
+ * Get the authorization header string.
17
+ */
18
+ function HotStaqGetAuthorizationHeaderString ()
19
+ {
20
+ const auth = null;
21
+
22
+ if (this.authorization != null)
23
+ {
24
+ if (this.authorization.toAuthorizationHeaderString != null)
25
+ auth = this.authorization.toAuthorizationHeaderString ();
26
+ }
27
+
28
+ if (auth == null)
29
+ {
30
+ if (Hot != null)
31
+ {
32
+ if (Hot.API != null)
33
+ {
34
+ if (Hot.API.authCredentials != null)
35
+ {
36
+ if (Hot.API.authCredentials.toAuthorizationHeaderString != null)
37
+ auth = Hot.API.authCredentials.toAuthorizationHeaderString ();
38
+ }
39
+ }
40
+ }
41
+ }
42
+
43
+ return (auth);
44
+ }
45
+
46
+ /**
47
+ * Process a JSON object, and get it ready to make a request.
48
+ */
49
+ function HotStaqProcessJSONObject (jsonObj)
50
+ {
51
+ if (jsonObj != null)
52
+ {
53
+ if (Hot != null)
54
+ {
55
+ if (Hot.API != null)
56
+ {
57
+ if (Hot.API.authCredentials != null)
58
+ {
59
+ for (let key in Hot.API.authCredentials)
60
+ {
61
+ if (jsonObj[key] == null)
62
+ jsonObj[key] = Hot.API.authCredentials[key];
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ return (jsonObj);
70
+ }
71
+
72
+ /**
73
+ * Make a request to the server.
74
+ */
75
+ function HotStaqPostJSONObject (methodType, url, jsonObj, auth)
76
+ {
77
+ let headers = {
78
+ "Accept": "application/json",
79
+ "Content-Type": "application/json"
80
+ };
81
+
82
+ if (auth != null)
83
+ headers["Authorization"] = auth;
84
+
85
+ let promise = fetch (url, {
86
+ "method": methodType,
87
+ "headers": headers,
88
+ body: JSON.stringify (jsonObj)
89
+ });
90
+
91
+ return (promise);
92
+ }
93
+
94
+ /**
95
+ * The data API route.
96
+ */
97
+ class data
98
+ {
99
+ constructor (baseUrl, connection, db)
100
+ {
101
+ if (baseUrl == null)
102
+ baseUrl = "http://127.0.0.1:3243";
103
+
104
+ if (connection === undefined)
105
+ connection = null;
106
+
107
+ if (db === undefined)
108
+ db = null;
109
+
110
+ /**
111
+ * The base url to make calls to.
112
+ */
113
+ this.baseUrl = baseUrl;
114
+ /**
115
+ * The connection to the server/client.
116
+ */
117
+ this.connection = connection;
118
+ /**
119
+ * The authorization used to connect to the server.
120
+ */
121
+ this.authorization = null;
122
+ /**
123
+ * The database connection, if any.
124
+ */
125
+ this.db = db;
126
+
127
+ if (connection != null)
128
+ {
129
+ if (connection.api != null)
130
+ {
131
+ if (connection.api.authCredentials != null)
132
+ this.authorization = connection.api.authCredentials;
133
+ }
134
+ }
135
+ }
136
+
137
+ /**
138
+ * The JSON object to send to the server.
139
+ *
140
+ * @typedef {Object} DATA_ADD_JSON_OBJECT_TYPE
141
+ * @property {string} schema The schema to add data to.
142
+ * @property {string} fields The fields and their values to add to the database. A key/value object must be passed. Example: { "name": "Test_User" }
143
+ */
144
+
145
+ /**
146
+ * The add method.
147
+ *
148
+ * @param {DATA_ADD_JSON_OBJECT_TYPE} jsonObj
149
+ *
150
+ * @returns {string} Returns true if successful.
151
+ */
152
+ add (jsonObj)
153
+ {
154
+ var promise = new Promise ((resolve, reject) =>
155
+ {
156
+ const url = `${this.baseUrl}/v1/data/add`;
157
+ const auth = null;
158
+
159
+ if (this.authorization != null)
160
+ {
161
+ if (this.authorization.toAuthorizationHeaderString != null)
162
+ auth = this.authorization.toAuthorizationHeaderString ();
163
+ }
164
+
165
+
166
+ jsonObj = HotStaqProcessJSONObject (jsonObj);
167
+ HotStaqPostJSONObject ("POST", url, jsonObj, auth).then (
168
+ function (response)
169
+ {
170
+ var result = response.json ();
171
+
172
+ resolve (result);
173
+ });
174
+ });
175
+
176
+ return (promise);
177
+ }
178
+
179
+ /**
180
+ * The JSON object to send to the server.
181
+ *
182
+ * @typedef {Object} DATA_LIST_JSON_OBJECT_TYPE
183
+ * @property {string} schema The schema to access.
184
+ * @property {array} fields The list of fields in the schema to access.
185
+ * @property {int} offset The offset.
186
+ * @property {int} limit The max number of results to return. Default is 20.
187
+ */
188
+
189
+ /**
190
+ * The list method.
191
+ *
192
+ * @param {DATA_LIST_JSON_OBJECT_TYPE} jsonObj
193
+ *
194
+ * @returns {string} Returns the results from the schema.
195
+ */
196
+ list (jsonObj)
197
+ {
198
+ var promise = new Promise ((resolve, reject) =>
199
+ {
200
+ const url = `${this.baseUrl}/v1/data/list`;
201
+ const auth = null;
202
+
203
+ if (this.authorization != null)
204
+ {
205
+ if (this.authorization.toAuthorizationHeaderString != null)
206
+ auth = this.authorization.toAuthorizationHeaderString ();
207
+ }
208
+
209
+
210
+ jsonObj = HotStaqProcessJSONObject (jsonObj);
211
+ HotStaqPostJSONObject ("POST", url, jsonObj, auth).then (
212
+ function (response)
213
+ {
214
+ var result = response.json ();
215
+
216
+ resolve (result);
217
+ });
218
+ });
219
+
220
+ return (promise);
221
+ }
222
+ }
223
+
224
+ if (typeof (AdminPanelWeb.AppAPI) === "undefined")
225
+ {
226
+ if (typeof (HotAPIGlobal) !== "undefined")
227
+ {
228
+ AdminPanelWeb.AppAPI = class extends HotAPIGlobal
229
+ {
230
+ constructor (baseUrl, connection, db)
231
+ {
232
+ super (baseUrl, connection, db);
233
+
234
+ this.data = new data (baseUrl, connection, db);
235
+ }
236
+ }
237
+ }
238
+ }
@@ -0,0 +1,39 @@
1
+ version: "3.8"
2
+ services:
3
+ # Used just to make sure the database has started before continuing.
4
+ init-app-database:
5
+ image: mariadb:10.10
6
+ depends_on:
7
+ app-database:
8
+ condition: service_healthy
9
+ environment:
10
+ MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
11
+ MYSQL_DATABASE: "${DATABASE_SCHEMA}"
12
+ MYSQL_USER: "${DATABASE_USERNAME}"
13
+ MYSQL_PASSWORD: "${DATABASE_PASSWORD}"
14
+ command:
15
+ - "exit 0"
16
+ networks:
17
+ - app-network
18
+
19
+ app-database:
20
+ image: mariadb:10.10
21
+ networks:
22
+ - app-network
23
+ healthcheck:
24
+ test: ["CMD", "mysqladmin" ,"ping", "-h", "127.0.0.1"]
25
+ retries: 10
26
+ timeout: 10s
27
+ ports:
28
+ - "${DATABASE_PORT}:3306"
29
+ environment:
30
+ MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}"
31
+ MYSQL_DATABASE: "${DATABASE_SCHEMA}"
32
+ MYSQL_USER: "${DATABASE_USERNAME}"
33
+ MYSQL_PASSWORD: "${DATABASE_PASSWORD}"
34
+
35
+ volumes:
36
+ app-database-volume:
37
+
38
+ networks:
39
+ app-network:
package/env-example CHANGED
@@ -1,4 +1,5 @@
1
1
  HTTP_PORT=3243
2
+ MYSQL_ROOT_PASSWORD=jlka7sw47aSD234
2
3
  DATABASE_SERVER=127.0.0.1
3
4
  DATABASE_PORT=3320
4
5
  DATABASE_USERNAME=5NKVBAt7OrzrumQyQVs
package/package.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@hotstaq/admin-panel",
3
3
  "description": "",
4
- "version": "0.2.2",
4
+ "version": "0.2.3",
5
5
  "main": "build/src/AppAPI.js",
6
6
  "scripts": {
7
7
  "start": "hotstaq --hotsite ./HotSite.json --env-file ./.env run --server-type web-api",
8
8
  "dev": "hotstaq --hotsite ./HotSite.json --development-mode run --server-type web-api --web-http-port 8080",
9
- "test": "hotstaq test",
9
+ "test": "hotstaq --dev --env-file .env run --server-type web-api",
10
10
  "build": "tsc --build ./tsconfig.json",
11
- "build-web": "webpack --mode=production",
12
- "build-web-debug": "webpack --mode=development",
11
+ "build-web": "hotstaq create --copy-libraries-to-location ./public/js/ app && hotstaq module build && webpack --mode=production && cp -f ./build-web/AdminPanelComponents.js ./public/js/AdminPanelComponents.js && hotstaq generate --copy-to ./public/js/",
12
+ "build-web-debug": "hotstaq create --copy-libraries-to-location ./public/js/ app && hotstaq module build && webpack --mode=development && cp -f ./build-web/AdminPanelComponents.js ./public/js/AdminPanelComponents.js && hotstaq generate --copy-to ./public/js/",
13
13
  "build-doc": "hotstaq generate --generate-type openapi-3.0.0-yaml",
14
- "prepublishOnly": "npm run build-doc && npm run build && npm run build-web"
14
+ "prepublishOnly": "npm run build && npm run build-web"
15
15
  },
16
16
  "keywords": [],
17
17
  "author": "FreeLight, Inc",
package/src/WebExport.ts CHANGED
@@ -16,8 +16,8 @@ async function buildAssets (): Promise<any>
16
16
  "@popperjs/core"],
17
17
  html: ["./assets/html/*.*"],
18
18
  css: ["./assets/css/*.*"],
19
- js: ["./assets/js/*.*", "./build-web/AdminPanel.js"],
20
- componentLibrary: "AdminPanelWeb",
19
+ js: ["./assets/js/*.*", "./build-web/AdminPanelComponents.js"],
20
+ componentLibrary: "AdminPanelComponentsWeb",
21
21
  components: [
22
22
  AdminButton,
23
23
  AdminDashboard,
package/src/cli.ts ADDED
@@ -0,0 +1,7 @@
1
+ import { HotCLI } from "hotstaq";
2
+
3
+ let cli: HotCLI = new HotCLI ();
4
+ cli.setup (process.argv).then (async () =>
5
+ {
6
+ await cli.start ();
7
+ });
@@ -9,9 +9,9 @@ export class AdminButton extends HotComponent
9
9
  this.tag = "admin-button";
10
10
  }
11
11
 
12
- async buttonClicked ()
13
- {
14
- }
12
+ async buttonClicked ()
13
+ {
14
+ }
15
15
 
16
16
  async output ()
17
17
  {
@@ -23,13 +23,12 @@ export class AdminDashboard extends HotComponent
23
23
  /**
24
24
  * Add this table field to the table
25
25
  */
26
+ // @ts-ignore
26
27
  async onPostPlace (parentHtmlElement: HTMLElement, htmlElement: HTMLElement): Promise<HTMLElement>
27
28
  {
28
29
  // Set the base API url to use for this dashboard.
29
30
  if (this.base != "")
30
31
  Hot.Data.baseUrl = this.base;
31
-
32
- return (htmlElement);
33
32
  }
34
33
 
35
34
  async output (): Promise<string>
@@ -3,7 +3,7 @@ import { HotStaq, Hot, HotAPI, HotComponent } from "hotstaq";
3
3
  export class AdminEdit extends HotComponent
4
4
  {
5
5
  /**
6
- * The title of this dashboard.
6
+ * The title of this edit modal.
7
7
  */
8
8
  title: string;
9
9
  /**
@@ -102,7 +102,8 @@ export class AdminEdit extends HotComponent
102
102
  parentSelector: "body"
103
103
  },
104
104
  {
105
- html:`<button type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal" onclick = "$('#${this.modalId}').modal ('show');">Add</button>`,
105
+ html: `<button id = "${this.modalId}-add-btn" type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal" data-bs-target="#${this.modalId}">Add</button>`,
106
+ //`<button id = "${this.modalId}-add-btn" type="button" class="btn btn-sm btn-outline-secondary" data-bs-toggle="modal" onclick = "$('#${this.modalId}').modal ('show');">Add</button>`,
106
107
  parentSelector: `hot-place-here[name="buttons"]`
107
108
  }]);
108
109
  }
@@ -18,14 +18,14 @@ export class AdminTableField extends HotComponent
18
18
  /**
19
19
  * Add this table field to the table
20
20
  */
21
+ // @ts-ignore
21
22
  async onPostPlace (parentHtmlElement: HTMLElement, htmlElement: HTMLElement): Promise<HTMLElement>
22
23
  {
23
24
  // @ts-ignore
24
25
  let hotComponent = parentHtmlElement.parentNode.parentNode.parentNode.hotComponent;
25
26
 
26
- hotComponent.addHeaderDataOnly (this, htmlElement);
27
-
28
- return (htmlElement);
27
+ if (hotComponent != null)
28
+ hotComponent.addHeaderDataOnly (this, htmlElement);
29
29
  }
30
30
 
31
31
  async output ()
@@ -3,7 +3,9 @@ import { HotStaq, Hot, HotAPI, HotComponent } from "hotstaq";
3
3
  export class AdminTableRow extends HotComponent
4
4
  {
5
5
  /**
6
- * The table row fields.
6
+ * The fields are stored in a key/value object.
7
+ *
8
+ * @example { "name": "John Smith", "email": "john.smith@email.com" }
7
9
  */
8
10
  fields: any[];
9
11
 
@@ -12,23 +14,17 @@ export class AdminTableRow extends HotComponent
12
14
  super (copy, api);
13
15
 
14
16
  this.tag = "admin-table-row";
15
- /**
16
- * The fields are stored in a key/value object.
17
- *
18
- * @example { "name": "John Smith", "email": "john.smith@email.com" }
19
- */
20
17
  this.fields = [];
21
18
  }
22
19
 
23
20
  /**
24
21
  * Add this table row to the table
25
22
  */
23
+ // @ts-ignore
26
24
  async onPostPlace (parentHtmlElement: HTMLElement, htmlElement: HTMLElement): Promise<HTMLElement>
27
25
  {
28
26
  // @ts-ignore
29
27
  parentHtmlElement.parentNode.parentNode.parentNode.hotComponent.rowElements.push ({ fields: this.fields, element: htmlElement});
30
-
31
- return (htmlElement);
32
28
  }
33
29
 
34
30
  async output ()
@@ -128,14 +128,13 @@ export class AdminTable extends HotComponent
128
128
  /**
129
129
  * Get the list of data from the server.
130
130
  */
131
+ // @ts-ignore
131
132
  async onPostPlace (parentHtmlElement: HTMLElement, htmlElement: HTMLElement): Promise<HTMLElement>
132
133
  {
133
134
  setTimeout (async () =>
134
135
  {
135
136
  await this.refreshList ();
136
137
  }, 50);
137
-
138
- return (htmlElement);
139
138
  }
140
139
 
141
140
  async output ()
@@ -18,7 +18,8 @@ export class AdminText extends HotComponent
18
18
  /**
19
19
  * Corrects the placement of the text elements for modals.
20
20
  */
21
- async onParentPlace (parentHtmlElement: HTMLElement, htmlElement: HTMLElement): Promise<void>
21
+ // @ts-ignore
22
+ async onPostPlace (parentHtmlElement: HTMLElement, htmlElement: HTMLElement): Promise<HTMLElement>
22
23
  {
23
24
  let placeHereArray = parentHtmlElement.querySelectorAll (`hot-place-here[type="modal"]`);
24
25
 
package/start.sh ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ if [ ! -f "./.env" ]; then
4
+ echo "Missing .env file! Did you copy env-skeleton to .env?"
5
+
6
+ exit 1
7
+ fi
8
+
9
+ docker-compose --env-file ./.env up -d
package/stop.sh ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ if [ ! -f "./.env" ]; then
4
+ echo "Missing .env file! Did you copy env-skeleton to .env?"
5
+
6
+ exit 1
7
+ fi
8
+
9
+ docker-compose --env-file ./.env down
@@ -77,9 +77,9 @@ module.exports = {
77
77
  "node:zlib": "{}"
78
78
  },
79
79
  output: {
80
- filename: "AdminPanel.js",
80
+ filename: "AdminPanelComponents.js",
81
81
  path: ppath.resolve (process.cwd (), "build-web"),
82
- library: "AdminPanelWeb",
82
+ library: "AdminPanelComponentsWeb",
83
83
  libraryTarget: "var"
84
84
  }
85
85
  };