@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
HTML
<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>
<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>
<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>
<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>
<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 \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/> ','currentParent','now','message','.spinner','> \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','×','<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/> \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