UNPKG

@opcua/for-node-red

Version:

The Node-RED node to communicate via OPC UA, powered NodeOPCUA and developed by Sterfive's team

667 lines (561 loc) 91.9 kB
<style> .sterfive-combo-box{position:relative;width:100%}.sterfive-online-menu{height:auto;position:fixed;width:auto}.sterfive-input-error{border-color:var(--red-ui-form-input-border-error-color);border-style:solid;border-width:1px}.sterfive-typedInput-options{background:#fff;border-style:solid;border-width:1px;border:1px solid var(--red-ui-primary-border-color);box-sizing:border-box;max-height:350px;overflow-y:auto;position:absolute;white-space:nowrap;z-index:2000}.sterfive-typedInput-options a{align-items:center;border-bottom:1px solid;border-color:var(--red-ui-secondary-border-color);border-style:solid;border-width:1px;color:var(--red-ui-form-text-color);display:flex;font-size:13px;padding:6px 18px 6px 6px;text-decoration:none}.sterfive-typedInput-options a:hover{background:var(--red-ui-workspace-button-background-hover);text-decoration:none}.sterfive-typedInput-options a:focus{outline:none}.sterfive-typedInput-options a:active,.sterfive-typedInput-options a:focus{background:var(--red-ui-workspace-button-background-active);text-decoration:none}.sterfive-typedInput-options a input[type=checkbox]{margin:0 6px 0 0}.sterfive-typedInput-options .sterfive-typedInput-icon{margin-right:6px}.sterfive-typedInput-options .sterfive-typedInput-icon:not(.fa){background-color:var(--red-ui-primary-text-color);height:14px;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:cover;mask-size:cover;width:12px}.sterfive-combo-box .sterfive-dropdown{background-color:#fff;border:1px solid #ccc;display:none;left:0;max-height:400px;overflow-y:auto;position:absolute;top:100%;width:100%;z-index:1000}.sterfive-combo-box li:before{content:none}.sterfive-tree li.expandable:before,.sterfive-tree li.no-expandable:before{content:"\f0da";cursor:pointer;font-family:FontAwesome,sans-serif;font-size:12pt;font-weight:900;margin-right:5px}.sterfive-tree li.no-expandable:before{opacity:0}.sterfive-tree li.expanded:before{content:"\f0d7";cursor:pointer;font-family:FontAwesome,sans-serif;font-size:12pt;font-weight:900;margin-right:5px}.sterfive-tree li span.selected{border:.5px dotted #33f}.sterfive-tree .fa{color:#333;margin-right:10px}.sterfive-tree ul{list-style:none;padding-inline-start:2%}.sterfive-tree li{cursor:pointer;padding:5px}.sterfive-tree{list-style-type:none}.sterfive-tree,.sterfive-tree ol,.sterfive-tree ul{list-style-type:none;margin:0;padding:0}.sterfive-tree li:hover{background-color:#eee}.sterfive-tree li.loading:before{animation:fa-spin 1s linear infinite;content:"\f110";cursor:pointer;font-family:FontAwesome,sans-serif;font-weight:900;margin-right:5px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.sterfive-tree .spinner{animation:spin .7s linear infinite;border:2px solid transparent;border-radius:50%;border-top-color:#666;display:inline-block;height:16px;width:16px}.sterfive-info{background-color:#fafad2;border-radius:10px;border-style:groove;display:block;font-size:10pt;margin:5px 0;padding:5px}.sterfive-info .ok{color:green}.sterfive-info .warning{color:darkred}.input-wrapper{border:0 solid #ccc;border-radius:5px;padding:0}.sterfive-input-group{border:1px solid #ccc;border-radius:5px;display:flex;overflow:hidden}.sterfive-input-group button,.sterfive-input-group input{border:none;outline:none;padding:10px}.sterfive-input-group input{flex:1}.sterfive-input-group button{background-color:var(--red-ui-form-button-background);color:#7b7a7a;cursor:pointer}.sterfive-input-group button:hover{background-color:var(--red-ui-secondary-background-hover)}.sterfive-info-text{color:#777;font-size:12px;margin-left:10px;margin-top:5px}.custom-checkbox{cursor:pointer;display:inline-block;font-family:FontAwesome,sans-serif;font-size:16px;font-weight:900;margin-right:10px;text-align:center;width:1em}.custom-checkbox.unchecked:before{content:"\f096"}.custom-checkbox.checked:before{content:"\f046"}.validate-cancel-buttons{background-color:#fff;position:sticky;right:0;top:0;z-index:1001}.cancel-button,.validate-button{cursor:pointer;font-size:16px;margin:5px}.sterfive-combo-box .sterfive-dropdown{position:relative}.floating-buttons{position:fixed;z-index:1003} /*# sourceMappingURL=OpcUa-Client2-HistoryRead.css.map */ </style> <!-- HTML CONTENTS --> <script type="text/x-red" data-template-name="OpcUa-Client2-HistoryRead"> <style> .my-checkbox-label { width: fit-content; cursor: pointer; user-select: none; } .my-checkbox-input { visibility: hidden; } .my-checkbox-mark { margin-left: 0px; font-family: "FontAwesome", sans-serif; font-size: 24px; } .my-checkbox-input:checked ~ .my-checkbox-mark::before { content: "\f205"; /* fa-toggle-on */ } .my-checkbox-input:not(:checked) ~ .my-checkbox-mark::before { content: "\f204"; /* fa-toggle-off */ } </style> <h3> Opc-UA HistoryRead <a href="https://opcua-for-node-red.doc.sterfive.com/docs/read/read-general-concept" target="_blank" aria-label="Help" ><i class="fa fa-message-question"></i ></a> </h3> <div class="form-row"> <label for="node-input-name"><i class="icon-tasks"></i>Name</label> <input type="text" id="node-input-name" placeholder="enter the friendly name of the node" /> </div> <div class="form-row"> <label for="node-input-endpoint"><i class="icon-tasks"></i> Endpoint</label> <input type="text" id="node-input-endpoint" placeholder="opc.tcp://localhost:4334" /> </div> <div class="form-row"> <label for="select-history-type">History Type</label> <select type="text" id="select-history-type" style="width: 72%"> <option selected value="raw">Raw</option> <option value="modified">Raw-Modified</option> <option value="processed-details">Processed Details</option> <option value="event">Event</option> <option value="at-time">At Time</option> <option value="annotation-data">Annotation Data</option> </select> </div> <div id="section-raw"> <fieldset> <legend>Read Raw</legend> </fieldset> <div class="form-row"> <label for="node-input-raw-startTime"> <i class="fa fa-hourglass-start"></i> <span>Start Time</span> </label> <input type="datetime" id="node-input-raw-startTime" placeholder="" /> </div> <div class="form-row"> <label for="node-input-raw-endTime"> <i class="fa fa-hourglass-end"></i> <span>End Time</span> </label> <input type="datetime" id="node-input-raw-endTime" placeholder="" /> </div> <div class="form-row"> <label for="node-input-raw-numValuesPerNode" style="width: auto; margin-right: 10px"> <i class="fa fa-hashtag"></i> <span>Number of values per node</span> </label> <input type="number" min="0" id="node-input-raw-numValuesPerNode" placeholder="" style="width: 100px" /> </div> <div class="form-row" style="display: flex; align-items: center; width: 250px"> <i class="fa fa-arrows-h"></i> &nbsp;<span>returns bounds</span> <label for="node-input-returnBounds" style="margin-left: auto; display: flex; align-items: center"> <input type="checkbox" checked class="my-checkbox-input" id="node-input-returnBounds" /> <span class="my-checkbox-mark"></span> </label> </div> </div> <div id="section-modified"> <fieldset> <legend>Read Raw Modified</legend> </fieldset> <div class="form-row"> <label for="node-input-modified-startTime"> <i class="fa fa-hourglass-start"></i> <span>Start Time</span> </label> <input type="datetime" id="node-input-modified-startTime" placeholder="" /> </div> <div class="form-row"> <label for="node-input-modified-endTime"> <i class="fa fa-hourglass-end"></i> <span>End Time</span> </label> <input type="datetime" id="node-input-modified-endTime" placeholder="" /> </div> <div class="form-row"> <label for="node-input-modified-numValuesPerNode" style="width: auto; margin-right: 10px"> <i class="fa fa-hashtag"></i> <span>Number of values per node</span> </label> <input type="number" min="0" id="node-input-modified-numValuesPerNode" placeholder="" style="width: 100px" /> </div> <div class="form-row" style="display: flex; align-items: center; width: 250px"> <i class="fa fa-arrows-h"></i> &nbsp;<span>returns bounds</span> <label for="node-input-modified-returnBounds" style="margin-left: auto; display: flex; align-items: center"> <input type="checkbox" checked class="my-checkbox-input" id="node-input-modified-returnBounds" /> <span class="my-checkbox-mark"></span> </label> </div> </div> <div id="section-processed-details"> <fieldset> <legend>Read Processed Details</legend> </fieldset> <div class="form-row"> <label for="node-input-processed-details-startTime"> <i class="fa fa-hourglass-start"></i> <span>Start Time</span> </label> <input type="datetime" id="node-input-processed-details-startTime" placeholder="2 minutes ago" /> </div> <div class="form-row"> <label for="node-input-processed-details-endTime"> <i class="fa fa-hourglass-end"></i> <span>End Time</span> </label> <input type="datetime" id="node-input-processed-details-endTime" placeholder="1 minute ago" /> </div> <div class="form-row"> <label for="node-input-processed-details-processingInterval" style="width: 200px"> <i class="fa fa-arrows-h"></i> <span>Processing Interval</span> </label> <input type="type" id="node-input-processed-details-processingInterval" placeholder="2 seconds" style="width: 100px" /> </div> <div class="form-row"> <label for="node-input-processed-details-aggregateType">Aggregate Type</label> <select type="text" id="node-input-processed-details-aggregateType" style="width: 72%"> <option selected value="Interpolated">Interpolative</option> <option value="Count">Count</option> <option value="Average">Average</option> <option value="Delta">Delta</option> <option value="DeltaBounds">Delta Bounds</option> <option value="DurationBad">Duration Bad</option> <option value="DurationGood">Duration Good</option> <option value="Maximum">Maximum</option> <option value="Maximum2">Maximum2</option> <option value="Minimum">Minimum</option> <option value="Minimum2">Minimum2</option> <option value="Minimum2">Percent Bad</option> <option value="Minimum2">Percent Good</option> <option value="Range">Range</option> <option value="StandardDeviationPopulation">Standard Deviation Population</option> <option value="Total2">Total2</option> <option value="Total">Total</option> <option value="VariancePopulation">Variance Population</option> <option value="VarianceSample">Variance Sample</option> <option value="WorstQuality">Worst Quality</option> <option value="WorstQuality2">Worst Quality2</option> </select> </div> <!-- aggregateConfiguration { useServerCapabilitiesDefaults: boolean; treatUncertainAsBad: boolean; percentDataBad: number /*Byte*/; percentDataGood: number /* Byte*/; useSlopedExtrapolation: boolean; } --> <div class="form-row" style="display: flex; align-items: center; width: 250px"> <i class="fa fa-hdd-o"></i> &nbsp;<span>use server capabilities</span> <label for="node-input-processed-details-aggregateConfiguration-useServerCapabilitiesDefaults" style="display: flex; align-items: left; width: auto" > <input type="checkbox" checked class="my-checkbox-input" id="node-input-processed-details-aggregateConfiguration-useServerCapabilitiesDefaults" style="margin-left: auto; display: flex; align-items: center" /> <span class="my-checkbox-mark"></span> </label> </div> <div class="form-row" style="display: flex; align-items: center; width: 250px"> <i class="fa fa-play"></i> &nbsp;<span>treat uncertain as Bad</span> <label for="node-input-processed-details-aggregateConfiguration-treatUncertainAsBad" style="display: flex; align-items: left; width: auto" > <input type="checkbox" checked class="my-checkbox-input" id="node-input-processed-details-aggregateConfiguration-treatUncertainAsBad" style="margin-left: auto; display: flex; align-items: center" /> <span class="my-checkbox-mark"></span> </label> </div> <div class="form-row"> <label for="node-input-processed-details-aggregateConfiguration-percentDataBad" style="width: 150px"> <span>Percent data Bad </span> </label> <input type="number" min="0" max="100" id="node-input-processed-details-aggregateConfiguration-percentDataBad" placeholder="" style="width: 100px" /> </div> <div class="form-row"> <label for="node-input-processed-details-aggregateConfiguration-percentDataGood" style="width: 150px"> <span>Percent data Good</span> </label> <input type="number" min="0" max="100" id="node-input-processed-details-aggregateConfiguration-percentDataGood" placeholder="" style="width: 100px" /> </div> <div class="form-row" class="form-row" style="display: flex; align-items: center; width: 250px"> <i class="fa fa-up"></i> <span style="width: auto">Use sloped extrapolation</span> <label for="node-input-processed-details-aggregateConfiguration-useSlopedExtrapolation" style="margin-left: auto; display: flex; align-items: center" > <input type="checkbox" class="my-checkbox-input" id="node-input-processed-details-aggregateConfiguration-useSlopedExtrapolation" placeholder="" /> <span class="my-checkbox-mark"></span> </label> </div> </div> <div id="section-event"> <fieldset> <legend>Event</legend> <p>Contact Sterfive.com to get this implemented</p> </fieldset> </div> <div id="section-at-time"> <fieldset> <legend>At Time</legend> <p>Contact Sterfive.com to get this implemented</p> </fieldset> </div> <div id="section-annotation-data"> <fieldset> <legend>At Time</legend> <p>Contact Sterfive.com to get this implemented</p> </fieldset> </div> <!-- COMMON STUFF --> <fieldset> <legend>Node</legend> <div class="form-row"> <label for="node-input-attributeId">AttributeId</label> <select type="text" id="node-input-attributeId" style="width: 72%"> <option selected value="Value">Value</option> <option value="DataType">DataType</option> <option value="BrowseName">BrowseName</option> <option value="DisplayName">DisplayName</option> <option value="All">All</option> </select> </div> <div class="form-row"> <label for="node-input-nodeId" style="width: 100%"><i class="fa fa-tag"></i>NodeId</label> <input type="text" id="node-input-nodeId" placeholder="ns=2;s=Variable1 or empty" /> </div> <div class="form-row"> <label for="node-input-outputType">Output type</label> <select type="text" id="node-input-outputType" style="width: 72%"> <option selected value="TimeValue">Time+Value</option> <option value="TimeVariant">Time+Variant</option> <option value="DataValue">DataValue</option> <option value="DataValueReversible">DataValueReversible</option> <option value="StatusCode">StatusCode</option> </select> </div> </fieldset> </script> <!-- MARKDOWN CONTENTS --> <script type="text/markdown" data-help-name="OpcUa-Client2-HistoryRead"> # OPC UA History Read Node Reads historical data from OPC UA server variables. This node supports multiple history read types including raw data, modified data, and aggregated (processed) data retrieval. ## Configuration ### Node Properties - **Name**: Optional friendly name for the node - **Endpoint**: OPC UA server endpoint configuration (required) - **History Type**: Type of historical data to retrieve - **NodeId**: The target variable node identifier (optional - can be provided via message) - **Output Type**: Format of the output data ### History Types Based on the selected history type, the node will retrieve different kinds of historical data: #### Raw Data Retrieves raw historical values stored in the server's history database. **Configuration:** - **Start Time**: Beginning of time range (datetime or relative string ) for instance "2024-01-15T10:30:00Z" or "1 hour ago" - **End Time**: End of time range (datetime or relative string like "now") - **Number of Values**: Maximum values to return per node (default: 100) - **Return Bounds**: Include bounding values outside the time range #### Raw Modified Retrieves raw historical values that have been modified or updated. **Configuration:** - Same as Raw Data with additional tracking of value modifications #### Processed Details Retrieves aggregated historical data using server-side processing functions. **Configuration:** - **Start Time**: Beginning of aggregation period - **End Time**: End of aggregation period - **Processing Interval**: Time interval for aggregation (e.g., "1 minute", "30 seconds") - **Aggregate Type**: Type of aggregation function to apply ### Aggregate Types For processed details, the following aggregate functions are supported: - **Average** - Mean value over the interval - **Count** - Number of data points - **Delta** - Change between first and last values - **DeltaBounds** - Change including boundary values - **DurationBad** - Time duration with bad quality - **DurationGood** - Time duration with good quality - **Interpolative** - Interpolated value at interval boundaries - **Maximum** - Highest value in interval - **Minimum** - Lowest value in interval - **PercentBad** - Percentage of bad quality data - **PercentGood** - Percentage of good quality data - **Range** - Difference between max and min values - **StandardDeviationPopulation** - Population standard deviation - **StandardDeviationSample** - Sample standard deviation - **Total** - Sum of all values - **VariancePopulation** - Population variance - **VarianceSample** - Sample variance - **WorstQuality** - Worst quality value in interval ## NodeId and Topic The target variable can be specified in two ways: - **NodeId**: The NodeId of the variable to read (e.g., `ns=2;s=Temperature`) or it can be specified via the `msg.nodeId` or the `msg.topic` property: - **Topic**: An alternative way to specify the NodeId using the `msg.topic` property (e.g., `msg.topic = "ns=2;s=Temperature"`) Priority order for NodeId resolution: 1. `msg.nodeId` (if defined) 2. `msg.topic` (if defined) 3. `msg.payload` (if defined) 4. NodeId configured in the node properties Note: ensure that the injected message does not contain conflicting NodeId information in `msg.nodeId` or `msg.topic` or `msg.payload` if you want to use the NodeId configured in the node properties. ## Output Types - **Time+Value** - Timestamp and value only - **Time+Variant** - Timestamp and full variant information - **DataValue** - Complete OPC UA DataValue structure - **StatusCode** - Status codes only - **DataValueReversible** - DataValue with reversible encoding ## Input Message Formats ### Basic History Read ```javascript msg = { nodeId: "ns=2;s=Temperature", // Target variable (optional if configured) topic: "ns=2;s=Temperature", // Alternative way to specify nodeId startTime: "1 hour ago", // Start time (optional) endTime: "now", // End time (optional) numValuesPerNode: 50, // Max values to return (optional) returnBounds: true, // Include boundary values (optional) processingInterval: "5 minutes", // For processed data (optional) outputType: "TimeValue", // Output format (optional) }; ``` ### Time Specifications Time values can be specified as: **Absolute Times:** - ISO 8601 strings: `"2024-01-15T10:30:00Z"` - Date objects: `new Date()` **Relative Times:** - `"now"` - Current time - `"1 hour ago"` - One hour before current time - `"2 days ago"` - Two days before current time - `"30 minutes ago"` - Thirty minutes before current time - `"1 week ago"` - One week before current time **Duration Formats:** - `"1 second"`, `"2 seconds"` - `"1 minute"`, `"5 minutes"` - `"1 hour"`, `"3 hours"` - `"1 day"`, `"7 days"` - `"1 week"`, `"2 weeks"` ## Output Message Format ### Raw/Modified Data Response ```javascript { // Original input properties nodeId: "ns=2;s=Temperature", startTime: "2024-01-15T09:00:00Z", endTime: "2024-01-15T10:00:00Z", // Historical data array payload: [ { value: 23.5, // The historical value statusCode: "Good", // Quality of the data point sourceTimestamp: "2024-01-15T09:15:00Z" // When value was recorded }, { value: 24.1, statusCode: "Good", sourceTimestamp: "2024-01-15T09:30:00Z" } // ... more historical values ] } ``` ### Processed Data Response ```javascript { // Original input properties nodeId: "ns=2;s=Temperature", startTime: "2024-01-15T09:00:00Z", endTime: "2024-01-15T10:00:00Z", // Aggregated data array payload: [ { value: 23.8, // Average temperature statusCode: "Good", sourceTimestamp: "2024-01-15T09:05:00Z" // Interval start time }, { value: 24.2, // Next interval average statusCode: "Good", sourceTimestamp: "2024-01-15T09:10:00Z" } // ... more aggregated intervals ] } ``` ### Output Type Variations **TimeValue Format:** ```javascript payload: [{ value: 23.5, sourceTimestamp: "2024-01-15T09:15:00Z" }]; ``` **TimeVariant Format:** ```javascript payload: [ { value: { dataType: "Double", value: 23.5 }, sourceTimestamp: "2024-01-15T09:15:00Z", }, ]; ``` **DataValue Format:** ```javascript payload: [ { value: { dataType: "Double", value: 23.5 }, statusCode: "Good", sourceTimestamp: "2024-01-15T09:15:00Z", serverTimestamp: "2024-01-15T09:15:01Z", }, ]; ``` ## Usage Examples ### Read Last Hour of Raw Data ```javascript msg.nodeId = "ns=2;s=ProcessValue"; msg.startTime = "1 hour ago"; msg.endTime = "now"; msg.numValuesPerNode = 100; return msg; ``` ### Read Daily Averages for Last Week ```javascript msg.nodeId = "ns=2;s=Temperature"; msg.startTime = "1 week ago"; msg.endTime = "now"; msg.processingInterval = "1 day"; // Configure node for "processed-details" with "Average" aggregate return msg; ``` ### Read Data for Specific Time Range ```javascript msg.nodeId = "ns=2;s=Pressure"; msg.startTime = "2024-01-15T08:00:00Z"; msg.endTime = "2024-01-15T16:00:00Z"; msg.numValuesPerNode = 1000; msg.returnBounds = true; return msg; ``` ### Read Modified Values Only ```javascript msg.nodeId = "ns=2;s=ControlVariable"; msg.startTime = "24 hours ago"; msg.endTime = "now"; // Configure node for "modified" history type return msg; ``` ### Read 5-Minute Maximums ```javascript msg.nodeId = "ns=2;s=FlowRate"; msg.startTime = "2 hours ago"; msg.endTime = "now"; msg.processingInterval = "5 minutes"; // Configure node for "processed-details" with "Maximum" aggregate return msg; ``` ## Error Handling ### Common Status Codes - **Good** - Data retrieved successfully - **BadHistoryOperationUnsupported** - Server doesn't support history - **BadNodeIdUnknown** - Variable not found - **BadHistoryOperationInvalid** - Invalid history operation parameters - **BadTimestampsToReturnInvalid** - Invalid timestamp specification - **BadMaxAgeInvalid** - Invalid time range specified ### Error Response When history read fails: ```javascript { nodeId: "ns=2;s=BadVariable", payload: [], // Empty array statusCode: "BadNodeIdUnknown", // Error status message: "Node not found" // Error description } ``` ## Performance Considerations 1. **Time Range**: Limit time ranges to avoid excessive data retrieval 2. **Value Limits**: Use `numValuesPerNode` to control response size 3. **Processing Intervals**: Choose appropriate intervals for aggregated data 4. **Server Capabilities**: Verify server supports required history features ## Best Practices 1. **Time Specification**: Use relative times for dynamic queries 2. **Data Validation**: Always check status codes in responses 3. **Chunking**: Break large time ranges into smaller chunks 4. **Caching**: Consider caching historical data for repeated queries 5. **Server Load**: Avoid frequent large history requests 6. **Error Handling**: Implement proper error handling for failed requests ## Node Status Indicators - **Blue dot**: History read operation in progress - **Green dot**: History data retrieved successfully - **Red dot**: History read operation failed - **Yellow dot**: Partial data retrieved (some quality issues) </script> <!-- END OF CONTENTS --> <script type="text/javascript"> function _0x51a9(_0x49eeb2,_0x31d096){_0x49eeb2=_0x49eeb2-0x1ba;const _0x574a80=_0x574a();let _0x51a96e=_0x574a80[_0x49eeb2];return _0x51a96e;}function _0x574a(){const _0x34811b=['><i\x20class=\x22fa\x20','Invalid','#select-history-type','wrap','fa-text-width','warn','licenceInfo','attr','value','setMode','15px','1.6','replaceWith','$verifyBtn','removeEventListener','indexOf','</span><ul></ul></li>','width=1200,height=800','blur(10px)','onboarded','14px','center','animate','HasChild','statusCode','.licence-expiry-banner','span','OpcUa-Endpoint2','selectedMenuItem','application/json','</li>','checked','Unspecified','main-wrapper','remove','hide','180px','fa-object-group','data','bp_indexed','Could\x20not\x20find\x20dialog\x20content\x20to\x20show\x20licence\x20banner','$input','buttonCss','stopPropagation','4206hEGGOY','8393DsQsiG','height','Aliased\x20NodeId','background-color\x200.2s','NodeClass','pageX','20px','ns=0;i=47','keyCode','preventDefault','$inputGroup','addClass','<button\x20type=\x22button\x22\x20tabindex=\x220\x22></button>','1469784BCoBvb','SteelBlue','fa-question','icon','0.0.0','empty','/config','Value\x20is\x20not\x20verified','$info','_hideMenu','Forward','Upgrade','replace','Variable','ns=0;i=46','space-between','click','#node-input-returnBounds','all\x200.2s','verify','#node-input-processed-details-aggregateConfiguration-percentDataGood','sterfive-info','throw','<i\x20class=\x22fa\x20fa-tag\x22/>1\x20&nbsp;\x20','BrowsePath','licence-continue-button','browsePath','100%','pageY','ns=0;i=34','<span\x20class=\x22red-ui-typedInput-type-label\x22></span>','hasClass','#1976D2','5px','expanded','loading','Good','status','startTime','grey','_initMenu','fa-sliders','returnBounds','slideUp','slideDown','436831TMAVha','../../icons/opcuanodeLogo.png','<strong>✅\x20Registration\x20complete</strong>\x20—\x20','tabindex','fetched','typeDefinition','#dc3545','treatUncertainAsBad','EXPIRED','opacity\x200.2s','mouseenter','buttonText','#section-','#c82333','\x22\x20style=\x22color:','RED.settings[\x22','push','isTypeRef','this\x20node\x20will\x20not\x20process\x20messages\x20until\x20you\x20','_blank','View','join','aggregateType','15px\x2030px','Renew\x20Now','sterfive-typedInput-options\x20sterfive-online-menu','endpointNode','Your\x20trial\x20period\x20has\x20ended.\x20To\x20continue\x20using\x20this\x20node,\x20please\x20purchase\x20a\x20professional\x20license\x20or\x20contact\x20our\x20support\x20team\x20for\x20assistance.','rgb(','VariableType','ReferenceType','#e9ecef','#fff3cd','mouseleave','#f44336','css','pointer-events','fa-cog','150px','#ccc','options','785IAIhZJ','bp_aliased','#495057','Register\x20now','SandyBrown','ObjectType','url','open','1px\x20solid\x20#f5c6cb','references','rgba(61,\x2060,\x204,\x200.525)','show','#section-at-time','<iframe></iframe>','licence-expiry-banner','<i\x20class=\x22fa\x20fa-tag\x22/><i\x20class=\x22fa\x20fa-fighter-jet\x22/>&nbsp;','currentParent','now','message','.spinner','>&nbsp;\x20','<span\x20title=',':focus','24px','<li\x20key=\x22','3544316TjWVFw','#f57c00','node\x20class:\x20','sort','2px\x20solid\x20#ffc107','#node-input-processed-details-aggregateConfiguration-percentDataBad','aliased\x20NodeId:\x20','13px','red-ui-typedInput-icon','statusText','isSelectable','TRIAL','CadetBlue','reference','label','li[key=\x22','1px\x20solid\x20#ced4da','Inverse','historyReadParam','already\x20fetched','style=\x22color:#1565C0;\x20text-decoration:underline;\x20font-weight:bold\x22>','prev','title','bannerClass','<a\x20href=\x22','<p>','2px\x20solid\x20#ff9800','mode','before','$combo','</span>','<button\x20title=\x22open\x20OPCUA\x20AddressSpace\x20Browser\x22><i\x20class=\x22fa\x20fa-sitemap\x22></i></button>','Objects','msg','HasSubtype','callback','<div/>','#663c00','keydown','&times;','<i\x20class=\x22fa\x20fa-envelope-open-o\x22/>','sterfive-dropdown','selected','target',';\x22></i>\x20','fa-folder','nodeId','1m\x20ago','modified','#node-input-modified-startTime','closest','column','Your\x20trial\x20license\x20expires\x20in\x20<strong>','#d4edda','_showTypeMenu','<i\x20class=\x22fa\x20fa-id-card\x22/>&nbsp;\x20','#node-input-modified-endTime','requestedNodeId','#node-input-processed-details-processingInterval','573EHjMMp','error','#node-input-processed-details-startTime','OPCUA\x20Client\x20HistoryRead','<input\x20type=\x22checkbox\x22>','startsWith','expandable\x20expanded','mousedown.red-ui-typedInput-focus-block','\x22\x20target=\x22_blank\x22\x20','DarkOrange','ns=0;i=35','FREEWARE','endTime','_showMenu','7448vlczHg','pointer','176KiesrA','aggregateConfiguration','numValuesPerNode','<i\x20class=\x22red-ui-typedInput-icon\x20fa\x20fa-caret-down\x22></i>','endpoint','assign','function','#f8d7da','useServerCapabilitiesDefaults','ns=0;i=45','.tree-text:first','find','failure','#node-input-processed-details-endTime','relative','getTime','$selectTrigger','\x20day','TypeDefinition','nodeIds','<button\x20title=\x22verify\x20nodeId\x20or\x20browsePath\x22><i\x20class=\x22fa\x20fa-refresh\x22></i></button>','Object','$dropdown','docs/','IsForward','#node-input-modified-returnBounds','#721c24','<img>','500px','body','Get\x20Support\x20&\x20Activate\x20License','dblclick','first','then','none','4921530ZcqkDn','nsu','position','percentDataGood','Get\x20a\x20license\x20now',');\x20-webkit-mask-image:\x20url(','permanent','$tree','toggleClass','val','opts','#node-input-raw-startTime','fetching\x20failed\x20with\x20error','nodeId:\x20','multiple','msg.','toString','blur(20px)','$toggleTreeBtn','string',':visible','nsuNodeID','#ff9800','#node-input-processed-details-aggregateConfiguration-useSlopedExtrapolation','trigger','<i>','#155724','BrowseName','already\x20loading','fa-list-alt','log','<span>','</strong>.\x20','<ul\x20class=\x22sterfive-tree\x22></ul>','<div\x20class=\x22spinner\x22></div>','#section-annotation-data','next','off','1px\x20solid\x20rgba(255,\x20255,\x20255,\x200.3)','50px','scrollTop','mousedown','<button>','removeClass','reset','POST','white','raw','done','history-read','<div\x20class=\x22sterfive-info-text\x22></div>','backgroundColor','12px','$selectLabel','i=61','SeaGreen','buttonHoverCss','settings','Your\x20<strong>Professional\x20License</strong>\x20has\x20expired.\x20Please\x20renew\x20your\x20license\x20to\x20ensure\x20continued\x20access\x20to\x20support\x20and\x20updates.','Unknown\x20Product','11m\x20ago','json','nodes','true','nodeId_aliased','\x22}><span\x20class=\x22tree-text\x22\x20title=','$uiSelect','widget','change','licence-freemium-banner','focus','SuppressedError','text','00000000-0000-0000-0000-000000000000','referenceTypeId','#section-event','HasTypeDefinition','sterfive-input-error','mousedown.red-ui-typedInput-close-property-select','Value','rgba(','bold','supportUrl','bannerCss','opcUaEndpoint2Config','Method','Both','appendTo','displayName','$menu','sterfive_opcua_nodered_doc','prepend','flex','ns=0;i=85','toggle','observe','background-color:transparent;overflow:hidden;border:3px','\x22]\x20is\x20not\x20set,\x20using\x20default\x20API\x20namespace.\x20Available\x20keys:\x20','aliasedBrowsePath','expandable','16px','#999','background-color','#555','DataType','__parentNode','opcua','red-ui-typedInput-focus','stringify','nodeClass','0\x2020px\x2050px\x20rgba(0,0,0,0.25)','#2196F3','27tFOtIZ','!!failure!!','Could\x20not\x20find\x20dialog\x20content\x20to\x20show\x20licence\x20overlay','catch','licence-prof-expired-banner','Aliased\x20Browse\x20Path','length','/browse','/licenceInfo','40px','disconnect','5px\x2010px','<strong>⚠️\x20Registration\x20required</strong>\x20—\x20','right','elements','ns=0;i=40','prependTo','<div>','append','call','<li><i\x20class=\x22fa\x20fa-error\x22\x20style=\x22color:red;\x22></i>no\x20reference\x20!<ul></ul></li>','8px','disarmClick','10px','nodeId_nsu','name','2px\x20solid\x20#28a745','expiryDate','inputs','resolveParentNode','suppressed','3966WTOfKD','browseResult','after','auto','processed-details','type','node','#node-input-raw-numValuesPerNode','aliasedNodeId','button','underline','transparent','forEach','read-history','fadeOut','filter','#node-input-processed-details-aggregateConfiguration-useServerCapabilitiesDefaults','match','<h2>','HasComponent','left','#node-input-processed-details-aggregateType','browseName','prop','6px\x2012px','NodeId\x20with\x20namespace\x20Urn','node_label_italic','/support-frame.html','red-ui-typedInput-icon\x20','top','html','offset','blur','namespaceAliases','children','.red-ui-tray-content','#node-input-modified-numValuesPerNode','#333','.onboarding-required-banner','opacity','Trial\x20License\x20Expired','#856404','nodeBrowser','DodgerBlue','messageCss','has-node-help-widget','apply','#node-input-raw-endTime'];_0x574a=function(){return _0x34811b;};return _0x574a();}(function(_0x425d04,_0x5dcdc3){const _0x2be759=_0x51a9,_0x199800=_0x425d04();while(!![]){try{const _0x23363f=-parseInt(_0x2be759(0x2f0))/0x1+parseInt(_0x2be759(0x259))/0x2*(-parseInt(_0x2be759(0x36d))/0x3)+parseInt(_0x2be759(0x332))/0x4+-parseInt(_0x2be759(0x319))/0x5*(-parseInt(_0x2be759(0x2b5))/0x6)+parseInt(_0x2be759(0x2b6))/0x7*(parseInt(_0x2be759(0x37b))/0x8)+-parseInt(_0x2be759(0x23a))/0x9*(-parseInt(_0x2be759(0x1ca))/0xa)+parseInt(_0x2be759(0x37d))/0xb*(-parseInt(_0x2be759(0x2c3))/0xc);if(_0x23363f===_0x5dcdc3)break;else _0x199800['push'](_0x199800['shift']());}catch(_0x7c3aba){_0x199800['push'](_0x199800['shift']());}}}(_0x574a,0xc6a00),(function(){'use strict';const _0x1e04d4=_0x51a9;function _0x36e1a0(_0x4d4b03){const _0x2ff8de=_0x51a9;!_0x4d4b03[_0x2ff8de(0x372)]('/')&&(_0x4d4b03='/'+_0x4d4b03);const _0x3f192f=_0x2ff8de(0x21e);let _0x3455db=RED['settings'][_0x3f192f];if(!_0x3455db){const _0x3d2844=Object['keys'](RED[_0x2ff8de(0x203)])[_0x2ff8de(0x335)]()[_0x2ff8de(0x305)](',\x20');console[_0x2ff8de(0x28e)](_0x2ff8de(0x2ff)+_0x3f192f+_0x2ff8de(0x22b)+_0x3d2844),_0x3455db='opcua-for-node-red-fix-me';}const _0x3d360e=RED[_0x2ff8de(0x203)]['apiRootUrl']||'',_0x13a6ff=''+_0x3d360e+_0x3455db+_0x4d4b03;return _0x13a6ff;}const _0x1847f4=()=>{const _0x3073b6=_0x51a9,_0x10b1ef=$('.red-ui-tray-body');if(_0x10b1ef[_0x3073b6(0x240)]){const _0x3b60c2=$(_0x3073b6(0x326),{'src':_0x36e1a0(_0x3073b6(0x274)),'scrolling':'no','style':_0x3073b6(0x22a),'allowtransparency':_0x3073b6(0x209),'width':_0x3073b6(0x2ad),'height':_0x3073b6(0x1f1)});_0x10b1ef[_0x3073b6(0x24c)](_0x3b60c2),_0x3b60c2[_0x3073b6(0x313)]({'position':'absolute','right':'20px','bottom':'16px'});}},_0x39fb7d=()=>{const _0x4f6624=_0x51a9,_0x311fda=$('#node-input-endpoint'),_0x1524fb=_0x311fda[_0x4f6624(0x1d3)](),_0x4b2a4f=RED[_0x4f6624(0x208)][_0x4f6624(0x25f)](_0x1524fb);if(!_0x4b2a4f)return undefined;const {endpoint:_0x233202,securityMode:_0x37dbb4,securityPolicy:_0x2012b1,userIdentityType:_0x32b7d1,credentials:_0x300640,namespaceAliases:_0x3b0205}=_0x4b2a4f,_0x3ae6d8={'endpoint':_0x233202,'securityMode':_0x37dbb4,'securityPolicy':_0x2012b1,'userIdentityType':_0x32b7d1,'credentials':_0x300640,'namespaceAliases':_0x3b0205};return _0x3ae6d8;},_0x7f107b=()=>{const _0xbfd03e=_0x51a9,_0x350c73=$('#node-input-endpoint'),_0x364526=_0x350c73[_0xbfd03e(0x1d3)](),_0x3b49f0=_0x39fb7d();if(!_0x3b49f0)return undefined;const _0x4436cf=_0x3b49f0['namespaceAliases'];return Object[_0xbfd03e(0x382)]({'namespaceAliases':_0x4436cf,'id':_0x364526},_0x3b49f0);},_0x308768=()=>{return{'endpointNode':_0x7f107b};};function _0x4235dc(_0x45747f,_0x1d5a57,_0x41a4f2,_0x19cde1){function _0x4eacce(_0x4cb8ab){return _0x4cb8ab instanceof _0x41a4f2?_0x4cb8ab:new _0x41a4f2(function(_0xa70b1){_0xa70b1(_0x4cb8ab);});}return new(_0x41a4f2||(_0x41a4f2=Promise))(function(_0x1268bb,_0x2c8c3d){const _0x264e54=_0x51a9;function _0x1d4ead(_0x50fa60){const _0x7224da=_0x51a9;try{_0x194fd5(_0x19cde1[_0x7224da(0x1ee)](_0x50fa60));}catch(_0x357fe9){_0x2c8c3d(_0x357fe9);}}function _0x488718(_0x44ddaa){const _0x1a7b52=_0x51a9;try{_0x194fd5(_0x19cde1[_0x1a7b52(0x2d9)](_0x44ddaa));}catch(_0x3ee6ca){_0x2c8c3d(_0x3ee6ca);}}function _0x194fd5(_0x3476b8){const _0x17b62d=_0x51a9;_0x3476b8[_0x17b62d(0x1fa)]?_0x1268bb(_0x3476b8[_0x17b62d(0x291)]):_0x4eacce(_0x3476b8[_0x17b62d(0x291)])['then'](_0x1d4ead,_0x488718);}_0x194fd5((_0x19cde1=_0x19cde1[_0x264e54(0x287)](_0x45747f,_0x1d5a57||[]))[_0x264e54(0x1ee)]());});}typeof SuppressedError==='function'?SuppressedError:function(_0x2191e4,_0x3f7046,_0xafd845){const _0x3ddac3=_0x51a9;var _0x25b8a6=new Error(_0xafd845);return _0x25b8a6[_0x3ddac3(0x253)]=_0x3ddac3(0x211),_0x25b8a6[_0x3ddac3(0x36e)]=_0x2191e4,_0x25b8a6[_0x3ddac3(0x258)]=_0x3f7046,_0x25b8a6;};function _0xf7b8c2(){return _0x4235dc(this,void 0x0,void 0x0,function*(){const _0x1588ec=_0x51a9,_0x1d01d2=_0x36e1a0(_0x1588ec(0x242)),_0x421738=yield fetch(_0x1d01d2,{'method':'GET'}),_0x1d997=new Date()['toISOString'](),_0x4b007d={'status':'FAILED','type':_0x1588ec(0x378),'productName':_0x1588ec(0x205),'productVersion':_0x1588ec(0x2c7),'licenceInfo':{'licenceId':_0x1588ec(0x213),'licenceType':'<unknown>','expiryDate':_0x1d997,'onPremiseServerHost':'','expired':!![],'userCompany':'','userEmail':'','userName':''}};if(_0x421738[_0x1588ec(0x2e8)]!==0xc8)return console[_0x1588ec(0x1e8)](_0x1588ec(0x1d6),_0x421738[_0x1588ec(0x2e8)],_0x421738[_0x1588ec(0x33b)]),_0x4b007d;const _0x34e057=yield _0x421738[_0x1588ec(0x207)]();return _0x34e057;});}const _0x2aa463='opcua-for-nodered-last-overlay-shown';function _0x4645f4(){return _0x4235dc(this,void 0x0,void 0x0,function*(){const _0x46ff40=_0x51a9;try{const _0x5c4795=_0x36e1a0('/onboarding/status'),_0x5bdc37=yield fetch(_0x5c4795);if(!_0x5bdc37['ok'])return{'onboarded':!![]};return yield _0x5bdc37[_0x46ff40(0x207)]();}catch(_0x39d214){return{'onboarded':!![]};}});}function _0x33310d(_0x1bfeaa){const _0x4006e5=_0x51a9;_0xbf14d0({'bannerClass':'onboarding-required-banner','bannerCss':{'backgroundColor':'#fff3cd','borderBottom':_0x4006e5(0x34c)},'messageHtml':_0x4006e5(0x246)+_0x4006e5(0x302)+(_0x4006e5(0x34a)+_0x1bfeaa+_0x4006e5(0x375))+_0x4006e5(0x346)+'complete\x20registration</a>.','messageCss':{'color':_0x4006e5(0x357)},'buttonText':_0x4006e5(0x31c),'buttonCss':{'backgroundColor':_0x4006e5(0x1e0)},'buttonHoverCss':{'backgroundColor':_0x4006e5(0x333)},'supportUrl':_0x1bfeaa});const _0xcc8ba8=setInterval(()=>_0x4235dc(this,void 0x0,void 0x0,function*(){const _0x5e5ddb=_0x4006e5;try{const _0x4fbb60=yield _0x4645f4();if(_0x4fbb60['onboarded']){clearInterval(_0xcc8ba8);const _0x1a8023=$(_0x5e5ddb(0x27f));_0x1a8023[_0x5e5ddb(0x240)]>0x0&&(_0x1a8023[_0x5e5ddb(0x313)]({'backgroundColor':_0x5e5ddb(0x367),'borderBottom':_0x5e5ddb(0x254)}),_0x1a8023[_0x5e5ddb(0x388)](_0x5e5ddb(0x2a3))[_0x5e5ddb(0x277)](_0x5e5ddb(0x2f2)+'thank\x20you!\x20Please\x20re-deploy\x20your\x20flows\x20to\x20activate\x20all\x20nodes.'),_0x1a8023[_0x5e5ddb(0x388)](_0x5e5ddb(0x2a3))[_0x5e5ddb(0x313)]({'color':_0x5e5ddb(0x1e4)}),_0x1a8023[_0x5e5ddb(0x388)](_0x5e5ddb(0x262))[_0x5e5ddb(0x2ab)](),setTimeout(()=>{const _0x4d0064=_0x5e5ddb;_0x1a8023[_0x4d0064(0x2ee)](0x12c,()=>_0x1a8023[_0x4d0064(0x2ab)]());},0x1388));}}catch(_0x3256f0){}}),0xbb8),_0x10203c=new MutationObserver(()=>{const _0x5d5041=_0x4006e5;$('.onboarding-required-banner')[_0x5d5041(0x240)]===0x0&&(clearInterval(_0xcc8ba8),_0x10203c[_0x5d5041(0x244)]());}),_0x37d61a=$('.red-ui-tray-content')[_0x4006e5(0x1c7)]();_0x37d61a[_0x4006e5(0x240)]>0x0&&_0x37d61a[0x0]&&_0x10203c[_0x4006e5(0x229)](_0x37d61a[0x0],{'childList':!![],'subtree':!![]});}function _0x3ca9a8(){return _0x4235dc(this,arguments,void 0x0,function*(_0x2ebcb4={}){const _0x3d53ad=_0x51a9,_0x5b53ed=_0x36e1a0('/config#buy'),{delay:delay=0x5dc,supportUrl:supportUrl=_0x5b53ed,shouldShowOverlay:shouldShowOverlay=_0x486ba4=>_0x486ba4['status']===_0x3d53ad(0x2f8)&&_0x486ba4[_0x3d53ad(0x25e)]===_0x3d53ad(0x33d)}=_0x2ebcb4;try{const _0x3daeee=yield _0x4645f4();if(!_0x3daeee[_0x3d53ad(0x29c)])return yield _0x38efaf(Math['min'](delay,0x1f4)),_0x33310d(_0x36e1a0(_0x3d53ad(0x2c9))),!![];const _0x673475=yield _0xf7b8c2();if(shouldShowOverlay(_0x673475)){const _0x9ff2c5=Date[_0x3d53ad(0x32a)](),_0x4e1826=parseInt(localStorage['getItem'](_0x2aa463)||'0',0xa),_0x500792=0x3c*0x3c*0x3e8;return _0x9ff2c5-_0x4e1826>_0x500792?(yield _0x38efaf(delay),_0x2c4d4d(supportUrl),localStorage['setItem'](_0x2aa463,_0x9ff2c5['toString']())):_0x67cf88(supportUrl),!![];}if(_0x673475['type']===_0x3d53ad(0x33d)&&_0x673475['status']!=='EXPIRED'){const _0x5d5e27=_0x12f0b6(_0x673475);if(_0x5d5e27<=0xa&&_0x5d5e27>0x0)return yield _0x38efaf(delay),_0x3d7a99(supportUrl,_0x5d5e27),!![];}if(_0x673475['type']==='PROFESSIONAL'&&_0x673475['status']===_0x3d53ad(0x2f8))return yield _0x38efaf(delay),_0x22da46(supportUrl),!![];return![];}catch(_0x28a58d){return console[_0x3d53ad(0x36e)]('Failed\x20to\x20check\x20licence\x20status:',_0x28a58d),![];}});}function _0x2c4d4d(_0x3c77da,_0xc37d1a=0xbb8){const _0x4cea7a=_0x51a9,_0x4a13fe=$(_0x4cea7a(0x27c))[_0x4cea7a(0x1c7)]();if(_0x4a13fe['length']===0x0){console['warn'](_0x4cea7a(0x23c));return;}const _0x4e9021=$(_0x4cea7a(0x24b),{'class':'licence-activation-overlay','css':{'position':'absolute','top':0x0,'left':0x0,'right':0x0,'bottom':0x0,'zIndex':0x2710,'backgroundColor':_0x4a13fe[_0x4cea7a(0x313)](_0x4cea7a(0x230))[_0x4cea7a(0x2cf)](_0x4cea7a(0x30c),_0x4cea7a(0x21a))['replace'](')',',\x200.7)'),'backdropFilter':_0x4cea7a(0x29b),'WebkitBackdropFilter':_0x4cea7a(0x29b),'display':_0x4cea7a(0x226),'flexDirection':_0x4cea7a(0x365),'alignItems':_0x4cea7a(0x29e),'justifyContent':_0x4cea7a(0x29e),'padding':_0x4cea7a(0x243)}}),_0x21255f=$(_0x4cea7a(0x24b),{'css':{'backgroundColor':'rgba(255,\x20255,\x20255,\x200.9)','backdropFilter':_0x4cea7a(0x1db),'WebkitBackdropFilter':_0x4cea7a(0x1db),'borderRadius':'16px','padding':'40px','maxWidth':_0x4cea7a(0x1c3),'textAlign':_0x4cea7a(0x29e),'boxShadow':_0x4cea7a(0x238),'border':_0x4cea7a(0x1f0)}}),_0x1e9761=$(_0x4cea7a(0x1c2),{'src':_0x36e1a0('/images/small-sterfive.png'),'css':{'maxWidth':_0x4cea7a(0x316),'height':'auto','marginBottom':_0x4cea7a(0x2bc)}}),_0x34320d=$(_0x4cea7a(0x24b),{'css':{'fontSize':'64px','marginBottom':_0x4cea7a(0x2bc)}})['text']('⚠️'),_0x566440=$(_0x4cea7a(0x26b),{'css':{'color':_0x4cea7a(0x312),'fontSize':_0x4cea7a(0x330),'fontWeight':_0x4cea7a(0x21b),'marginBottom':_0x4cea7a(0x293)}})['text'](_0x4cea7a(0x281)),_0x1c4ea4=$(_0x4cea7a(0x34b),{'css':{'color':_0x4cea7a(0x27e),'fontSize':'16px','lineHeight':_0x4cea7a(0x294),'marginBottom':'30px'}})[_0x4cea7a(0x277)](_0x4cea7a(0x30b)),_0x4949c9=$('<button>',{'css':{'backgroundColor':_0x4cea7a(0x239),'color':_0x4cea7a(0x1f8),'border':_0x4cea7a(0x1c9),'padding':_0x4cea7a(0x307),'fontSize':_0x4cea7a(0x22e),'fontWeight':_0x4cea7a(0x21b),'borderRadius':'8px','cursor':'pointer','marginBottom':_0x4cea7a(0x293),'width':_0x4cea7a(0x2de),'transition':_0x4cea7a(0x2b9)}})['text'](_0x4cea7a(0x1c5))['on']('mouseenter',function(){const _0x4316f1=_0x4cea7a;$(this)['css'](_0x4316f1(0x1fd),_0x4316f1(0x2e3));})['on'](_0x4cea7a(0x311),function(){const _0x54a305=_0x4cea7a;$(this)['css'](_0x54a305(0x1fd),_0x54a305(0x239));})['on'](_0x4cea7a(0x2d3),()=>{const _0x3e2a3d=_0x4cea7a;window[_0x3e2a3d(0x320)](_0x3c77da,_0x3e2a3d(0x303),_0x3e2a3d(0x29a));}),_0x385cc8=$(_0x4cea7a(0x1f4),{'class':_0x4cea7a(0x2dc),'css':{'backgroundColor':_0x4cea7a(0x264),'color':_0x4cea7a(0x231),'border':'1px\x20solid\x20#ccc','padding':'10px\x2020px','fontSize':_0x4cea7a(0x29d),'borderRadius':_0x4cea7a(0x24f),'cursor':_0x4cea7a(0x37c),'marginTop':_0x4cea7a(0x251),'width':_0x4cea7a(0x2de),'transition':_0x4cea7a(0x2d5),'display':_0x4cea7a(0x1c9)}})[_0x4cea7a(0x212)]('I\x20accept\x20to\x20switch\x20to\x20the\x20free\x20version\x20(limited\x20features)')['on'](_0x4cea7a(0x2fa),function(){const _0x2df452=_0x4cea7a;$(this)['css']({'backgroundColor':'rgba(0,\x200,\x200,\x200.05)','borderColor':_0x2df452(0x22f)});})['on'](_0x4cea7a(0x311),function(){const _0x272549=_0x4cea7a;$(this)[_0x272549(0x313)]({'backgroundColor':_0x272549(0x264),'borderColor':_0x272549(0x317)});})['on']('click',()=>{const _0x5cd213=_0x4cea7a;_0x4e9021[_0x5cd213(0x267)](0x12c,()=>{const _0x2a3095=_0x5cd213;_0x4e9021[_0x2a3095(0x2ab)]();});});setTimeout(()=>{_0x385cc8['fadeIn']();},_0xc37d1a),_0x21255f[_0x4cea7a(0x24c)](_0x1e9761),_0x21255f['append'](_0x34320d),_0x21255f[_0x4cea7a(0x24c)](_0x566440),_0x21255f[_0x4cea7a(0x24c)](_0x1c4ea4),_0x21255f[_0x4cea7a(0x24c)](_0x4949c9),_0x21255f[_0x4cea7a(0x24c)](_0x385cc8),_0x4e9021[_0x4cea7a(0x24c)](_0x21255f),_0x4a13fe[_0x4cea7a(0x313)]('position',_0x4cea7a(0x38b)),_0x4a13fe[_0x4cea7a(0x24c)](_0x4e9021),window['addEventListener']('message',function _0x3e2a4f(_0x1bb872){const _0x48c285=_0x4cea7a;_0x1bb872[_0x48c285(0x2af)]&&_0x1bb872[_0x48c285(0x2af)][_0x48c285(0x25e)]==='licence-activated'&&(_0x4e9021[_0x48c285(0x267)](0x12c,()=>{const _0x41ba86=_0x48c285;_0x4e9021[_0x41ba86(0x2ab)]();}),window[_0x48c285(0x297)](_0x48c285(0x32b),_0x3e2a4f));});}function _0x38efaf(_0x34a45f){return new Promise(_0x560c7a=>setTimeout(_0x560c7a,_0x34a45f));}function _0x12f0b6(_0x444ef0){const _0x26a542=_0x51a9,_0x39e36f=_0x444ef0[_0x26a542(0x28f)][_0x26a542(0x255)];if(!_0x39e36f||_0x39e36f===_0x26a542(0x1d0))return Infinity;const _0x2f1f93=new Date(_0x39e36f),_0x20bb65=new Date(),_0x2b01a6=_0x2f1f93[_0x26a542(0x38c)]()-_0x20bb65[_0x26a542(0x38c)](),_0x18ada6=Math['ceil'](_0x2b01a6/(0x3e8*0x3c*0x3c*0x18));return _0x18ada6;}function _0x3d7a99(_0xd79952,_0x2ab5c0){const _0x2b626b=_0x51a9,_0x25b271=$('.red-ui-tray-content')[_0x2b626b(0x1c7)]();if(_0x25b271[_0x2b626b(0x240)]===0x0){console[_0x2b626b(0x28e)](_0x2b626b(0x2b1));return;}if(_0x25b271[_0x2b626b(0x388)](_0x2b626b(0x2a2))[_0x2b626b(0x240)]>0x0)return;const _0x597e93=$(_0x2b626b(0x24b),{'class':_0x2b626b(0x327),'css':{'position':_0x2b626b(0x38b),'backgroundColor':_0x2b626b(0x310),'borderBottom':_0x2b626b(0x336),'padding':'12px\x2050px\x2012px\x2015px','display':_0x2b626b(0x226),'alignItems':_0x2b626b(0x29e),'gap':_0x2b626b(0x1fe),'boxShadow':'0\x202px\x208px\x20rgba(0,0,0,0.1)','zIndex':0x3e8}}),_0x4f0dec=$('<div>',{'css':{'fontSize':_0x2b626b(0x2bc),'flexShrink':0x0}})[_0x2b626b(0x212)]('⚠️'),_0x5f15e9=$(_0x2b626b(0x24b),{'css':{'flex':0x1,'fontSize':_0x2b626b(0x29d),'color':_0x2b626b(0x282)}}),_0x45ea05=$(_0x2b626b(0x1e9),{'css':{'fontWeight':'500'}})[_0x2b626b(0x277)](_0x2b626b(0x366)+_0x2ab5c0+_0x2b626b(0x38e)+(_0x2ab5c0!==0x1?'s':'')+_0x2b626b(0x1ea)),_0x33ac6b=$('<a>',{'href':'#','css':{'color':_0x2b626b(0x239),'textDecoration':_0x2b626b(0x263),'cursor':_0x2b626b(0x37c)}})[_0x2b626b(0x212)](_0x2b626b(0x1ce))['on'](_0x2b626b(0x2d3),_0x591106=>{const _0x2b9f2e=_0x2b626b;_0x591106[_0x2b9f2e(0x2bf)](),window[_0x2b9f2e(0x320)](_0xd79952,_0x2b9f2e(0x303),_0x2b9f2e(0x29a));});_0x5f15e9['append'](_0x45ea05),_0x5f15e9[_0x2b626b(0x24c)](_0x33ac6b);const _0x4405fd=$(_0x2b626b(0x1f4),{'css':{'position':'absolute','right':_0x2b626b(0x251),'top':'50%','transform':'translateY(-50%)','backgroundColor':_0x2b626b(0x264),'border':'none','fontSize':_0x2b626b(0x2bc),'color':'#856404','curs