{
  "custom": {
    "bucket": "maps.c4.rme.logistics.a2z.com-441697794360",
    "current_flow_view": "AFE 1 MINISORTER",
    "current_stage": "prod",
    "enabled_whids": [
      "ABQ1",
      "AGS1",
      "AMA1",
      "AUS2",
      "BDL4",
      "BOS3",
      "DEN4",
      "DEN8",
      "DET3",
      "DET6",
      "ELP1",
      "FAR1",
      "FAT2",
      "FOE1",
      "FSD1",
      "FTW5",
      "FWA6",
      "GEG2",
      "HOU6",
      "HOU8",
      "HSV1",
      "ICT2",
      "IGQ1",
      "IGQ2",
      "ILG1",
      "LFT1",
      "LIT1",
      "LIT2",
      "LUK2",
      "MLI1",
      "MQY1",
      "MTN1",
      "OKC2",
      "ORD5",
      "ORF3",
      "PAE2",
      "RIC4",
      "ROC1",
      "SAN3",
      "SAT3",
      "SAT4",
      "SAV4",
      "SCK6",
      "SMF6",
      "STL3",
      "SYR1",
      "TEB4",
      "TLH2",
      "TPA4",
      "TYS1",
      "YEG2",
      "YOO1",
      "YOW3"
    ],
    "flow_view": "AFE 1 MINISORTER",
    "flow_view_copy_operation": null,
    "flow_view_copy_option": "both",
    "flow_view_copy_tooltip": "",
    "flow_view_destination": "AFE 1 MINISORTER",
    "flow_view_destination_options": [
      {
        "label": "AFE 1 MINISORTER",
        "value": "AFE 1 MINISORTER"
      },
      {
        "label": "AFE TRAY SORTERS",
        "value": "AFE TRAY SORTERS"
      },
      {
        "label": "AR FIELD",
        "value": "AR FIELD"
      },
      {
        "label": "EMPTY TOTE LANES",
        "value": "EMPTY TOTE LANES"
      },
      {
        "label": "INBOUND SORTER",
        "value": "INBOUND SORTER"
      },
      {
        "label": "OUTBOUND",
        "value": "OUTBOUND"
      },
      {
        "label": "PACK",
        "value": "PACK"
      },
      {
        "label": "RSP LEVEL 2",
        "value": "RSP LEVEL 2"
      },
      {
        "label": "RSP LEVEL 3",
        "value": "RSP LEVEL 3"
      },
      {
        "label": "RSP LEVEL 4",
        "value": "RSP LEVEL 4"
      },
      {
        "label": "RSP LEVEL 5",
        "value": "RSP LEVEL 5"
      },
      {
        "label": "SHIP SORTER",
        "value": "SHIP SORTER"
      },
      {
        "label": "SMARTPAC",
        "value": "SMARTPAC"
      },
      {
        "label": "TOTE SORTER",
        "value": "TOTE SORTER"
      },
      {
        "label": "TRANSHIP SORTER",
        "value": "TRANSHIP SORTER"
      },
      {
        "label": "WASTE",
        "value": "WASTE"
      }
    ],
    "flow_view_edit_mode": {
      "active": false,
      "admin_enabled": true,
      "enabled": true,
      "reviewer_enabled": true,
      "sadmin_enabled": false
    },
    "flow_view_file_suffix": "_FlowView.svg",
    "flow_view_options": [
      {
        "label": "AFE 1 MINISORTER",
        "value": "AFE 1 MINISORTER"
      },
      {
        "label": "AFE TRAY SORTERS",
        "value": "AFE TRAY SORTERS"
      },
      {
        "label": "AR FIELD",
        "value": "AR FIELD"
      },
      {
        "label": "EMPTY TOTE LANES",
        "value": "EMPTY TOTE LANES"
      },
      {
        "label": "INBOUND SORTER",
        "value": "INBOUND SORTER"
      },
      {
        "label": "OUTBOUND",
        "value": "OUTBOUND"
      },
      {
        "label": "PACK",
        "value": "PACK"
      },
      {
        "label": "RSP LEVEL 2",
        "value": "RSP LEVEL 2"
      },
      {
        "label": "RSP LEVEL 3",
        "value": "RSP LEVEL 3"
      },
      {
        "label": "RSP LEVEL 4",
        "value": "RSP LEVEL 4"
      },
      {
        "label": "RSP LEVEL 5",
        "value": "RSP LEVEL 5"
      },
      {
        "label": "SHIP SORTER",
        "value": "SHIP SORTER"
      },
      {
        "label": "SMARTPAC",
        "value": "SMARTPAC"
      },
      {
        "label": "TOTE SORTER",
        "value": "TOTE SORTER"
      },
      {
        "label": "TRANSHIP SORTER",
        "value": "TRANSHIP SORTER"
      },
      {
        "label": "WASTE",
        "value": "WASTE"
      }
    ],
    "flow_view_source": "AFE 1 MINISORTER",
    "flow_view_source_options": [
      {
        "label": "AFE 1 MINISORTER",
        "value": "AFE 1 MINISORTER"
      },
      {
        "label": "AFE TRAY SORTERS",
        "value": "AFE TRAY SORTERS"
      },
      {
        "label": "AR FIELD",
        "value": "AR FIELD"
      },
      {
        "label": "EMPTY TOTE LANES",
        "value": "EMPTY TOTE LANES"
      },
      {
        "label": "INBOUND SORTER",
        "value": "INBOUND SORTER"
      },
      {
        "label": "OUTBOUND",
        "value": "OUTBOUND"
      },
      {
        "label": "PACK",
        "value": "PACK"
      },
      {
        "label": "RSP LEVEL 2",
        "value": "RSP LEVEL 2"
      },
      {
        "label": "RSP LEVEL 3",
        "value": "RSP LEVEL 3"
      },
      {
        "label": "RSP LEVEL 4",
        "value": "RSP LEVEL 4"
      },
      {
        "label": "RSP LEVEL 5",
        "value": "RSP LEVEL 5"
      },
      {
        "label": "SHIP SORTER",
        "value": "SHIP SORTER"
      },
      {
        "label": "SMARTPAC",
        "value": "SMARTPAC"
      },
      {
        "label": "TOTE SORTER",
        "value": "TOTE SORTER"
      },
      {
        "label": "TRANSHIP SORTER",
        "value": "TRANSHIP SORTER"
      },
      {
        "label": "WASTE",
        "value": "WASTE"
      }
    ],
    "instances_file_prefix": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/",
    "instances_file_suffix": ".json",
    "instances_files": [
      {
        "ETag": "\"d5ab88e5aac79f0270c4df38fc76211b\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE 1 MINISORTER.json",
        "LastModified": "2023-07-06 19:13:31",
        "Size": 169491,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"2d52b3ac56baf2c347b3cc5a83b3ba41\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE TRAY SORTERS.json",
        "LastModified": "2023-07-06 19:11:33",
        "Size": 52706,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"aef77756bf27a4660051d2965d7238b4\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AR FIELD.json",
        "LastModified": "2023-07-08 01:54:18",
        "Size": 459044,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"d4824a32702674453e14ea98e98a0392\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/EMPTY TOTE LANES.json",
        "LastModified": "2023-07-06 19:08:48",
        "Size": 30929,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"0dc3e31b34b442cc8a32611766ad829b\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/INBOUND SORTER.json",
        "LastModified": "2023-07-07 14:56:13",
        "Size": 85953,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"31678c5ee092b6cd6b066fcfe34d0637\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/OUTBOUND.json",
        "LastModified": "2023-07-08 01:53:03",
        "Size": 217082,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"897aed13d0ecb923a0642251375ee2e4\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/PACK.json",
        "LastModified": "2023-07-07 14:51:27",
        "Size": 96022,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"6b66dcbf14174ef5cb4488beb9c6b95d\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 2.json",
        "LastModified": "2023-07-07 14:46:03",
        "Size": 38208,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"03e388834bcb2960fd20a81ba93be712\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 3.json",
        "LastModified": "2023-07-07 14:46:21",
        "Size": 38439,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"96b1d70d6b14e9f9a03cbf1fde7f3258\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 4.json",
        "LastModified": "2023-07-07 14:46:34",
        "Size": 38333,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"6c8b4a21227a76151bfca40c25abc186\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 5.json",
        "LastModified": "2023-07-07 14:46:46",
        "Size": 38273,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"f2c10f54de8dbc30179f8cef737825ec\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SHIP SORTER.json",
        "LastModified": "2023-07-06 19:10:26",
        "Size": 25374,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"99d01fcc3f3c62e32c5a4c98b320b91f\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SMARTPAC.json",
        "LastModified": "2023-07-06 19:07:29",
        "Size": 19099,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"7a117bc9cf00e644518b06981e736f52\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TOTE SORTER.json",
        "LastModified": "2023-07-07 14:41:36",
        "Size": 82727,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"32c23ced5bb7a4ff7d0f166f85f006dd\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TRANSHIP SORTER.json",
        "LastModified": "2023-07-08 01:47:48",
        "Size": 13327,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"f0e92545033d5f070cd8884c7a16dac1\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/WASTE.json",
        "LastModified": "2023-07-08 01:47:36",
        "Size": 7784,
        "StorageClass": "STANDARD"
      }
    ],
    "loading": false,
    "migrate_enabled": false,
    "selected_flow_view": "OUTBOUND",
    "site_files": [
      {
        "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/",
        "LastModified": "2023-06-22 15:10:22",
        "Size": 0,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"3b31b83ba6617e83ef2a98edcedf9d9d\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/AFE 1 MINISORTER_FlowView.svg",
        "LastModified": "2023-07-06 19:13:31",
        "Size": 319635,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"db37b5cb4a0a74b4a46e3c65f968fbbf\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/AFE TRAY SORTERS_FlowView.svg",
        "LastModified": "2023-07-06 19:11:33",
        "Size": 105788,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"cdd14f701d2256a26ecad94e7c118f30\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/AR FIELD_FlowView.svg",
        "LastModified": "2023-07-08 01:54:18",
        "Size": 448282,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"4086b694863b38489bd980a40a3d686e\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/EMPTY TOTE LANES_FlowView.svg",
        "LastModified": "2023-07-06 19:08:47",
        "Size": 47625,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"9974714836554c5aa21683db6d7190a8\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/INBOUND SORTER_FlowView.svg",
        "LastModified": "2023-07-07 14:56:13",
        "Size": 170813,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"e86f2757a16dce8aa9160b4508f06257\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/OUTBOUND_FlowView.svg",
        "LastModified": "2023-07-08 01:53:03",
        "Size": 410568,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"8f64bed5643c9db4f7c0a57d506fe819\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/PACK_FlowView.svg",
        "LastModified": "2023-07-07 14:51:27",
        "Size": 185917,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"f1e70ba02a7b9e66a6391b67fd4a9166\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 2_FlowView.svg",
        "LastModified": "2023-07-07 14:46:03",
        "Size": 105170,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"35aa4d02852470107a6af6a5ca87e7d3\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 3_FlowView.svg",
        "LastModified": "2023-07-07 14:46:21",
        "Size": 105126,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"f47a62e8f45dc6d322a242ef7a12612a\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 4_FlowView.svg",
        "LastModified": "2023-07-07 14:46:34",
        "Size": 105122,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"496a0b6c937eef0bb3fd62a4e35b98da\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/RSP LEVEL 5_FlowView.svg",
        "LastModified": "2023-07-07 14:46:46",
        "Size": 105118,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"8f8b7b0fff1b9fb3c6f04b6a8a3ddc7e\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/SHIP SORTER_FlowView.svg",
        "LastModified": "2023-07-06 19:10:26",
        "Size": 67640,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"e8f87755974bd51d7e9b287daa1e9c57\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/SMARTPAC_FlowView.svg",
        "LastModified": "2023-07-06 19:07:28",
        "Size": 36300,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"2923edb101a98c30ad62429ac22d423c\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/TOTE SORTER_FlowView.svg",
        "LastModified": "2023-07-07 14:41:36",
        "Size": 167519,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"6ec75cac9a4da963f90fa05e765c67e5\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/TRANSHIP SORTER_FlowView.svg",
        "LastModified": "2023-07-08 01:47:48",
        "Size": 39505,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"62b9a05376699daab936fe799139435f\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/WASTE_FlowView.svg",
        "LastModified": "2023-07-08 01:47:36",
        "Size": 19002,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/",
        "LastModified": "2023-06-22 15:10:28",
        "Size": 0,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"d5ab88e5aac79f0270c4df38fc76211b\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE 1 MINISORTER.json",
        "LastModified": "2023-07-06 19:13:31",
        "Size": 169491,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"2d52b3ac56baf2c347b3cc5a83b3ba41\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AFE TRAY SORTERS.json",
        "LastModified": "2023-07-06 19:11:33",
        "Size": 52706,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"aef77756bf27a4660051d2965d7238b4\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/AR FIELD.json",
        "LastModified": "2023-07-08 01:54:18",
        "Size": 459044,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"d4824a32702674453e14ea98e98a0392\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/EMPTY TOTE LANES.json",
        "LastModified": "2023-07-06 19:08:48",
        "Size": 30929,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"0dc3e31b34b442cc8a32611766ad829b\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/INBOUND SORTER.json",
        "LastModified": "2023-07-07 14:56:13",
        "Size": 85953,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"31678c5ee092b6cd6b066fcfe34d0637\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/OUTBOUND.json",
        "LastModified": "2023-07-08 01:53:03",
        "Size": 217082,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"897aed13d0ecb923a0642251375ee2e4\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/PACK.json",
        "LastModified": "2023-07-07 14:51:27",
        "Size": 96022,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"6b66dcbf14174ef5cb4488beb9c6b95d\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 2.json",
        "LastModified": "2023-07-07 14:46:03",
        "Size": 38208,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"03e388834bcb2960fd20a81ba93be712\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 3.json",
        "LastModified": "2023-07-07 14:46:21",
        "Size": 38439,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"96b1d70d6b14e9f9a03cbf1fde7f3258\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 4.json",
        "LastModified": "2023-07-07 14:46:34",
        "Size": 38333,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"6c8b4a21227a76151bfca40c25abc186\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/RSP LEVEL 5.json",
        "LastModified": "2023-07-07 14:46:46",
        "Size": 38273,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"f2c10f54de8dbc30179f8cef737825ec\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SHIP SORTER.json",
        "LastModified": "2023-07-06 19:10:26",
        "Size": 25374,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"99d01fcc3f3c62e32c5a4c98b320b91f\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/SMARTPAC.json",
        "LastModified": "2023-07-06 19:07:29",
        "Size": 19099,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"7a117bc9cf00e644518b06981e736f52\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TOTE SORTER.json",
        "LastModified": "2023-07-07 14:41:36",
        "Size": 82727,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"32c23ced5bb7a4ff7d0f166f85f006dd\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/TRANSHIP SORTER.json",
        "LastModified": "2023-07-08 01:47:48",
        "Size": 13327,
        "StorageClass": "STANDARD"
      },
      {
        "ETag": "\"f0e92545033d5f070cd8884c7a16dac1\"",
        "Key": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/instance_configs/WASTE.json",
        "LastModified": "2023-07-08 01:47:36",
        "Size": 7784,
        "StorageClass": "STANDARD"
      }
    ],
    "site_folder": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/",
    "site_folder_destination": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/",
    "site_folder_source": "na-rme-scada-maps-hc/FlowViews-prod/YEG2/",
    "stage_destination": "prod",
    "stage_map": {
      "alpha": {
        "endpoint": "https://alpha.rmesdflowview.c4.rme.amazon.dev/",
        "region": "us-west-2"
      },
      "beta": {
        "endpoint": "https://beta.rmesdflowview.c4.rme.amazon.dev/",
        "region": "us-east-1"
      },
      "prod": {
        "endpoint": "https://rmesdflowview.c4.rme.amazon.dev/",
        "region": "us-east-2"
      }
    },
    "stage_options": [
      {
        "label": "Prod",
        "value": "prod"
      },
      {
        "label": "Beta",
        "value": "beta"
      },
      {
        "label": "Alpha",
        "value": "alpha"
      }
    ],
    "stage_source": "prod",
    "title_text": "FlowView Management",
    "whid": "YEG2",
    "whid_destination": "YEG2",
    "whid_destination_options": [
      {
        "label": "ABQ1",
        "value": "ABQ1"
      },
      {
        "label": "AGS1",
        "value": "AGS1"
      },
      {
        "label": "AMA1",
        "value": "AMA1"
      },
      {
        "label": "AUS2",
        "value": "AUS2"
      },
      {
        "label": "BDL4",
        "value": "BDL4"
      },
      {
        "label": "BOS3",
        "value": "BOS3"
      },
      {
        "label": "DEN4",
        "value": "DEN4"
      },
      {
        "label": "DEN8",
        "value": "DEN8"
      },
      {
        "label": "DET3",
        "value": "DET3"
      },
      {
        "label": "DET6",
        "value": "DET6"
      },
      {
        "label": "ELP1",
        "value": "ELP1"
      },
      {
        "label": "FAR1",
        "value": "FAR1"
      },
      {
        "label": "FAT2",
        "value": "FAT2"
      },
      {
        "label": "FOE1",
        "value": "FOE1"
      },
      {
        "label": "FSD1",
        "value": "FSD1"
      },
      {
        "label": "FTW5",
        "value": "FTW5"
      },
      {
        "label": "FWA6",
        "value": "FWA6"
      },
      {
        "label": "GEG2",
        "value": "GEG2"
      },
      {
        "label": "HOU6",
        "value": "HOU6"
      },
      {
        "label": "HOU8",
        "value": "HOU8"
      },
      {
        "label": "HSV1",
        "value": "HSV1"
      },
      {
        "label": "ICT2",
        "value": "ICT2"
      },
      {
        "label": "IGQ1",
        "value": "IGQ1"
      },
      {
        "label": "IGQ2",
        "value": "IGQ2"
      },
      {
        "label": "ILG1",
        "value": "ILG1"
      },
      {
        "label": "LFT1",
        "value": "LFT1"
      },
      {
        "label": "LIT1",
        "value": "LIT1"
      },
      {
        "label": "LIT2",
        "value": "LIT2"
      },
      {
        "label": "LUK2",
        "value": "LUK2"
      },
      {
        "label": "MLI1",
        "value": "MLI1"
      },
      {
        "label": "MQY1",
        "value": "MQY1"
      },
      {
        "label": "MTN1",
        "value": "MTN1"
      },
      {
        "label": "OKC2",
        "value": "OKC2"
      },
      {
        "label": "ORD5",
        "value": "ORD5"
      },
      {
        "label": "ORF3",
        "value": "ORF3"
      },
      {
        "label": "PAE2",
        "value": "PAE2"
      },
      {
        "label": "RIC4",
        "value": "RIC4"
      },
      {
        "label": "ROC1",
        "value": "ROC1"
      },
      {
        "label": "SAN3",
        "value": "SAN3"
      },
      {
        "label": "SAT3",
        "value": "SAT3"
      },
      {
        "label": "SAT4",
        "value": "SAT4"
      },
      {
        "label": "SAV4",
        "value": "SAV4"
      },
      {
        "label": "SCK6",
        "value": "SCK6"
      },
      {
        "label": "SMF6",
        "value": "SMF6"
      },
      {
        "label": "STL3",
        "value": "STL3"
      },
      {
        "label": "SYR1",
        "value": "SYR1"
      },
      {
        "label": "TEB4",
        "value": "TEB4"
      },
      {
        "label": "TLH2",
        "value": "TLH2"
      },
      {
        "label": "TPA4",
        "value": "TPA4"
      },
      {
        "label": "TYS1",
        "value": "TYS1"
      },
      {
        "label": "YEG2",
        "value": "YEG2"
      },
      {
        "label": "YOO1",
        "value": "YOO1"
      },
      {
        "label": "YOW3",
        "value": "YOW3"
      }
    ],
    "whid_options": [
      {
        "label": "ABQ1",
        "value": "ABQ1"
      },
      {
        "label": "AGS1",
        "value": "AGS1"
      },
      {
        "label": "AMA1",
        "value": "AMA1"
      },
      {
        "label": "AUS2",
        "value": "AUS2"
      },
      {
        "label": "BDL4",
        "value": "BDL4"
      },
      {
        "label": "BOS3",
        "value": "BOS3"
      },
      {
        "label": "DEN4",
        "value": "DEN4"
      },
      {
        "label": "DEN8",
        "value": "DEN8"
      },
      {
        "label": "DET3",
        "value": "DET3"
      },
      {
        "label": "DET6",
        "value": "DET6"
      },
      {
        "label": "ELP1",
        "value": "ELP1"
      },
      {
        "label": "FAR1",
        "value": "FAR1"
      },
      {
        "label": "FAT2",
        "value": "FAT2"
      },
      {
        "label": "FOE1",
        "value": "FOE1"
      },
      {
        "label": "FSD1",
        "value": "FSD1"
      },
      {
        "label": "FTW5",
        "value": "FTW5"
      },
      {
        "label": "FWA6",
        "value": "FWA6"
      },
      {
        "label": "GEG2",
        "value": "GEG2"
      },
      {
        "label": "HOU6",
        "value": "HOU6"
      },
      {
        "label": "HOU8",
        "value": "HOU8"
      },
      {
        "label": "HSV1",
        "value": "HSV1"
      },
      {
        "label": "ICT2",
        "value": "ICT2"
      },
      {
        "label": "IGQ1",
        "value": "IGQ1"
      },
      {
        "label": "IGQ2",
        "value": "IGQ2"
      },
      {
        "label": "ILG1",
        "value": "ILG1"
      },
      {
        "label": "LFT1",
        "value": "LFT1"
      },
      {
        "label": "LIT1",
        "value": "LIT1"
      },
      {
        "label": "LIT2",
        "value": "LIT2"
      },
      {
        "label": "LUK2",
        "value": "LUK2"
      },
      {
        "label": "MLI1",
        "value": "MLI1"
      },
      {
        "label": "MQY1",
        "value": "MQY1"
      },
      {
        "label": "MTN1",
        "value": "MTN1"
      },
      {
        "label": "OKC2",
        "value": "OKC2"
      },
      {
        "label": "ORD5",
        "value": "ORD5"
      },
      {
        "label": "ORF3",
        "value": "ORF3"
      },
      {
        "label": "PAE2",
        "value": "PAE2"
      },
      {
        "label": "RIC4",
        "value": "RIC4"
      },
      {
        "label": "ROC1",
        "value": "ROC1"
      },
      {
        "label": "SAN3",
        "value": "SAN3"
      },
      {
        "label": "SAT3",
        "value": "SAT3"
      },
      {
        "label": "SAT4",
        "value": "SAT4"
      },
      {
        "label": "SAV4",
        "value": "SAV4"
      },
      {
        "label": "SCK6",
        "value": "SCK6"
      },
      {
        "label": "SMF6",
        "value": "SMF6"
      },
      {
        "label": "STL3",
        "value": "STL3"
      },
      {
        "label": "SYR1",
        "value": "SYR1"
      },
      {
        "label": "TEB4",
        "value": "TEB4"
      },
      {
        "label": "TLH2",
        "value": "TLH2"
      },
      {
        "label": "TPA4",
        "value": "TPA4"
      },
      {
        "label": "TYS1",
        "value": "TYS1"
      },
      {
        "label": "YEG2",
        "value": "YEG2"
      },
      {
        "label": "YOO1",
        "value": "YOO1"
      },
      {
        "label": "YOW3",
        "value": "YOW3"
      }
    ],
    "whid_source": "YEG2",
    "whid_source_options": [
      {
        "label": "ABQ1",
        "value": "ABQ1"
      },
      {
        "label": "AGS1",
        "value": "AGS1"
      },
      {
        "label": "AMA1",
        "value": "AMA1"
      },
      {
        "label": "AUS2",
        "value": "AUS2"
      },
      {
        "label": "BDL4",
        "value": "BDL4"
      },
      {
        "label": "BOS3",
        "value": "BOS3"
      },
      {
        "label": "DEN4",
        "value": "DEN4"
      },
      {
        "label": "DEN8",
        "value": "DEN8"
      },
      {
        "label": "DET3",
        "value": "DET3"
      },
      {
        "label": "DET6",
        "value": "DET6"
      },
      {
        "label": "ELP1",
        "value": "ELP1"
      },
      {
        "label": "FAR1",
        "value": "FAR1"
      },
      {
        "label": "FAT2",
        "value": "FAT2"
      },
      {
        "label": "FOE1",
        "value": "FOE1"
      },
      {
        "label": "FSD1",
        "value": "FSD1"
      },
      {
        "label": "FTW5",
        "value": "FTW5"
      },
      {
        "label": "FWA6",
        "value": "FWA6"
      },
      {
        "label": "GEG2",
        "value": "GEG2"
      },
      {
        "label": "HOU6",
        "value": "HOU6"
      },
      {
        "label": "HOU8",
        "value": "HOU8"
      },
      {
        "label": "HSV1",
        "value": "HSV1"
      },
      {
        "label": "ICT2",
        "value": "ICT2"
      },
      {
        "label": "IGQ1",
        "value": "IGQ1"
      },
      {
        "label": "IGQ2",
        "value": "IGQ2"
      },
      {
        "label": "ILG1",
        "value": "ILG1"
      },
      {
        "label": "LFT1",
        "value": "LFT1"
      },
      {
        "label": "LIT1",
        "value": "LIT1"
      },
      {
        "label": "LIT2",
        "value": "LIT2"
      },
      {
        "label": "LUK2",
        "value": "LUK2"
      },
      {
        "label": "MLI1",
        "value": "MLI1"
      },
      {
        "label": "MQY1",
        "value": "MQY1"
      },
      {
        "label": "MTN1",
        "value": "MTN1"
      },
      {
        "label": "OKC2",
        "value": "OKC2"
      },
      {
        "label": "ORD5",
        "value": "ORD5"
      },
      {
        "label": "ORF3",
        "value": "ORF3"
      },
      {
        "label": "PAE2",
        "value": "PAE2"
      },
      {
        "label": "RIC4",
        "value": "RIC4"
      },
      {
        "label": "ROC1",
        "value": "ROC1"
      },
      {
        "label": "SAN3",
        "value": "SAN3"
      },
      {
        "label": "SAT3",
        "value": "SAT3"
      },
      {
        "label": "SAT4",
        "value": "SAT4"
      },
      {
        "label": "SAV4",
        "value": "SAV4"
      },
      {
        "label": "SCK6",
        "value": "SCK6"
      },
      {
        "label": "SMF6",
        "value": "SMF6"
      },
      {
        "label": "STL3",
        "value": "STL3"
      },
      {
        "label": "SYR1",
        "value": "SYR1"
      },
      {
        "label": "TEB4",
        "value": "TEB4"
      },
      {
        "label": "TLH2",
        "value": "TLH2"
      },
      {
        "label": "TPA4",
        "value": "TPA4"
      },
      {
        "label": "TYS1",
        "value": "TYS1"
      },
      {
        "label": "YEG2",
        "value": "YEG2"
      },
      {
        "label": "YOO1",
        "value": "YOO1"
      },
      {
        "label": "YOW3",
        "value": "YOW3"
      }
    ]
  },
  "events": {
    "system": {
      "onStartup": {
        "config": {
          "script": "\t# initialize form via message handler\n\tsystem.perspective.sendMessage(\u0027request_initialize_form\u0027, scope\u003d\u0027view\u0027)\n\t"
        },
        "scope": "G",
        "type": "script"
      }
    }
  },
  "params": {
    "selected_flow_view": "OUTBOUND",
    "selected_site": "MTN1",
    "selected_stage": "prod"
  },
  "propConfig": {
    "custom.bucket": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.s3.bucket_name"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.current_flow_view": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.selected_flow_view"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.current_stage": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.stage_config.stage"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.enabled_whids": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.enabled_whids"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.flow_view": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.selected_flow_view"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.flow_view_copy_operation": {
      "binding": {
        "config": {
          "expression": "if(isNull({view.custom.stage_source})||!len({view.custom.stage_source})\r\n\t||isNull({view.custom.stage_destination})||!len({view.custom.stage_destination})\r\n//\t||{view.custom.stage_source}\u003d{view.custom.stage_destination}\r\n\t||({view.custom.stage_source}\u003d{view.custom.stage_destination}\r\n\t\t\u0026\u0026{view.custom.whid_source}\u003d{view.custom.whid_destination}\r\n\t\t\u0026\u0026{view.custom.flow_view_source}\u003d{view.custom.flow_view_destination})\r\n\t,null,\r\n\tif({view.custom.whid_source}\u003d\u0027ALL\u0027,\u0027migrate_stages\u0027,\r\n\tif({view.custom.whid_source}\u003d{view.custom.whid_destination}\r\n\t\t\u0026\u0026{view.custom.flow_view_source}\u003d\u0027ALL\u0027,\u0027migrate_stages\u0027,\r\n\tif({view.custom.flow_view_source}\u003d\u0027ALL\u0027,\u0027migrate_sites\u0027,\r\n\t\u0027migrate_flowviews\u0027))))"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.flow_view_copy_option": {
      "persistent": true
    },
    "custom.flow_view_copy_tooltip": {
      "binding": {
        "config": {
          "expression": "{view.custom.stage_source}+{view.custom.stage_destination}\r\n+{view.custom.whid_source}+{view.custom.whid_destination}\r\n+{view.custom.flow_view_source}+{view.custom.flow_view_destination}\r\n+{view.custom.flow_view_copy_operation}+{view.custom.flow_view_copy_option}"
        },
        "transforms": [
          {
            "code": "\toperation \u003d self.custom.flow_view_copy_operation\n\tif not operation:\n\t\treturn \u0027\u0027\n\tsrc_stage \u003d self.custom.stage_source\n\tdest_stage \u003d self.custom.stage_destination\n\tsrc_whid \u003d self.custom.whid_source\n\tdest_whid \u003d self.custom.whid_destination\n\tsrc_flowview \u003d self.custom.flow_view_source\n\tdest_flowview \u003d self.custom.flow_view_destination\n\tcopy_option \u003d self.custom.flow_view_copy_option\n\tmsg \u003d \u0027\u0027\n\tif operation \u003d\u003d \u0027migrate_stages\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_sites\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_flowviews\u0027:\n\t\tif copy_option \u003d\u003d \u0027both\u0027:\n\t\t\tcopy_prompt \u003d \u0027both svg image and config json files\u0027\n\t\telif copy_option \u003d\u003d \u0027svg\u0027:\n\t\t\tcopy_prompt \u003d \u0027svg image file\u0027\n\t\telse:\n\t\t\tcopy_prompt \u003d \u0027config json file\u0027\n\t\tmsg \u003d (\u0027Copy %s for flowview: %s to flowview: %s \\n\u0027\n\t\t\t\u0027From whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage?\u0027) % (\n\t\t\tcopy_prompt, src_flowview, dest_flowview, \n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\treturn msg",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.flow_view_destination": {
      "persistent": true
    },
    "custom.flow_view_destination_options": {
      "binding": {
        "config": {
          "expression": "{view.custom.bucket}+{view.custom.site_folder_destination}"
        },
        "transforms": [
          {
            "code": "\tfrom s3 import S3API\n\tbucket \u003d self.custom.bucket\n\tprefix \u003d self.custom.site_folder_destination\n\tstage \u003d self.custom.current_stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\t# fetch all files in site folder\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tsite_files \u003d s3m.list_objects(prefix\u003dprefix, bucket\u003dbucket)\n\t# parse out flow-view files from the site files\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\tflow_view_files \u003d [x for x in site_files if x[\u0027Key\u0027].startswith(prefix) \n\t\t\t\t\t\tand x[\u0027Key\u0027].endswith(suffix)]\n\t# build-out options from flow-view files, prepending with \u0027ALL\u0027 if user is sadmin\n\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027), \n\t\t\t\u0027label\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027)} \n\t\t\tfor x in flow_view_files])\n\treturn options",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.flow_view_edit_mode": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.edit_mode"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.flow_view_file_suffix": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.s3.flow_view_file_suffix"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.flow_view_files": {
      "binding": {
        "config": {
          "path": "view.custom.site_files"
        },
        "transforms": [
          {
            "code": "\tprefix \u003d self.custom.site_folder\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\treturn [x for x in value \n\t\tif x.Key.startswith(prefix) and x.Key.endswith(suffix)]",
            "type": "script"
          }
        ],
        "type": "property"
      }
    },
    "custom.flow_view_options": {
      "binding": {
        "config": {
          "path": "view.custom.flow_view_files"
        },
        "transforms": [
          {
            "code": "\tprefix \u003d self.custom.site_folder\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x.Key.replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027), \n\t\t\t\u0027label\u0027: x.Key.replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027)} \n\t\t\tfor x in value])\n\treturn options",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "custom.flow_view_source": {
      "persistent": true
    },
    "custom.flow_view_source_options": {
      "binding": {
        "config": {
          "expression": "{view.custom.bucket}+{view.custom.site_folder_source}"
        },
        "transforms": [
          {
            "code": "\tfrom s3 import S3API\n\tbucket \u003d self.custom.bucket\n\tprefix \u003d self.custom.site_folder_source\n\tstage \u003d self.custom.current_stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\t# fetch all files in site folder\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tsite_files \u003d s3m.list_objects(prefix\u003dprefix, bucket\u003dbucket)\n\t# parse out flow-view files from the site files\n\tsuffix \u003d self.custom.flow_view_file_suffix\n\tflow_view_files \u003d [x for x in site_files if x[\u0027Key\u0027].startswith(prefix) \n\t\t\t\t\t\tand x[\u0027Key\u0027].endswith(suffix)]\n\t# build-out options from flow-view files, prepending with \u0027ALL\u0027 if user is sadmin\n\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027), \n\t\t\t\u0027label\u0027: x[\u0027Key\u0027].replace(prefix,\u0027\u0027).replace(suffix,\u0027\u0027)} \n\t\t\tfor x in flow_view_files])\n\treturn options",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.instances_file_prefix": {
      "binding": {
        "config": {
          "expression": "stringFormat(\u0027%sinstance_configs/\u0027,{view.custom.site_folder})"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.instances_file_suffix": {
      "persistent": true
    },
    "custom.instances_files": {
      "binding": {
        "config": {
          "path": "view.custom.site_files"
        },
        "transforms": [
          {
            "code": "\tprefix \u003d self.custom.instances_file_prefix\n\tsuffix \u003d self.custom.instances_file_suffix\n\treturn [x for x in value \n\t\tif x.Key.startswith(prefix) and x.Key.endswith(suffix)]",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "custom.loading": {
      "persistent": true
    },
    "custom.migrate_enabled": {
      "binding": {
        "config": {
          "expression": "!isNull({view.custom.flow_view_copy_operation})\r\n\u0026\u0026\r\n({view.custom.flow_view_edit_mode.sadmin_enabled}\r\n||({view.custom.flow_view_edit_mode.admin_enabled}\r\n\t\u0026\u0026{view.custom.flow_view_copy_operation}\u003d\u0027migrate_flowviews\u0027)\r\n)"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.selected_flow_view": {
      "persistent": true
    },
    "custom.site_files": {
      "binding": {
        "config": {
          "expression": "{view.custom.bucket}+{view.custom.site_folder}"
        },
        "transforms": [
          {
            "code": "\tfrom s3 import S3API\n\tbucket \u003d self.custom.bucket\n\tobj_key \u003d self.custom.site_folder\n\tstage \u003d self.custom.current_stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\treturn s3m.list_objects(prefix\u003dobj_key, bucket\u003dbucket)",
            "type": "script"
          }
        ],
        "type": "expr"
      },
      "persistent": true
    },
    "custom.site_folder": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.s3.site_obj_prefix"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.site_folder_destination": {
      "binding": {
        "config": {
          "expression": "stringFormat(\u0027na-rme-scada-maps-hc/FlowViews-%s/%s/\u0027,\r\n\t{view.custom.stage_destination},{view.custom.whid_destination})"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.site_folder_source": {
      "binding": {
        "config": {
          "expression": "stringFormat(\u0027na-rme-scada-maps-hc/FlowViews-%s/%s/\u0027,\r\n\t{view.custom.stage_source},{view.custom.whid_source})"
        },
        "type": "expr"
      },
      "persistent": true
    },
    "custom.stage_destination": {
      "persistent": true
    },
    "custom.stage_map": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.stage_config.map"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.stage_options": {
      "binding": {
        "config": {
          "path": "view.custom.stage_map"
        },
        "transforms": [
          {
            "code": "\treturn [{\u0027value\u0027: x, \u0027label\u0027: x.capitalize()} for x in value]",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "custom.stage_source": {
      "persistent": true
    },
    "custom.title_text": {
      "persistent": true
    },
    "custom.whid": {
      "binding": {
        "config": {
          "path": "session.custom.flow_view_config.site_config.whid"
        },
        "type": "property"
      },
      "persistent": true
    },
    "custom.whid_destination": {
      "persistent": true
    },
    "custom.whid_destination_options": {
      "binding": {
        "config": {
          "path": "view.custom.stage_destination"
        },
        "transforms": [
          {
            "code": "\tfrom s3 import S3API\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(api_stage\u003dvalue, username\u003dusername)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tbucket \u003d self.custom.bucket\n\treturn s3m.fetch_site_list_by_stage(bucket, value)\n\t",
            "type": "script"
          },
          {
            "code": "\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x, \u0027label\u0027: x} for x in value])\n\treturn options",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "custom.whid_options": {
      "binding": {
        "config": {
          "path": "view.custom.enabled_whids"
        },
        "transforms": [
          {
            "code": "\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x, \u0027label\u0027: x} for x in value])\n\treturn options\n",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "custom.whid_source": {
      "persistent": true
    },
    "custom.whid_source_options": {
      "binding": {
        "config": {
          "path": "view.custom.stage_source"
        },
        "transforms": [
          {
            "code": "\tfrom s3 import S3API\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(api_stage\u003dvalue, username\u003dusername)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\tbucket \u003d self.custom.bucket\n\treturn s3m.fetch_site_list_by_stage(bucket, value)\n\t",
            "type": "script"
          },
          {
            "code": "\tif self.custom.flow_view_edit_mode.sadmin_enabled:\n\t\toptions \u003d [{\u0027value\u0027: \u0027ALL\u0027, \u0027label\u0027: \u0027ALL\u0027}]\n\telse:\n\t\toptions \u003d []\n\toptions.extend([{\u0027value\u0027: x, \u0027label\u0027: x} for x in value])\n\treturn options",
            "type": "script"
          }
        ],
        "type": "property"
      },
      "persistent": true
    },
    "params.selected_flow_view": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.selected_site": {
      "paramDirection": "input",
      "persistent": true
    },
    "params.selected_stage": {
      "paramDirection": "input",
      "persistent": true
    }
  },
  "props": {
    "defaultSize": {
      "height": 140,
      "width": 900
    }
  },
  "root": {
    "children": [
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "175px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Source Stage:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "Dropdown",
                  "tooltip": {
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    },
                    "text": "Click here to select a different \nstage folder to manage"
                  }
                },
                "position": {
                  "basis": "150px",
                  "shrink": 0
                },
                "propConfig": {
                  "props.options": {
                    "binding": {
                      "config": {
                        "path": "view.custom.stage_options"
                      },
                      "type": "property"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.stage_source"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "search": {
                    "searchParam": "ou"
                  },
                  "style": {
                    "margin": "2px",
                    "marginRight": "5px"
                  }
                },
                "type": "ia.input.dropdown"
              }
            ],
            "meta": {
              "name": "FlexContainer Source"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "175px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Destination Stage:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "Dropdown",
                  "tooltip": {
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    },
                    "text": "Click here to select a different \nstage folder to manage"
                  }
                },
                "position": {
                  "basis": "150px",
                  "shrink": 0
                },
                "propConfig": {
                  "props.enabled": {
                    "binding": {
                      "config": {
                        "expression": "{view.custom.flow_view_edit_mode.admin_enabled}\r\n||{view.custom.flow_view_edit_mode.sadmin_enabled}"
                      },
                      "type": "expr"
                    }
                  },
                  "props.options": {
                    "binding": {
                      "config": {
                        "path": "view.custom.stage_options"
                      },
                      "type": "property"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.stage_destination"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "search": {
                    "searchParam": "ou"
                  },
                  "style": {
                    "margin": "2px",
                    "marginRight": "5px"
                  }
                },
                "type": "ia.input.dropdown"
              }
            ],
            "meta": {
              "name": "FlexContainer Destination"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "FlexContainer Stages"
        },
        "position": {
          "basis": "30px",
          "shrink": 0
        },
        "type": "ia.container.flex"
      },
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "175px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Source WHID:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "Dropdown",
                  "tooltip": {
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    },
                    "text": "Click here to select a different \nstage folder to manage"
                  }
                },
                "position": {
                  "basis": "150px",
                  "shrink": 0
                },
                "propConfig": {
                  "props.options": {
                    "binding": {
                      "config": {
                        "path": "view.custom.whid_source_options"
                      },
                      "type": "property"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.whid_source"
                      },
                      "type": "property"
                    },
                    "onChange": {
                      "enabled": null,
                      "script": "\tif not missedEvents and origin \u003d\u003d \u0027Browser\u0027:\n\t\tif currentValue.value:\n\t\t\tself.view.custom.whid_destination \u003d currentValue.value\n\t\t"
                    }
                  }
                },
                "props": {
                  "search": {
                    "searchParam": "smf"
                  },
                  "style": {
                    "margin": "2px",
                    "marginRight": "5px"
                  }
                },
                "type": "ia.input.dropdown"
              }
            ],
            "meta": {
              "name": "FlexContainer Source"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "175px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Destination WHID:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "Dropdown",
                  "tooltip": {
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    },
                    "text": "Click here to select a different \nstage folder to manage"
                  }
                },
                "position": {
                  "basis": "150px",
                  "shrink": 0
                },
                "propConfig": {
                  "props.enabled": {
                    "binding": {
                      "config": {
                        "path": "view.custom.flow_view_edit_mode.sadmin_enabled"
                      },
                      "type": "property"
                    }
                  },
                  "props.options": {
                    "binding": {
                      "config": {
                        "path": "view.custom.whid_destination_options"
                      },
                      "type": "property"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.whid_destination"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "search": {
                    "searchParam": "sm"
                  },
                  "style": {
                    "margin": "2px",
                    "marginRight": "5px"
                  }
                },
                "type": "ia.input.dropdown"
              }
            ],
            "meta": {
              "name": "FlexContainer Destination"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "propConfig": {
              "position.display": {
                "binding": {
                  "config": {
                    "expression": "!isNull({view.custom.whid_source})\r\n\u0026\u0026len({view.custom.whid_source})\r\n\u0026\u0026{view.custom.whid_source}!\u003d\u0027ALL\u0027"
                  },
                  "type": "expr"
                }
              }
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "FlexContainer Whids"
        },
        "position": {
          "basis": "30px",
          "shrink": 0
        },
        "type": "ia.container.flex"
      },
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "175px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Source Flowview:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "Dropdown",
                  "tooltip": {
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    },
                    "text": "Click here to select a different \nstage folder to manage"
                  }
                },
                "position": {
                  "basis": "250px",
                  "shrink": 0
                },
                "propConfig": {
                  "props.options": {
                    "binding": {
                      "config": {
                        "path": "view.custom.flow_view_source_options"
                      },
                      "type": "property"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.flow_view_source"
                      },
                      "type": "property"
                    },
                    "onChange": {
                      "enabled": null,
                      "script": "\tif not missedEvents and origin \u003d\u003d \u0027Browser\u0027:\n\t\tif currentValue.value:\n\t\t\tself.view.custom.flow_view_destination \u003d currentValue.value\n\t"
                    }
                  }
                },
                "props": {
                  "search": {
                    "searchParam": "ou"
                  },
                  "style": {
                    "margin": "2px",
                    "marginRight": "5px"
                  }
                },
                "type": "ia.input.dropdown"
              }
            ],
            "meta": {
              "name": "FlexContainer Source"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "basis": "175px",
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Destination Flowview:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "Dropdown",
                  "tooltip": {
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    },
                    "text": "Click here to select a different \nstage folder to manage"
                  }
                },
                "position": {
                  "basis": "250px",
                  "shrink": 0
                },
                "propConfig": {
                  "props.enabled": {
                    "binding": {
                      "config": {
                        "path": "view.custom.flow_view_edit_mode.sadmin_enabled"
                      },
                      "type": "property"
                    }
                  },
                  "props.options": {
                    "binding": {
                      "config": {
                        "path": "view.custom.flow_view_destination_options"
                      },
                      "type": "property"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.flow_view_destination"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "search": {
                    "searchParam": "ou"
                  },
                  "style": {
                    "margin": "2px",
                    "marginRight": "5px"
                  }
                },
                "type": "ia.input.dropdown"
              }
            ],
            "meta": {
              "name": "FlexContainer Destination"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "propConfig": {
              "position.display": {
                "binding": {
                  "config": {
                    "expression": "!isNull({view.custom.flow_view_source})\r\n\u0026\u0026len({view.custom.flow_view_source})\r\n\u0026\u0026{view.custom.flow_view_source}!\u003d\u0027ALL\u0027"
                  },
                  "type": "expr"
                }
              }
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "FlexContainer Flowviews"
        },
        "position": {
          "basis": "30px",
          "shrink": 0
        },
        "type": "ia.container.flex"
      },
      {
        "children": [
          {
            "children": [
              {
                "meta": {
                  "name": "Label"
                },
                "position": {
                  "shrink": 0
                },
                "props": {
                  "style": {
                    "classes": "Framework/Card/Label Text/RightAlign_with_Padding",
                    "paddingLeft": "5px"
                  },
                  "text": "Copy:"
                },
                "type": "ia.display.label"
              },
              {
                "meta": {
                  "name": "RadioGroup"
                },
                "position": {
                  "shrink": 0
                },
                "propConfig": {
                  "position.display": {
                    "binding": {
                      "config": {
                        "expression": "!isNull({view.custom.flow_view_source})\r\n\u0026\u0026len({view.custom.flow_view_source})"
                      },
                      "type": "expr"
                    }
                  },
                  "props.enabled": {
                    "binding": {
                      "config": {
                        "expression": "{view.custom.flow_view_edit_mode.admin_enabled}\r\n||{view.custom.flow_view_edit_mode.sadmin_enabled}"
                      },
                      "type": "expr"
                    }
                  },
                  "props.value": {
                    "binding": {
                      "config": {
                        "bidirectional": true,
                        "path": "view.custom.flow_view_copy_option"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "radioStyle": {
                    "fontSize": "12px"
                  },
                  "radios": [
                    {
                      "selected": true,
                      "text": "Both Files",
                      "value": "both"
                    },
                    {
                      "selected": false,
                      "text": "SVG only",
                      "value": "svg"
                    },
                    {
                      "selected": false,
                      "text": "JSON only",
                      "value": "json"
                    }
                  ]
                },
                "type": "ia.input.radio-group"
              }
            ],
            "meta": {
              "name": "FlexContainer Radios"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "props": {
              "justify": "center"
            },
            "type": "ia.container.flex"
          },
          {
            "children": [
              {
                "events": {
                  "component": {
                    "onActionPerformed": {
                      "config": {
                        "script": "\tsystem.perspective.sendMessage(\u0027request_initialize_form\u0027, scope\u003d\u0027view\u0027)\n\t"
                      },
                      "scope": "G",
                      "type": "script"
                    }
                  }
                },
                "meta": {
                  "name": "Clear Form"
                },
                "position": {
                  "shrink": 0
                },
                "props": {
                  "image": {
                    "icon": {
                      "path": "material/refresh"
                    }
                  },
                  "primary": false,
                  "style": {
                    "margin": "2px",
                    "padding": "4px"
                  },
                  "text": "Reset Form"
                },
                "type": "ia.input.button"
              },
              {
                "events": {
                  "component": {
                    "onActionPerformed": {
                      "config": {
                        "script": "\t# call-up the confirm dialog to allow the user to decide if they\n\t# really want to copy/migrate the flow-view files in S3\n\tself.show_confirm_dialog({})"
                      },
                      "scope": "G",
                      "type": "script"
                    }
                  }
                },
                "meta": {
                  "name": "Copy Files",
                  "tooltip": {
                    "enabled": true,
                    "location": "bottom",
                    "style": {
                      "whiteSpace": "pre"
                    }
                  }
                },
                "position": {
                  "shrink": 0
                },
                "propConfig": {
                  "meta.tooltip.text": {
                    "binding": {
                      "config": {
                        "path": "view.custom.flow_view_copy_tooltip"
                      },
                      "type": "property"
                    }
                  },
                  "props.enabled": {
                    "binding": {
                      "config": {
                        "path": "view.custom.migrate_enabled"
                      },
                      "type": "property"
                    }
                  }
                },
                "props": {
                  "image": {
                    "height": 20,
                    "icon": {
                      "path": "material/file_copy"
                    },
                    "width": 20
                  },
                  "style": {
                    "margin": "2px",
                    "padding": "4px"
                  },
                  "text": "Copy Files"
                },
                "scripts": {
                  "customMethods": [
                    {
                      "name": "show_success_dialog",
                      "params": [
                        "msg\u003dNone"
                      ],
                      "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"success\", \n\t\t\"Flow View Files Copied\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t"
                    },
                    {
                      "name": "show_warning_dialog",
                      "params": [
                        "msg\u003dNone"
                      ],
                      "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"warning\", \n\t\t\"Flow View Files NOT Copied\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t"
                    },
                    {
                      "name": "show_error_dialog",
                      "params": [
                        "msg\u003dNone"
                      ],
                      "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"error\", \n\t\t\"Flow View Files Copy Error!\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t\t\t\t"
                    },
                    {
                      "name": "update_bindings",
                      "params": [],
                      "script": "\t\"\"\"\n\t\tAfter data saved to S3, refresh session and view bindings\n\t\"\"\"\n\tself.view.custom.loading \u003d False\n\t\t"
                    },
                    {
                      "name": "copy_operation",
                      "params": [],
                      "script": "\t\"\"\"\n\t\tCall s3.S3API().migrate_*() method using user selections\n\t* \u003d [\u0027stages\u0027, \u0027sites\u0027, \u0027flowviews\u0027] depending on user selections\n\t\"\"\"\n\tfrom s3 import S3API\n\tfrom pprint import pformat\n\tfrom helper.helper import sanitize_tree\n\t\n\tstage \u003d self.session.custom.flow_view_config.stage_config.stage\n\tusername \u003d self.session.props.auth.user.userName\n\t# DEVNOTE 2023-04-21: force API call to prod\n#\ts3m \u003d S3API(stage, username)\n\ts3m \u003d S3API(\u0027prod\u0027, username)\n\t# grab local variables from view custom props\n\tsrc_stage \u003d self.view.custom.stage_source\n\tdest_stage \u003d self.view.custom.stage_destination\n\tsrc_whid \u003d self.view.custom.whid_source\n\tdest_whid \u003d self.view.custom.whid_destination\n\tsrc_flowview \u003d self.view.custom.flow_view_source\n\tdest_flowview \u003d self.view.custom.flow_view_destination\n\tcopy_option \u003d self.view.custom.flow_view_copy_option\n\toperation \u003d self.view.custom.flow_view_copy_operation\n\t# pack up params based on operation selected\n\tparams \u003d {}\n\tif operation \u003d\u003d \u0027migrate_stages\u0027:\n\t\t# Lambda expects None for whid param if migrating all stage folder contents\n\t\tif src_whid \u003d\u003d \u0027ALL\u0027:\n\t\t\tsrc_whid \u003d None\n\t\tparams \u003d {\u0027src_stage\u0027: src_stage, \u0027dest_stage\u0027: dest_stage, \u0027whid\u0027: src_whid}\n\telif operation \u003d\u003d \u0027migrate_sites\u0027:\n\t\tparams \u003d {\u0027src_stage\u0027: src_stage, \u0027dest_stage\u0027: dest_stage,\n\t\t\t\t\t\u0027src_whid\u0027: src_whid, \u0027dest_whid\u0027: dest_whid}\n\telif operation \u003d\u003d \u0027migrate_flowviews\u0027:\n\t\tparams \u003d {\u0027src_stage\u0027: src_stage, \u0027dest_stage\u0027: dest_stage,\n\t\t\t\t\t\u0027src_whid\u0027: src_whid, \u0027dest_whid\u0027: dest_whid,\n\t\t\t\t\t\u0027src_flowview\u0027: src_flowview, \u0027dest_flowview\u0027: dest_flowview,\n\t\t\t\t\t\u0027copy_option\u0027: copy_option}\n\ttry:\n\t\tresp \u003d getattr(s3m, operation)(**params)\n\t\tmsg \u003d pformat(sanitize_tree(resp))\n\t\tsystem.perspective.print(msg)\n\t\tself.show_success_dialog(msg)\n\t\tself.update_bindings()\n\texcept:\n\t\timport traceback\n\t\tmsg \u003d \u0027Error executing %s operation! \\nError: %s\u0027 % (\n\t\t\t\toperation, traceback.format_exc())\n\t\tsystem.perspective.print(msg)\n\t\tself.show_error_dialog(msg)\n\t"
                    },
                    {
                      "name": "show_confirm_dialog",
                      "params": [
                        "payload\u003dNone"
                      ],
                      "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add payload of data to pass to the popup\n\toperation \u003d self.view.custom.flow_view_copy_operation\n\tsrc_stage \u003d self.view.custom.stage_source\n\tdest_stage \u003d self.view.custom.stage_destination\n\tsrc_whid \u003d self.view.custom.whid_source\n\tdest_whid \u003d self.view.custom.whid_destination\n\tsrc_flowview \u003d self.view.custom.flow_view_source\n\tdest_flowview \u003d self.view.custom.flow_view_destination\n\tcopy_option \u003d self.view.custom.flow_view_copy_option\n\tmsg \u003d \u0027\u0027\n\tif operation \u003d\u003d \u0027migrate_stages\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_sites\u0027:\n\t\tmsg \u003d (\u0027Migrate all flow view files for whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage? \\n\u0027\n\t\t\t\u0027This operation may take several minutes\u0027) % (\n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\telif operation \u003d\u003d \u0027migrate_flowviews\u0027:\n\t\tif copy_option \u003d\u003d \u0027both\u0027:\n\t\t\tcopy_prompt \u003d \u0027both svg image and config json files\u0027\n\t\telif copy_option \u003d\u003d \u0027svg\u0027:\n\t\t\tcopy_prompt \u003d \u0027svg image file\u0027\n\t\telse:\n\t\t\tcopy_prompt \u003d \u0027config json file\u0027\n\t\tmsg \u003d (\u0027Copy %s for flowview: %s to flowview: %s \\n\u0027\n\t\t\t\u0027From whid: %s to whid: %s \\n\u0027\n\t\t\t\u0027From %s stage to %s stage?\u0027) % (\n\t\t\tcopy_prompt, src_flowview, dest_flowview, \n\t\t\tsrc_whid, dest_whid, src_stage, dest_stage)\n\tpayload \u003d {}\t\t\n\tAlerts.showAlert(\n\t\t\"info\", \n\t\t\"Copy Flow View Files?\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"Continue\", \n\t\t\"Cancel\", \n\t\t\"file_copy\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"confirm_copy_operation\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\tpayload\n\t)\n\t\t\t"
                    }
                  ],
                  "extensionFunctions": null,
                  "messageHandlers": [
                    {
                      "messageType": "confirm_copy_operation",
                      "pageScope": true,
                      "script": "\tsystem.perspective.closePopup(\u0027alertDialog\u0027)\n\t# call the copy_operation custom method\n\tself.copy_operation()\n\t\t",
                      "sessionScope": true,
                      "viewScope": false
                    }
                  ]
                },
                "type": "ia.input.button"
              }
            ],
            "meta": {
              "name": "FlexContainer Buttons"
            },
            "position": {
              "basis": "50%",
              "shrink": 0
            },
            "props": {
              "justify": "center"
            },
            "type": "ia.container.flex"
          }
        ],
        "meta": {
          "name": "FlexContainer Controls"
        },
        "position": {
          "shrink": 0
        },
        "type": "ia.container.flex"
      }
    ],
    "meta": {
      "name": "root"
    },
    "props": {
      "direction": "column"
    },
    "scripts": {
      "customMethods": [
        {
          "name": "update_instance_position",
          "params": [
            "payload\u003dNone"
          ],
          "script": "\t\"\"\"\n\t\tupdate instance position based on payload received\n\t:param payload: dict; payload of values to update from message handler\n\t\"\"\"\n\tfrom helper.helper import sanitize_tree\n\tpos_keys \u003d [\u0027top\u0027,\u0027left\u0027,\u0027width\u0027,\u0027height\u0027]\n\tif not isinstance(payload, dict):\n\t\tmsg \u003d \u0027payload to update_instance_position must be a dictionary object!\u0027\n\t\tsystem.perspective.print(msg)\n\t\tself.show_error_dialog(msg)\n\t\treturn\n\tbad_keys \u003d [k for k in payload.keys() if k not in pos_keys]\n\tif len(bad_keys):\n\t\tmsg \u003d (\u0027Invalid keys: %s found in payload, \u0027,\n\t\t\t\t\u0027cannot be applied to instance.position.\\nValid keys: %s\u0027) % (\n\t\t\t\tbad_keys, pos_keys)\n\t\tsystem.perpsective.print(msg)\n\t\tself.show_error_dialog(msg)\n\t\treturn\n\tinstance \u003d sanitize_tree(self.view.params.instance)\n\tinstance.update(payload)\n\tself.view.params.instance \u003d instance\n\t"
        },
        {
          "name": "show_confirm_dialog",
          "params": [],
          "script": "\t# ~~ 12 PARAMETERS ~~\n\t\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t\t# show close button\t\t(default \u003d true) boolean\n\t\t# btn text primary\t\t(default \u003d \"Primary\")\n\t\t# btn text secondary\t(default \u003d \"Secondary\")\n\t\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t\n\t\tmsg \u003d \"Update Instance Configuration for MP%s?\" % (self.view.params.instance.viewParams.mhe_id)\n\t\tAlerts.showAlert(\n\t\t\t\"info\", \n\t\t\t\"Update Instance Config?\", \n\t\t\tmsg, \n\t\t\t\"true\",\n\t\t\t\"Continue\", \n\t\t\t\"Cancel\", \n\t\t\t\"chevron_right\", \n\t\t\t\"\", \n\t\t\t\"right\", \n\t\t\t\"confirm_update_instance_config\", \n\t\t\t\"closePopup\", \n\t\t\t\"closePopup\"\n\t\t)\n\t\t"
        },
        {
          "name": "update_instance_config",
          "params": [],
          "script": "\t\"\"\"\n\t\tUpdate the instance config on the parent container\n\t\"\"\"\n\tfrom helper.helper import sanitize_tree\n\tfrom pprint import pformat"
        },
        {
          "name": "show_success_dialog",
          "params": [
            "msg\u003dNone"
          ],
          "script": "\t# ~~ 13 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\t# payload\t\t\t\t(default \u003d {}) add a payload here to return to the target message handler\n\t\n\tAlerts.showAlert(\n\t\t\"success\", \n\t\t\"Instance Updated\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\",\n\t\t{}\n\t)\n\t\t"
        },
        {
          "name": "show_warning_dialog",
          "params": [
            "msg\u003dNone"
          ],
          "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\n\t\t\"warning\", \n\t\t\"Instance Not Updated\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\"\n\t)\n\t\t"
        },
        {
          "name": "show_error_dialog",
          "params": [
            "msg\u003dNone"
          ],
          "script": "\t# ~~ 12 PARAMETERS ~~\n\t# state\t\t\t\t\t(default \u003d info) empty string uses generic gray styling\n\t# title \t\t\t\t(default \u003d Alert Title) empty string sets the title visibility to false\n\t# message \t\t\t\t(default \u003d Alert message goes here.)\n\t# show close button\t\t(default \u003d true) boolean\n\t# btn text primary\t\t(default \u003d \"Primary\")\n\t# btn text secondary\t(default \u003d \"Secondary\")\n\t# btn icon primary \t\t(default \u003d chevron_right) do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon secondary \t(default \u003d \"\") do not include \u0027material/\u0027 in the path, just the icon name\n\t# btn icon alignment\t(default \u003d \"right\") left or right\n\t# btn primary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn secondary action\t(default \u003d \"\") add message handlers on this button to enable other script actions\n\t# btn close action\t\t(default \u003d \"\") add message handlers on this icon to enable other script actions\n\n\tAlerts.showAlert(\n\t\t\"error\", \n\t\t\"Instance Update Error!\", \n\t\tmsg, \n\t\t\"true\",\n\t\t\"OK\", \n\t\t\"CLOSE\", \n\t\t\"\", \n\t\t\"\", \n\t\t\"right\", \n\t\t\"closePopup\", \n\t\t\"closePopup\", \n\t\t\"closePopup\"\n\t)\n\t\t"
        },
        {
          "name": "update_bindings",
          "params": [],
          "script": "\tself.view.custom.loading \u003d False\n\t\t"
        },
        {
          "name": "initialize_form",
          "params": [],
          "script": "\t# initialize flow-view selections\n\tselected_flow_view \u003d self.session.custom.flow_view_config.site_config.selected_flow_view\n\tself.view.custom.flow_view_source \u003d selected_flow_view\n\tself.view.custom.flow_view_destination \u003d selected_flow_view\n\t# initialize WHID selections\n\tselected_whid \u003d self.session.custom.flow_view_config.site_config.whid\n\tself.view.custom.whid_source \u003d selected_whid\n\tself.view.custom.whid_destination \u003d selected_whid\n\t# initialize stage selections\n\tselected_stage \u003d self.session.custom.flow_view_config.stage_config.stage\n\tself.view.custom.stage_source \u003d selected_stage\n\tself.view.custom.stage_destination \u003d selected_stage\n\t# initialize the flow view copy option\n\tself.view.custom.flow_view_copy_option \u003d \u0027both\u0027\n\t\t"
        }
      ],
      "extensionFunctions": null,
      "messageHandlers": [
        {
          "messageType": "request_initialize_form",
          "pageScope": false,
          "script": "\t# initialize form on call\n\tself.initialize_form()",
          "sessionScope": true,
          "viewScope": true
        }
      ]
    },
    "type": "ia.container.flex"
  }
}