profoundjs 6.1.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+
3
+ "use strict";
4
+
5
+ const profound = require("profoundjs");
6
+
7
+ (async function () {
8
+ await profound.utils.floatingLicenses.cli();
9
+ })();
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "screen": {
6
6
  "record format name": "signonscrn",
7
- "onload": "if(window.puiMobileClient == null){\n if(window.device != null){\n if(window.device.platform != null){\n if(window.device.platform == \"iOS\"){\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphics button\");\n applyProperty(\"SignOnButton\", \"width\", \"340px\");\n applyProperty(\"SignOnButton\", \"field type\", \"graphics button\");\n }\n } \n }\n}\npui.confirmOnClose = false;"
7
+ "onload": "if(window.puiMobileClient == null){\n if(window.device != null){\n if(window.device.platform != null){\n if(window.device.platform == \"iOS\"){\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphic button\");\n applyProperty(\"SignOnButton\", \"width\", \"340px\");\n applyProperty(\"SignOnButton\", \"field type\", \"graphic button\");\n }\n } \n }\n}\npui.confirmOnClose = false;"
8
8
  },
9
9
  "items": [
10
10
  {
@@ -166,7 +166,7 @@
166
166
  "screen": {
167
167
  "record format name": "errscrn",
168
168
  "disable enter key": "true",
169
- "onload": "\nif (pui[\"errorScreen\"] && pui[\"errorScreen\"][\"onload\"]) {\n pui[\"errorScreen\"][\"onload\"]();\n}\nelse {\n // Backwards compatibility code for when pui[\"errorScreen\"][\"onload\"]() is not available\n if ((window[\"puiMobileClient\"] == null && window[\"device\"] != null &&\n window[\"device\"][\"platform\"] == \"iOS\") ||\n pui.genie != null) {\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphics button\");\n }\n if (pui.genie != null) {\n applyProperty(\"NewSessionButton\", \"value\", pui.getLanguageText(\"runtimeText\", \"ok\"));\n applyProperty(\"NewSessionButton\", \"onclick\", \"pui.click();\");\n }\n pui.formatErrorText();\n pui.confirmOnClose = false;\n pui.shutdownOnClose = false;\n}\n"
169
+ "onload": "\nif (pui[\"errorScreen\"] && pui[\"errorScreen\"][\"onload\"]) {\n pui[\"errorScreen\"][\"onload\"]();\n}\nelse {\n // Backwards compatibility code for when pui[\"errorScreen\"][\"onload\"]() is not available\n if ((window[\"puiMobileClient\"] == null && window[\"device\"] != null &&\n window[\"device\"][\"platform\"] == \"iOS\") ||\n pui.genie != null) {\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphic button\");\n }\n if (pui.genie != null) {\n applyProperty(\"NewSessionButton\", \"value\", pui.getLanguageText(\"runtimeText\", \"ok\"));\n applyProperty(\"NewSessionButton\", \"onclick\", \"pui.click();\");\n }\n pui.formatErrorText();\n pui.confirmOnClose = false;\n pui.shutdownOnClose = false;\n}\n"
170
170
  },
171
171
  "items": [
172
172
  {
@@ -704,7 +704,7 @@
704
704
  {
705
705
  "screen": {
706
706
  "record format name": "eojscrn",
707
- "onload": "if(window.device != null){\n if(window.device.platform != null){\n if(window.device.platform == \"iOS\"){\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphics button\");\n applyProperty(\"NewSessionButton2\", \"width\", \"335px\");\n applyProperty(\"NewSessionButton2\", \"field type\", \"graphics button\");\n }\n }\n}\n\npui.endOfSession();"
707
+ "onload": "if(window.device != null){\n if(window.device.platform != null){\n if(window.device.platform == \"iOS\"){\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphic button\");\n applyProperty(\"NewSessionButton2\", \"width\", \"335px\");\n applyProperty(\"NewSessionButton2\", \"field type\", \"graphic button\");\n }\n }\n}\n\npui.endOfSession();"
708
708
  },
709
709
  "items": [
710
710
  {
@@ -774,7 +774,7 @@
774
774
  {
775
775
  "screen": {
776
776
  "record format name": "timoutscrn",
777
- "onload": "if(window.device != null){\n if(window.device.platform != null){\n if(window.device.platform == \"iOS\"){\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphics button\");\n applyProperty(\"NewSessionButton3\", \"width\", \"335px\");\n applyProperty(\"NewSessionButton3\", \"field type\", \"graphics button\");\n }\n }\n}\n\npui.endOfSession(\"Your session has timed out.\");"
777
+ "onload": "if(window.device != null){\n if(window.device.platform != null){\n if(window.device.platform == \"iOS\"){\n applyProperty(\"btnBack\", \"visibility\", \"hidden\");\n applyProperty(\"btnBack\", \"field type\", \"graphic button\");\n applyProperty(\"NewSessionButton3\", \"width\", \"335px\");\n applyProperty(\"NewSessionButton3\", \"field type\", \"graphic button\");\n }\n }\n}\n\npui.endOfSession(\"Your session has timed out.\");"
778
778
  },
779
779
  "items": [
780
780
  {
@@ -988,7 +988,8 @@
988
988
  "rjZeroFill": "false",
989
989
  "dataType": "varchar",
990
990
  "formatting": "Text",
991
- "textTransform": "none"
991
+ "textTransform": "none",
992
+ "designValue": "@media screen { #_id_ > .puiresp { display:grid; } }"
992
993
  },
993
994
  "use viewport": "true",
994
995
  "bottom": "0px",
Binary file
package/setup/setup.js CHANGED
@@ -28,8 +28,8 @@ const uuidv4 = require("uuid").v4;
28
28
 
29
29
  const IBMi = iutils.isIBMi();
30
30
 
31
- let RED = "\x1b[31m";
32
- let CYAN = "\x1b[36m";
31
+ let RED = "\x1b[31m";
32
+ let CYAN = "\x1b[36m";
33
33
  let RESET = "\x1b[0m";
34
34
 
35
35
  const logDir = path.join(os.tmpdir(), "profoundjs-" + uuidv4());
@@ -40,7 +40,6 @@ let SILENT_MODE = false;
40
40
 
41
41
  (async () => {
42
42
  try {
43
-
44
43
  // Parse arguments.
45
44
  const args = minimist(
46
45
  process.argv.slice(2),
@@ -64,7 +63,7 @@ let SILENT_MODE = false;
64
63
  "ibmi-instance-node-path",
65
64
  "nodegit-version"
66
65
  ],
67
- unknown: function(arg) {
66
+ unknown: function (arg) {
68
67
  console.error("Unknown argument:", arg);
69
68
  process.exit(1);
70
69
  }
@@ -73,7 +72,7 @@ let SILENT_MODE = false;
73
72
 
74
73
  // Show help and quit, if requested.
75
74
  if (args["help"]) {
76
- const HELP = `Usage: npm run setup -- [OPTION]
75
+ const HELP = `Usage: npm run setup -- [OPTION]
77
76
  -c, --config-file=<file> Alternate config file.
78
77
  -h, --help Print this help and exit.
79
78
  --nodegit Install nodegit.
@@ -316,6 +315,10 @@ let SILENT_MODE = false;
316
315
  log("call.js created.");
317
316
  }
318
317
 
318
+ // Create lic_client.js
319
+ copyFile(path.join(__dirname, "lic_client.js"), deployDir, "utf8");
320
+ log("lic_client.js created.");
321
+
319
322
  // Convert start.js to Promises, if necessary.
320
323
  const convertStartJS = require("./convertStartJS.js");
321
324
  if (convertStartJS(path.join(deployDir, "start.js"))) {
@@ -326,7 +329,7 @@ let SILENT_MODE = false;
326
329
  if (IBMi) {
327
330
  log("");
328
331
  if (args["ibmi-connector-library"] || args["ibmi-instance"] !== undefined) {
329
- let portNumber = config.port || 8081;
332
+ const portNumber = config.port || 8081;
330
333
  let connectorLibrary = "*NONE";
331
334
  let connectorIASP;
332
335
  if (args["ibmi-connector-library"]) {
@@ -350,7 +353,7 @@ let SILENT_MODE = false;
350
353
  }
351
354
  }
352
355
  // First, try copying the save file
353
- var success = runCommand("CPYFRMSTMF FROMSTMF('" + __dirname + "/pjsdist.savf') TOMBR('/QSYS.LIB/QGPL.LIB/PJSDIST.FILE') MBROPT(*REPLACE)");
356
+ let success = runCommand("CPYFRMSTMF FROMSTMF('" + __dirname + "/pjsdist.savf') TOMBR('/QSYS.LIB/QGPL.LIB/PJSDIST.FILE') MBROPT(*REPLACE)");
354
357
  if (!success) {
355
358
  logError("Unable to create installer save file.");
356
359
  die();
@@ -366,13 +369,15 @@ let SILENT_MODE = false;
366
369
  die();
367
370
  }
368
371
  // Now, try running PJSINSTALL
369
- var command = "QGPL/PJSINSTALL CONNLIB(" + connectorLibrary + ")";
370
- if (connectorLibrary != "*NONE")
372
+ let command = "QGPL/PJSINSTALL CONNLIB(" + connectorLibrary + ")";
373
+ if (connectorLibrary != "*NONE") {
371
374
  command += " CONNIASP(" + connectorIASP + ") CONNHOST('localhost') CONNPORT(" + portNumber + ")";
375
+ }
372
376
  command += " SVRNAME(" + svrname + ")";
373
- if (svrname != "*NONE")
377
+ if (svrname != "*NONE") {
374
378
  command += " SVRDIR('" + deployDir + "') " +
375
379
  "SVRAUTO(" + ((autostart) ? "*YES" : "*NO") + ") CCSID(" + ccsid + ") NODEPATH('" + nodePath + "')";
380
+ }
376
381
  success = runCommand(command, "-Ke");
377
382
  // Clean up program and save file
378
383
  log("");
@@ -402,7 +407,6 @@ let SILENT_MODE = false;
402
407
  }
403
408
  }
404
409
  log(`\n${CYAN}Profound.js installation complete.${RESET}\n`);
405
-
406
410
  }
407
411
  catch (error) {
408
412
  logError(error);
@@ -410,26 +414,26 @@ let SILENT_MODE = false;
410
414
  }
411
415
  })();
412
416
 
413
- function log(...args) {
417
+ function log (...args) {
414
418
  console.log(...args);
415
419
  logToFile(...args);
416
420
  }
417
421
 
418
- function logError(...args) {
422
+ function logError (...args) {
419
423
  console.error(...args);
420
424
  logToFile(...args);
421
425
  }
422
426
 
423
- function logToFile(...args) {
427
+ function logToFile (...args) {
424
428
  if (SILENT_MODE) {
425
429
  return;
426
430
  }
427
- let output = `${util.format(...args)}\n`; // Mimic console.log().
431
+ let output = `${util.format(...args)}\n`; // Mimic console.log().
428
432
  output = output.replace(/\x1b\[[0-9]+m/g, ""); // Strip terminal escape codes for colors.
429
433
  fs.writeFileSync(logFile, output, { flag: "a" });
430
434
  }
431
435
 
432
- function die() {
436
+ function die () {
433
437
  logError(`\n${RED}Profound.js installation failed.${RESET}`);
434
438
  if (!SILENT_MODE) {
435
439
  console.error(`${RED}See installation log:${RESET} ${logPath}\n`);
@@ -437,12 +441,12 @@ function die() {
437
441
  process.exit(1);
438
442
  }
439
443
 
440
- function copyDir(dir, destinationDir) {
444
+ function copyDir (dir, destinationDir) {
441
445
  const dirName = path.basename(dir);
442
446
  fs.mkdirSync(path.join(destinationDir, dirName));
443
447
  const files = fs.readdirSync(dir);
444
- files.forEach(function(file, index) {
445
- if(fs.lstatSync(path.join(dir, file)).isDirectory()) { // recurse
448
+ files.forEach(function (file, index) {
449
+ if (fs.lstatSync(path.join(dir, file)).isDirectory()) { // recurse
446
450
  copyDir(path.join(dir, file), path.join(destinationDir, dirName));
447
451
  }
448
452
  else {
@@ -451,20 +455,24 @@ function copyDir(dir, destinationDir) {
451
455
  });
452
456
  }
453
457
 
454
- function copyFile(file, destination, type) {
458
+ function copyFile (file, destination, type) {
455
459
  if (type == null) type = "binary";
456
- if (directoryExists(destination))
457
- var toFile = path.join(destination, path.basename(file));
458
- else
459
- var toFile = destination;
460
- var content = fs.readFileSync(file, type);
460
+ let toFile;
461
+ if (directoryExists(destination)) {
462
+ toFile = path.join(destination, path.basename(file));
463
+ }
464
+ else {
465
+ toFile = destination;
466
+ }
467
+ const content = fs.readFileSync(file, type);
461
468
  fs.writeFileSync(toFile, content, type);
462
469
  }
463
470
 
464
- function createPuiscreens(deployDir) {
465
- function copyFileOldVersionIs(version, compareStr){
471
+ function createPuiscreens (deployDir) {
472
+ const targetPuiScreensFile = path.join(deployDir, "modules", "puiscreens.json");
473
+ function copyFileOldVersionIs (version, compareStr) {
466
474
  compareStr = compareStr || "=";
467
- log("Found Standard puiscreens.json file version "+compareStr+" "+version+", replacing with current version...");
475
+ log("Found Standard puiscreens.json file version " + compareStr + " " + version + ", replacing with current version...");
468
476
  copyFile(path.join(__dirname, "modules", "puiscreens.json"), targetPuiScreensFile, "utf8");
469
477
  log("puiscreens.json file was replaced.");
470
478
  }
@@ -477,11 +485,15 @@ function createPuiscreens(deployDir) {
477
485
  // 3. If it's not an official version, check if we have lower case User & Password. If not, then backup existing version to puiscreens_bak.json and install this official version.
478
486
  // 4. Otherwise it's not an official version but should work OK. So leave existing puiscreens.json, and check if we already have a puiscreens_orig.json, and
479
487
  // create it if not.
480
- var targetPuiScreensFile = path.join(deployDir, "modules", "puiscreens.json");
481
488
  if (fileExists(targetPuiScreensFile)) {
482
-
483
- var data = fs.readFileSync(targetPuiScreensFile);
484
- var checksum = crypto.createHash("sha512").update(data).digest("hex"); // sha512 best for 64-bit
489
+ const data = fs.readFileSync(targetPuiScreensFile);
490
+ const checksum = crypto.createHash("sha512").update(data).digest("hex"); // sha512 best for 64-bit
491
+ let format = null;
492
+ let puiScreens;
493
+ let goodUser = false;
494
+ let goodPassword = false;
495
+ let goodSubmit = false;
496
+ let goodError = false;
485
497
 
486
498
  switch (checksum) {
487
499
  case "4fb38daa851aacd21cf3aeaa92304df4e0353cae2b6dab3a5fd53c0cf4d42875b5efadbb4bb29642cbff07bfdd8e1c7a9c107f582905f7fc798c3841e888ee61":
@@ -531,39 +543,38 @@ function createPuiscreens(deployDir) {
531
543
 
532
544
  case "3aaab88d4cf922f01a09bab3424ecf81460c7679a6d51ecb0f187fdce97e627499128e9b8c46d83075098e7e8f7150b73936056b1accedff55a79c69d65cb20b":
533
545
  // Note: Betas were considered pre-release versions. 6.0.0 is the release version; so 6.0.0 is newer than 6.0.0-beta.X
534
- log("Found Standard puiscreens.json file version >= 6.0.0, no need for update.");
546
+ copyFileOldVersionIs("6.0.0");
547
+ break;
548
+
549
+ case "41a350ae45c7616fe1824fb236b48ab64ca6d0de1023946e16ef9de4eea804649ff13123fa4ce630bb93308c8312f75e12448bbe58e91802dc8b12cc27bfd051":
550
+ log("Found Standard puiscreens.json file version > 6.0.0, no need for update.");
535
551
  break;
536
552
 
537
553
  default:
538
- var puiScreens = JSON.parse(data);
554
+ puiScreens = JSON.parse(data);
539
555
  log("Found Customized puiscreens.json file, analyzing contents...");
540
556
 
541
557
  // We need to check the signon screen and make sure we have lower case bound fields
542
- var goodUser = false, goodPassword = false, goodSubmit = false, goodError = false;
543
-
544
- formats:
545
- for (var i in puiScreens.formats) {
546
- var format = puiScreens.formats[i];
547
-
548
- if (format.screen["record format name"].toLowerCase() === "signonscrn") {
549
- for (var j in format.items) {
550
- var itemValue = format.items[j].value;
551
- if (itemValue && typeof itemValue === "object") {
552
- if (itemValue.fieldName === "ssuser") goodUser = true;
553
- else if (itemValue.fieldName === "sspassword") goodPassword = true;
554
- }
555
- var itemResponse = format.items[j].response;
556
- if (itemResponse && typeof itemResponse === "object") {
557
- if (itemResponse.fieldName === "sssubmit") goodSubmit = true;
558
- }
559
- var itemHtml = format.items[j].html;
560
- if (itemHtml && typeof itemHtml === "object") {
561
- if (itemHtml.fieldName === "sserror") goodError = true;
562
- }
563
-
564
- if (goodUser && goodPassword && goodSubmit && goodError) break formats;
558
+ if (Array.isArray(puiScreens.formats)) {
559
+ format = puiScreens.formats.find(format => typeof format.screen["record format name"] === "string" && format.screen["record format name"].toLowerCase() === "signonscrn");
560
+ }
561
+ if (format) {
562
+ for (const j in format.items) {
563
+ const itemValue = format.items[j].value;
564
+ if (itemValue && typeof itemValue === "object") {
565
+ if (itemValue.fieldName === "ssuser") goodUser = true;
566
+ else if (itemValue.fieldName === "sspassword") goodPassword = true;
567
+ }
568
+ const itemResponse = format.items[j].response;
569
+ if (itemResponse && typeof itemResponse === "object") {
570
+ if (itemResponse.fieldName === "sssubmit") goodSubmit = true;
571
+ }
572
+ const itemHtml = format.items[j].html;
573
+ if (itemHtml && typeof itemHtml === "object") {
574
+ if (itemHtml.fieldName === "sserror") goodError = true;
565
575
  }
566
- break;
576
+
577
+ if (goodUser && goodPassword && goodSubmit && goodError) break;
567
578
  }
568
579
  }
569
580
 
@@ -587,10 +598,10 @@ function createPuiscreens(deployDir) {
587
598
  }
588
599
  }
589
600
 
590
- function directoryExists(dir) {
591
- var exists = false;
601
+ function directoryExists (dir) {
602
+ let exists = false;
592
603
  try {
593
- var stat = fs.statSync(dir);
604
+ const stat = fs.statSync(dir);
594
605
  if (stat && stat.isDirectory()) exists = true;
595
606
  }
596
607
  catch (err) {
@@ -599,10 +610,10 @@ function directoryExists(dir) {
599
610
  return exists;
600
611
  }
601
612
 
602
- function fileExists(file) {
603
- var exists = false;
613
+ function fileExists (file) {
614
+ let exists = false;
604
615
  try {
605
- var stat = fs.statSync(file);
616
+ const stat = fs.statSync(file);
606
617
  if (stat && stat.isFile()) exists = true;
607
618
  }
608
619
  catch (err) {
@@ -611,10 +622,9 @@ function fileExists(file) {
611
622
  return exists;
612
623
  }
613
624
 
614
- function runCommand(command, switches) {
615
-
625
+ function runCommand (command, switches) {
616
626
  log("Executing IBM i command: " + command);
617
- var args = [command];
627
+ const args = [command];
618
628
  if (typeof switches == "string") {
619
629
  args.unshift(switches);
620
630
  }
@@ -632,7 +642,8 @@ function runCommand(command, switches) {
632
642
  env: {
633
643
  QIBM_USE_DESCRIPTOR_STDIO: "Y",
634
644
  QIBM_MULTI_THREADED: "N" // Many IBM commands cannot run in multi-threaded mode...
635
- }};
645
+ }
646
+ };
636
647
 
637
648
  const results = child_process.spawnSync("system", args, options);
638
649
 
@@ -648,8 +659,7 @@ function runCommand(command, switches) {
648
659
  }
649
660
  else {
650
661
  logError("Process ended due to signal %s", signal);
651
- logError(results); // show full results including detailed error
662
+ logError(results); // show full results including detailed error
652
663
  }
653
664
  return false;
654
-
655
665
  }
package/views/cloud.css CHANGED
@@ -258,10 +258,23 @@
258
258
  letter-spacing: .25px;
259
259
  }
260
260
 
261
- #_cloud_signin_button {
261
+ #_cloud_signin_button, #_cloud_signin_button_right {
262
262
  margin-top: 15px;
263
- width: 100%;
264
- display:block;
263
+ }
264
+
265
+ @media (max-width: 575px) {
266
+ #_cloud_signin_button, #_cloud_signin_button_right {
267
+ width: 100%;
268
+ display:block;
269
+ }
270
+ }
271
+ @media (min-width: 576px) {
272
+ #_cloud_signin_button, #_cloud_signin_button_right {
273
+ width: 47%;
274
+ }
275
+ #_cloud_signin_button_right {
276
+ float: right;
277
+ }
265
278
  }
266
279
 
267
280
  /*--- select template ---*/
@@ -602,9 +615,9 @@ span.pui-fa-brands-icons.fa-google {
602
615
  }
603
616
 
604
617
  ._cloud_signin_col {
605
- float: left;
606
- width: 50%;
607
- margin: auto;
618
+ /* float: left; */
619
+ /* width: 50%; */
620
+ /* margin: auto; */
608
621
  padding: 0 40px;
609
622
  margin-top: 6px;
610
623
  box-sizing: border-box;
package/views/key.ejs CHANGED
@@ -107,6 +107,21 @@
107
107
  color: white;
108
108
  }
109
109
 
110
+ .pjs-key-page .floating-lic-info {
111
+ color: white;
112
+ font-size: 15px;
113
+ width: 100%;
114
+ padding: 10px 30px 10px 60px;
115
+ }
116
+
117
+ .pjs-key-page .floating-lic-info div.pl-uuid span {
118
+ letter-spacing: 1.0px;
119
+ }
120
+
121
+ .pjs-key-page .floating-lic-info div.fl-lic-verif span.fl-lic-verif-dta.warning {
122
+ color: #FF3F00;
123
+ }
124
+
110
125
  .pjs-key-page .system-info {
111
126
  padding-left: 30px;
112
127
  padding-right: 30px;
@@ -353,6 +368,21 @@
353
368
  </div>
354
369
  <h1>License Key Management</h1>
355
370
  </div>
371
+ <% if (typeof floating !== "undefined"){ %>
372
+ <div class="floating-lic-info">
373
+ <div class="pl-uuid"><span>Floating License UUID: </span><%= floating.uuid %></div>
374
+ <div class="fl-lic-verif"><span class="fl-lic-verif-lbl">Verified: </span>
375
+ <% if (floating.verified) { %>
376
+ <span class="fl-lic-verif-dta">yes</span>
377
+ <% } else { %>
378
+ <span class="fl-lic-verif-dta warning">no - <%= floating.verified_msg %></span>
379
+ <% } %>
380
+ </div>
381
+ <div class="pulse-ts-exp">
382
+ <span>Machine heartbeat pulse required by (UTC): </span><%= floating.pulse_exp %>
383
+ </div>
384
+ </div>
385
+ <% } %>
356
386
  <div class="system-info">
357
387
  <div>
358
388
  <div class="machine-id"><span class="machine-id-label">Machine ID: </span>
@@ -408,7 +438,7 @@
408
438
  <form method="post" action="/key">
409
439
  <input type="hidden" name="apply" value="1" />
410
440
  <div class="paste-key">
411
- <textarea placeholder="Paste License Key Here" id="keyData" name="keyData" required></textarea>
441
+ <textarea placeholder="Paste License Key or Floating License Authorization Code Here" id="keyData" name="keyData" required></textarea>
412
442
  </div>
413
443
  <div class="apply-key">
414
444
  <input type="submit" value="Apply Key" />
@@ -422,7 +452,7 @@
422
452
  <label for="keyFile" />Or <span class="key-file-search">
423
453
  <div class="key-file-search-div">Browse</div>
424
454
  <input type="file" id="keyFile" name="keyFile" required onchange="displayKeyFileName(this);" />
425
- </span> to select a <a href="https://docs.profoundlogic.com/x/_wLrAw">Key File</a></label>
455
+ </span> to select a <a href="https://docs.profoundlogic.com/x/_wLrAw">Key or Floating License Authorization Code File</a></label>
426
456
  </div>
427
457
  <div class="key-file">
428
458
  <input class="key-file-to-upload" id="keyFileName" placeholder="Nothing to upload yet..." disabled="disabled" />