@gregoriusrippenstein/node-red-contrib-introspection 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,6 +17,17 @@ Sometimes I found myself having extremely complex flows, flows that went over mu
17
17
  For an introduction to these nodes, check out the [introduction screencasts](https://blog.openmindmap.org/blog/introspection).
18
18
 
19
19
 
20
+ ## Sidebar Update for Node-RED Version 5
21
+
22
+ As Node-RED v5 introduces better sidebar management, there are now four separate sidebars definded by this package:
23
+
24
+ - **Introspection Capture** for generating SVG images from flows
25
+ - **Introspection MsgTrace** for message tracing
26
+ - **Introspection Obfuscation** for export flows as obfuscated blobs
27
+ - **Introspection Lint** for analysing flows
28
+
29
+ Node-RED version 4 still just as one sidebar with three tabs.
30
+
20
31
  ## Sidebar Nodes
21
32
 
22
33
  There is no need nor requirement to deploy these nodes. Which implies that they also work in read-only mode of Node-RED. Since these nodes only provide information and make no changes, this should not be an issue.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gregoriusrippenstein/node-red-contrib-introspection",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "dependencies": {
5
5
  "got": "^13",
6
6
  "uglify-js": "^3.17.4",
@@ -18,8 +18,45 @@
18
18
 
19
19
  function transformInjectToChangeNode(t){t&&t.preventDefault();t=[...(RED.view.selection().nodes||[]).filter(e=>"inject"==e.type),...(RED.view.selection().nodes||[]).filter(e=>"group"==e.type).map(e=>e.nodes.filter(e=>"inject"==e.type))].flat();if(0==(t=RED.nodes.createExportableNodeSet(t)).length)RED.notify("No inject nodes found in node selection",{type:"warning"});else{let e=t.map(o=>{var e={id:RED.nodes.id(),type:"change",name:o.name,action:"",property:"",from:"",to:"",reg:!1,x:0,y:0,wires:[[]]};return e.rules=o.props.map(e=>{var t={t:"set",p:e.p,pt:"msg",to:e.v,tot:e.vt};return"payload"==e.p?(t.to=o.payload,t.tot=o.payloadType):"topic"==e.p&&(t.to=o.topic),t}),e});setTimeout(()=>{RED.clipboard.import(),setTimeout(()=>{$("#red-ui-clipboard-dialog-import-text").val(JSON.stringify(e)).trigger("paste")},300)},400)}}
20
20
 
21
- // Add your plugin as a new tabsheet in the right sidebar AFTER the flow editor is completely started
22
- var setupSidebarForIntrospection = () => {
21
+ // used to feature deactivate stuff
22
+ let isNodeRedFive = () => {
23
+ return RED.settings.version.split(".")[0] == "5"
24
+ }
25
+
26
+ let sidebarInitNRv5 = () => {
27
+ [
28
+ ["MsgTrace", "fa-eyedropper"],
29
+ ["Obfuscation", "fa-user-secret"],
30
+ ["Lint", "fa-magic"],
31
+ ["Capture", "fa-camera"],
32
+ ].forEach((d) => {
33
+ RED.sidebar.addTab({
34
+ id: `Introspection${d[0]}`,
35
+ label: `intro-${d[0]}`, // short name for the tab
36
+ name: `Introspection ${d[0]}`, // long name for the menu
37
+ content: $($(`script[type="text/x-red"][data-template-name="ScreenshotSidebar${d[0]}"]`).i18n().html()),
38
+ closeable: true,
39
+ enableOnEdit: true,
40
+ iconClass: `fa ${d[1]}`,
41
+ onchange: () => {
42
+ setTimeout(() => { RED.events.emit(`introspection:onchange-${d[0].toLowerCase() }`) }, 150)
43
+ }
44
+ });
45
+ })
46
+
47
+ RED.events.on("sidebar:resize", (d) => {
48
+ let containerHeight = $('#node-input-msgtracer-trace-treelist').parents('.red-ui-sidebar-content').height()
49
+ $('#node-input-msgtracer-trace-treelist').parent().css("height", `calc(${containerHeight}px - 20vh)`)
50
+
51
+ containerHeight = $('#node-input-orphan-target-container-div').parents('.red-ui-sidebar-content').height()
52
+ $('#node-input-orphan-target-container-div').parent().css('height', `calc(${containerHeight}px - 13vh)`)
53
+
54
+ containerHeight = $('#node-input-screenshot-svgcontainer').parents('.red-ui-sidebar-content').height()
55
+ $('#node-input-screenshot-svgcontainer').parent().css('height', `calc(${containerHeight}px - 20vh)`)
56
+ })
57
+ }
58
+
59
+ let sidebarInitNRv4 = () => {
23
60
  // The html content of the sidebar has been specified below as a data-template, from where it can be loaded:
24
61
  var content = $($('script[type="text/x-red"][data-template-name="Screenshot"]').i18n().html());
25
62
 
@@ -63,9 +100,22 @@
63
100
  label: 'Obfuscation'
64
101
  });
65
102
 
66
- // used to feature deactivate stuff
67
- let isNodeRedFive = () => {
68
- return RED.settings.version.split(".")[0] == "5"
103
+ RED.panels.create({
104
+ id: 'func-introspection-tab-lint',
105
+ resize: (topSze,botSze) => {
106
+ $('#node-input-msgtracer-trace-treelist').parent().css("height", `calc(${botSze}px - 13vh)`)
107
+ $('#node-input-orphan-target-container-div').parent().css('height', `calc(${topSze}px - 15vh)`)
108
+ }
109
+ })
110
+ }
111
+
112
+ // Add your plugin as a new tabsheet in the right sidebar AFTER the flow editor is completely started
113
+ var setupSidebarForIntrospection = () => {
114
+
115
+ if (isNodeRedFive()) {
116
+ sidebarInitNRv5()
117
+ } else {
118
+ sidebarInitNRv4()
69
119
  }
70
120
 
71
121
  let callObfuscatieCurrentFlow = (copy_or_import) => {
@@ -204,7 +254,6 @@
204
254
  };
205
255
  },
206
256
  });
207
-
208
257
  })
209
258
 
210
259
  // handle the download button under the editor window.
@@ -318,15 +367,7 @@
318
367
  if ( e ) { e.preventDefault() }
319
368
  setupTreeListForNodeStats()
320
369
  })
321
-
322
- RED.panels.create({
323
- id: 'func-introspection-tab-lint',
324
- resize: (topSze,botSze) => {
325
- $('#node-input-msgtracer-trace-treelist').parent().css("height", `calc(${botSze}px - 13vh)`)
326
- $('#node-input-orphan-target-container-div').parent().css('height', `calc(${topSze}px - 15vh)`)
327
- }
328
- })
329
-
370
+
330
371
  // RED.debug isn't yet available
331
372
  let fillInSiderBarForm = () => {
332
373
  RED.events.off('flows:loaded', fillInSiderBarForm);
@@ -347,12 +388,13 @@
347
388
 
348
389
  <style>
349
390
  .col-100 .red-ui-typedInput-container {
350
- width: 70% !important;
391
+ width: 70% !important;
351
392
  }
352
393
 
353
394
  .col-100.no-label .red-ui-typedInput-container {
354
- width: 100% !important;
395
+ width: 100% !important;
355
396
  }
397
+
356
398
  .w-30 {
357
399
  width: 40% !important;
358
400
  margin-left: 10px;
@@ -737,4 +779,341 @@
737
779
  </div>
738
780
  </div>
739
781
  </div>
782
+ </script>
783
+
784
+ <script type="text/x-red" data-template-name="ScreenshotSidebarObfuscation">
785
+ <div style="position: relative; height: 100%; overflow-y: auto;">
786
+ <!-- Obfuscation Tab in Sidebar -->
787
+
788
+ <div id="func-introspection-tab-obfuscation">
789
+
790
+ <div class="form-row" style="margin-top: 10px">
791
+ <label for="node-input-obfuscate-name" class="w-30">
792
+ <i class="fa fa-tag"></i>
793
+ <span>Obfuscate Name?</span>
794
+ </label>
795
+ <input type="checkbox" id="node-input-obfuscate-name"
796
+ style="display:inline-block; width:15px; vertical-align:baseline;">
797
+ </div>
798
+
799
+ <div class="form-row">
800
+ <label for="node-input-obfuscate-position" class="w-30">
801
+ <i class="fa fa-map-pin"></i>
802
+ <span>Obfuscate Position?</span>
803
+ </label>
804
+ <input type="checkbox" id="node-input-obfuscate-position"
805
+ style="display:inline-block; width:15px; vertical-align:baseline;">
806
+ </div>
807
+
808
+ <div class="form-row">
809
+ <label for="node-input-obfuscate-shrink-size" class="w-30">
810
+ <i class="fa fa-angle-down"></i>
811
+ <span>Shrink Nodes?</span>
812
+ </label>
813
+ <input type="checkbox" id="node-input-obfuscate-shrink-size"
814
+ style="display:inline-block; width:15px; vertical-align:baseline;">
815
+ </div>
816
+
817
+ <div class="form-row">
818
+ <label for="node-input-obfuscate-javascript" class="w-30">
819
+ <i class="fa fa-code"></i>
820
+ <span>Obfuscate Javascript?</span>
821
+ </label>
822
+ <input type="checkbox" id="node-input-obfuscate-javascript"
823
+ style="display:inline-block; width:15px; vertical-align:baseline;">
824
+ </div>
825
+
826
+ <div class="form-row col-100">
827
+ <label for="node-input-obfuscate-remove-icons" class="w-30">
828
+ <i class="fa fa-adjust"></i>
829
+ <span>Remove Icon?</span>
830
+ </label>
831
+ <input type="checkbox" id="node-input-obfuscate-remove-icons"
832
+ style="display:inline-block; width:15px; vertical-align:baseline;">
833
+ </div>
834
+
835
+ <div class="form-row">
836
+ <label for="node-input-obfuscate-info" class="w-30">
837
+ <i class="fa fa-info"></i>
838
+ <span>Remove Info?</span>
839
+ </label>
840
+ <input type="checkbox" id="node-input-obfuscate-info"
841
+ style="display:inline-block; width:15px; vertical-align:baseline;">
842
+ </div>
843
+
844
+ <div class="form-row">
845
+ <label for="node-input-obfuscate-remove-groups" class="w-30">
846
+ <i class="fa fa-object-group"></i>
847
+ <span>Remove Groups?</span>
848
+ </label>
849
+ <input type="checkbox" id="node-input-obfuscate-remove-groups"
850
+ style="display:inline-block; width:15px; vertical-align:baseline;">
851
+ </div>
852
+
853
+ <div class="form-row">
854
+ <label for="node-input-obfuscate-remove-debugs" class="w-30">
855
+ <i class="fa fa-bug"></i>
856
+ <span>Remove comment & debugs?</span>
857
+ </label>
858
+ <input type="checkbox" id="node-input-obfuscate-remove-debugs"
859
+ style="display:inline-block; width:15px; vertical-align:baseline;">
860
+ </div>
861
+
862
+ <div class="form-row">
863
+ <label for="node-input-obfuscate-remove-junctions" class="w-30">
864
+ <i class="fa fa-sitemap"></i>
865
+ <span>Coalesce Junctions?</span>
866
+ </label>
867
+ <input type="checkbox" id="node-input-obfuscate-remove-junctions"
868
+ style="display:inline-block; width:15px; vertical-align:baseline;">
869
+ </div>
870
+
871
+ <div class="form-row">
872
+ <label for="node-input-obfuscate-remove-linkcall-nodes" class="w-30">
873
+ <i class="fa fa-unlink"></i>
874
+ <span>Coalesce Link Call Nodes?</span>
875
+ </label>
876
+ <input type="checkbox" id="node-input-obfuscate-remove-linkcall-nodes" style="display:inline-block; width:15px; vertical-align:baseline;">
877
+ </div>
878
+
879
+ <div class="form-row">
880
+ <label for="node-input-obfuscate-remove-linknodes" class="w-30">
881
+ <i class="fa fa-unlink"></i>
882
+ <span>Coalesce Link Out Nodes?</span>
883
+ </label>
884
+ <input type="checkbox" id="node-input-obfuscate-remove-linknodes"
885
+ style="display:inline-block; width:15px; vertical-align:baseline;">
886
+ </div>
887
+
888
+ <div id="node-input-obfuscate-coalesce-link-out-options" style="display: none;">
889
+ <div class="form-row">
890
+ <label for="node-input-obfuscate-copy-linkin-nodes" class="ml-30" style="width: 150px;">
891
+ <span>Copy Link-In Nodes?</span>
892
+ </label>
893
+ <input type="checkbox" id="node-input-obfuscate-copy-linkin-nodes" style="display:inline-block; width:15px; vertical-align:baseline;">
894
+ </div>
895
+ <div class="form-row">
896
+ <label for="node-input-obfuscate-ignore-off-flow-links" class="ml-30" style="width: 150px;">
897
+ <span>Ignore off-flow links?</span>
898
+ </label>
899
+ <input type="checkbox" id="node-input-obfuscate-ignore-off-flow-links" style="display:inline-block; width:15px; vertical-align:baseline;">
900
+ </div>
901
+ </div>
902
+
903
+ <div class="form-row">
904
+ <label class='w-30'>
905
+ <i class="fa fa-refresh"></i>
906
+ <span>Replace Nodes:</span>
907
+ </label>
908
+ </div>
909
+
910
+ <div class="form-row">
911
+ <label for="node-input-obfuscate-replace-switch" class="ml-30">
912
+ <span>Switch</span>
913
+ </label>
914
+ <input type="checkbox" id="node-input-obfuscate-replace-switch"
915
+ style="display:inline-block; width:15px; vertical-align:baseline;">
916
+ </div>
917
+
918
+ <div class="form-row">
919
+ <label for="node-input-obfuscate-replace-change" class="ml-30">
920
+ <span>Change</span>
921
+ </label>
922
+ <input type="checkbox" id="node-input-obfuscate-replace-change"
923
+ style="display:inline-block; width:15px; vertical-align:baseline;">
924
+ </div>
925
+
926
+ <div class="form-row">
927
+ <label for="node-input-obfuscate-add-license-text" class="w-30">
928
+ <i class="fa fa-gavel"></i>
929
+ <span>Replace info with license?</span>
930
+ </label>
931
+ <input type="checkbox" id="node-input-obfuscate-add-license-text" style="display:inline-block; width:15px; vertical-align:baseline;">
932
+ </div>
933
+
934
+ <div id="node-input-obfuscate-add-license-text-row" style="display: none;">
935
+ <div class="form-row ml-30">
936
+ <label for="node-input-obfuscate-append-license-text" style="width: 150px">
937
+ <span>Append to info?</span>
938
+ </label>
939
+ <input type="checkbox" id="node-input-obfuscate-append-license-text" style="display:inline-block; width:15px; vertical-align:baseline;">
940
+ </div>
941
+ <div class="form-row ml-30">
942
+ <textarea id="node-input-obfuscate-license-text" placeholder="License Text"></textarea>
943
+ </div>
944
+ </div>
945
+
946
+ <div class="form-row">
947
+ <div class="col-100">
948
+ <div class="form-row node-input-target-row" style="margin-left: 10px; margin-top: 30px">
949
+ <button id="node-input-obfuscation-generate-btn"
950
+ class="red-ui-button"><i class="fa fa-download"></i> Obfuscate and Import</button>
951
+ <button id="node-input-obfuscation-generate-and-copy-btn"
952
+ class="red-ui-button"><i class="fa fa-copy"></i> Obfuscate and Copy</button>
953
+ </div>
954
+ </div>
955
+ </div>
956
+
957
+ <div class="form-row" style="margin-left: 10px">
958
+ <b>Warning</b>: No guarantee is made that the obfuscated flow works as the original. This functionality
959
+ has not been thoroughly tested. Ensure correctness by completely testing the resultant obfuscated flow.
960
+ No warranty of success is neither provided, nor implied nor expressed.
961
+ </div>
962
+ </div>
963
+ </div>
964
+ </script>
965
+
966
+ <script type="text/x-red" data-template-name="ScreenshotSidebarMsgTrace">
967
+ <div style="position: relative; height: 100%; overflow-y: auto;">
968
+ <div id="func-introspection-tab-msgtrace">
969
+ <!-- message tracing stuff -->
970
+ <div class="form-row" style="margin-left: 10px; margin-top: 10px">
971
+ <label for="node-input-msgtracer-clamp-mode" class="w-25">
972
+ <i class="fa fa-bolt"></i>
973
+ <span>Clamp Mode?</span>
974
+ </label>
975
+ <input type="checkbox" id="node-input-msgtracer-clamp-mode"
976
+ style="display:inline-block; width:15px; vertical-align:baseline;">
977
+
978
+ <label for="node-input-msgtracer-clamp-mode-with-debug" class="w-25">
979
+ <i class="fa fa-bug"></i>
980
+ <span>With Debug?</span>
981
+ </label>
982
+ <input type="checkbox" id="node-input-msgtracer-clamp-mode-with-debug"
983
+ style="display:inline-block; width:15px; vertical-align:baseline;">
984
+
985
+ <label id="node-input-msgtracer-clamp-mode-status" style="display: none;" class="w-25">
986
+ <i class="fa fa-check"></i> <span>On</span>
987
+ </label>
988
+ </div>
989
+
990
+ <div class="form-row" style="margin-left: 10px; margin-top: 40px">
991
+ <label for="node-input-msgtracer-toggle" class="w-25">
992
+ <i class="fa fa-stethoscope"></i>
993
+ <span>Trace selected nodes?</span>
994
+ </label>
995
+ <input type="checkbox" id="node-input-msgtracer-toggle"
996
+ style="display:inline-block; width:15px; vertical-align:baseline;">
997
+
998
+ <label for="node-input-msgtracer-toggle-all" class="w-25">
999
+ <i class="fa fa-warning"></i>
1000
+ <span>All nodes?</span>
1001
+ </label>
1002
+ <input type="checkbox" id="node-input-msgtracer-toggle-all"
1003
+ style="display:inline-block; width:15px; vertical-align:baseline;">
1004
+
1005
+ <button id="node-input-msgtrace-clear-trace-btn" style="margin-left: 10px;"
1006
+ class="red-ui-button">Clear Trace</button>
1007
+ </div>
1008
+
1009
+ <div class="form-row"
1010
+ style="margin-left: 10px; position: relative; min-height: 5vh; height: 20vh; margin-right: 15px;">
1011
+ <div style="margin-bottom: 5px; width: 35%; padding-left: 60%;">
1012
+ <input type="text" id="node-input-msgtracer-trace-treelist-filter" style="display: none;">
1013
+ </div>
1014
+ <div id="node-input-msgtracer-trace-treelist"></div>
1015
+ </div>
1016
+
1017
+ <div class="form-row" style="margin-left: 10px; margin-top: 40px;">
1018
+ <label for="node-input-msgtracer-msgtodebug" class="w-25">
1019
+ <i class="fa fa-bug"></i>
1020
+ <span>Msgs from selected nodes to Debug?</span>
1021
+ </label>
1022
+ <input type="checkbox" id="node-input-msgtracer-msgtodebug"
1023
+ style="display:inline-block; width:15px; vertical-align:baseline;">
1024
+
1025
+ <label for="node-input-msgtracer-msgtodebug-all" class="w-25">
1026
+ <i class="fa fa-warning"></i>
1027
+ <span>All nodes?</span>
1028
+ </label>
1029
+ <input type="checkbox" id="node-input-msgtracer-msgtodebug-all"
1030
+ style="display:inline-block; width:15px; vertical-align:baseline;">
1031
+
1032
+ <button id="node-input-msgtrace-clear-debug-btn" style="margin-left: 10px;"
1033
+ class="red-ui-button">Clear Debug</button>
1034
+ <button id="node-input-msgtrace-pause-debug-btn" style="margin-left: 10px;"
1035
+ class="red-ui-button">Pause Debug</button>
1036
+ </div>
1037
+ </div>
1038
+ </div>
1039
+ </script>
1040
+
1041
+ <script type="text/x-red" data-template-name="ScreenshotSidebarLint">
1042
+ <div style="position: relative; height: 100%; overflow-y: auto;">
1043
+ <!-- Lint Tab in Sidebar -->
1044
+
1045
+ <div id="func-introspection-tab-lint">
1046
+ <div class="form-row" style="margin-left: 10px; margin-top: 10px">
1047
+ <button id="node-input-orphan-find-btn"
1048
+ class="red-ui-button"><i class="fa fa-life-ring"></i> Unconnected</button>
1049
+ <button id="node-input-documentation-find-btn"
1050
+ class="red-ui-button"><i class="fa fa-cc"></i> Undocumented</button>
1051
+ <button id="node-input-linkin-nodes-find-btn"
1052
+ class="red-ui-button"><i class="fa fa-link"></i> Link Ins</button>
1053
+ <button id="node-input-linkcalls-find-btn"
1054
+ class="red-ui-button"><i class="fa fa-link"></i> Link Calls</button>
1055
+ <button id="node-input-orphan-clear-workspace-btn"
1056
+ class="red-ui-button">Clear dots</button>
1057
+ <button id="node-input-transform-inject-to-change-btn"
1058
+ class="red-ui-button"><i class='icon-button' style="background-image: url('icons/@gregoriusrippenstein/node-red-contrib-introspection/swap-inject-to-change.svg');"></i><span class='icon-button-text'>Inj-&gt;Chg</span></button>
1059
+ <button id="node-input-statistics-btn"
1060
+ class="red-ui-button"><i class="fa fa-pie-chart"></i> Stats</button>
1061
+ <button id="node-input-highlight-debug-nodes-btn"
1062
+ class="red-ui-button"><i class="fa fa-bug"></i> Highlight Debug Msg</button>
1063
+ </div>
1064
+
1065
+ <div class="form-row"
1066
+ style="margin-left: 10px; position: relative; min-height: 5vh; height: 20vh; margin-right: 15px;">
1067
+ <div style="margin-bottom: 5px; width: 35%; padding-left: 60%;">
1068
+ <input type="text" id="node-input-orphan-target-filter" style="display: none;">
1069
+ </div>
1070
+ <div id="node-input-orphan-target-container-div"></div>
1071
+ </div>
1072
+ </div>
1073
+ </div>
1074
+ </script>
1075
+
1076
+ <script type="text/x-red" data-template-name="ScreenshotSidebarCapture">
1077
+ <div style="position: relative; height: 100%; overflow-y: auto;">
1078
+ <!-- Screenshot Tab in Sidebar -->
1079
+
1080
+ <div id="func-introspection-tab-screenshot">
1081
+ <div class="form-row">
1082
+ <div class="col-100">
1083
+
1084
+ <div class="form-row" style="margin-left: 10px; margin-top: 10px;">
1085
+ <button type="button" id="node-screenshot-capture-btn"
1086
+ class="red-ui-button red-ui-button-large"><i class="fa fa-camera"></i> Capture</button>
1087
+ </div>
1088
+
1089
+ <div class="form-row" style="margin-left: 10px;">
1090
+ <label for="node-input-screenshot-remove-classes-and-ids" style="width: 200px">
1091
+ <span>Remove Classes and Ids?</span>
1092
+ </label>
1093
+ <input type="checkbox" checked="checked" id="node-input-screenshot-remove-classes-and-ids"
1094
+ style="display:inline-block; width:15px; vertical-align:baseline;">
1095
+ </div>
1096
+
1097
+ <div class="form-row"
1098
+ style="min-height: 300px; height: 65vh; overflow: hidden; margin-left: 10px; margin-right: 15px; border: 1px rgb(196, 196, 196) solid; border-radius: 5px;">
1099
+ <div id="node-input-screenshot-svgcontainer"></div>
1100
+ </div>
1101
+
1102
+ <div class="form-row" style="margin-left: 10px; margin-top: 30px;">
1103
+ <button type="button" id="node-screenshot-download-svg"
1104
+ class="red-ui-button red-ui-button-large"><i class="fa fa-download"></i> Download</button>
1105
+ <button type="button" id="node-screenshot-copy-to-clipboard-svg"
1106
+ class="red-ui-button red-ui-button-large"><i class="fa fa-clipboard"></i> Copy to Clipboard</button>
1107
+ </div>
1108
+
1109
+ <div class="form-row" style="margin-left: 10px; margin-top: 30px;">
1110
+ <input type="text" id="node-input-svgpost-endpoint" placeholder="/screenshot" style="width: 40% !important;">
1111
+ <button type="button" id="node-screenshot-post-svg-to-endpoint"
1112
+ class="red-ui-button red-ui-button-large"><i class="fa fa-send-o"></i> Post to Endpoint</button>
1113
+ </div>
1114
+
1115
+ </div>
1116
+ </div>
1117
+ </div>
1118
+ </div>
740
1119
  </script>