Subversion Repositories oidplus

Rev

Rev 1042 | Go to most recent revision | View as "text/javascript" | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /**
  2.  * Copyright (c) Tiny Technologies, Inc. All rights reserved.
  3.  * Licensed under the LGPL or a commercial license.
  4.  * For LGPL see License.txt in the project root for license information.
  5.  * For commercial licenses see https://www.tiny.cloud/
  6.  *
  7.  * Version: 5.10.8 (2023-10-19)
  8.  */
  9. (function () {
  10.     'use strict';
  11.  
  12.     var __assign = function () {
  13.       __assign = Object.assign || function __assign(t) {
  14.         for (var s, i = 1, n = arguments.length; i < n; i++) {
  15.           s = arguments[i];
  16.           for (var p in s)
  17.             if (Object.prototype.hasOwnProperty.call(s, p))
  18.               t[p] = s[p];
  19.         }
  20.         return t;
  21.       };
  22.       return __assign.apply(this, arguments);
  23.     };
  24.     function __rest(s, e) {
  25.       var t = {};
  26.       for (var p in s)
  27.         if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
  28.           t[p] = s[p];
  29.       if (s != null && typeof Object.getOwnPropertySymbols === 'function')
  30.         for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  31.           if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
  32.             t[p[i]] = s[p[i]];
  33.         }
  34.       return t;
  35.     }
  36.     function __spreadArray(to, from, pack) {
  37.       if (pack || arguments.length === 2)
  38.         for (var i = 0, l = from.length, ar; i < l; i++) {
  39.           if (ar || !(i in from)) {
  40.             if (!ar)
  41.               ar = Array.prototype.slice.call(from, 0, i);
  42.             ar[i] = from[i];
  43.           }
  44.         }
  45.       return to.concat(ar || Array.prototype.slice.call(from));
  46.     }
  47.  
  48.     var typeOf = function (x) {
  49.       var t = typeof x;
  50.       if (x === null) {
  51.         return 'null';
  52.       } else if (t === 'object' && (Array.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'Array')) {
  53.         return 'array';
  54.       } else if (t === 'object' && (String.prototype.isPrototypeOf(x) || x.constructor && x.constructor.name === 'String')) {
  55.         return 'string';
  56.       } else {
  57.         return t;
  58.       }
  59.     };
  60.     var isType$1 = function (type) {
  61.       return function (value) {
  62.         return typeOf(value) === type;
  63.       };
  64.     };
  65.     var isSimpleType = function (type) {
  66.       return function (value) {
  67.         return typeof value === type;
  68.       };
  69.     };
  70.     var eq$1 = function (t) {
  71.       return function (a) {
  72.         return t === a;
  73.       };
  74.     };
  75.     var isString = isType$1('string');
  76.     var isObject = isType$1('object');
  77.     var isArray = isType$1('array');
  78.     var isNull = eq$1(null);
  79.     var isBoolean = isSimpleType('boolean');
  80.     var isUndefined = eq$1(undefined);
  81.     var isNullable = function (a) {
  82.       return a === null || a === undefined;
  83.     };
  84.     var isNonNullable = function (a) {
  85.       return !isNullable(a);
  86.     };
  87.     var isFunction = isSimpleType('function');
  88.     var isNumber = isSimpleType('number');
  89.  
  90.     var noop = function () {
  91.     };
  92.     var compose = function (fa, fb) {
  93.       return function () {
  94.         var args = [];
  95.         for (var _i = 0; _i < arguments.length; _i++) {
  96.           args[_i] = arguments[_i];
  97.         }
  98.         return fa(fb.apply(null, args));
  99.       };
  100.     };
  101.     var compose1 = function (fbc, fab) {
  102.       return function (a) {
  103.         return fbc(fab(a));
  104.       };
  105.     };
  106.     var constant$1 = function (value) {
  107.       return function () {
  108.         return value;
  109.       };
  110.     };
  111.     var identity = function (x) {
  112.       return x;
  113.     };
  114.     var tripleEquals = function (a, b) {
  115.       return a === b;
  116.     };
  117.     function curry(fn) {
  118.       var initialArgs = [];
  119.       for (var _i = 1; _i < arguments.length; _i++) {
  120.         initialArgs[_i - 1] = arguments[_i];
  121.       }
  122.       return function () {
  123.         var restArgs = [];
  124.         for (var _i = 0; _i < arguments.length; _i++) {
  125.           restArgs[_i] = arguments[_i];
  126.         }
  127.         var all = initialArgs.concat(restArgs);
  128.         return fn.apply(null, all);
  129.       };
  130.     }
  131.     var not = function (f) {
  132.       return function (t) {
  133.         return !f(t);
  134.       };
  135.     };
  136.     var die = function (msg) {
  137.       return function () {
  138.         throw new Error(msg);
  139.       };
  140.     };
  141.     var apply$1 = function (f) {
  142.       return f();
  143.     };
  144.     var never = constant$1(false);
  145.     var always = constant$1(true);
  146.  
  147.     var none = function () {
  148.       return NONE;
  149.     };
  150.     var NONE = function () {
  151.       var call = function (thunk) {
  152.         return thunk();
  153.       };
  154.       var id = identity;
  155.       var me = {
  156.         fold: function (n, _s) {
  157.           return n();
  158.         },
  159.         isSome: never,
  160.         isNone: always,
  161.         getOr: id,
  162.         getOrThunk: call,
  163.         getOrDie: function (msg) {
  164.           throw new Error(msg || 'error: getOrDie called on none.');
  165.         },
  166.         getOrNull: constant$1(null),
  167.         getOrUndefined: constant$1(undefined),
  168.         or: id,
  169.         orThunk: call,
  170.         map: none,
  171.         each: noop,
  172.         bind: none,
  173.         exists: never,
  174.         forall: always,
  175.         filter: function () {
  176.           return none();
  177.         },
  178.         toArray: function () {
  179.           return [];
  180.         },
  181.         toString: constant$1('none()')
  182.       };
  183.       return me;
  184.     }();
  185.     var some = function (a) {
  186.       var constant_a = constant$1(a);
  187.       var self = function () {
  188.         return me;
  189.       };
  190.       var bind = function (f) {
  191.         return f(a);
  192.       };
  193.       var me = {
  194.         fold: function (n, s) {
  195.           return s(a);
  196.         },
  197.         isSome: always,
  198.         isNone: never,
  199.         getOr: constant_a,
  200.         getOrThunk: constant_a,
  201.         getOrDie: constant_a,
  202.         getOrNull: constant_a,
  203.         getOrUndefined: constant_a,
  204.         or: self,
  205.         orThunk: self,
  206.         map: function (f) {
  207.           return some(f(a));
  208.         },
  209.         each: function (f) {
  210.           f(a);
  211.         },
  212.         bind: bind,
  213.         exists: bind,
  214.         forall: bind,
  215.         filter: function (f) {
  216.           return f(a) ? me : NONE;
  217.         },
  218.         toArray: function () {
  219.           return [a];
  220.         },
  221.         toString: function () {
  222.           return 'some(' + a + ')';
  223.         }
  224.       };
  225.       return me;
  226.     };
  227.     var from = function (value) {
  228.       return value === null || value === undefined ? NONE : some(value);
  229.     };
  230.     var Optional = {
  231.       some: some,
  232.       none: none,
  233.       from: from
  234.     };
  235.  
  236.     var cached = function (f) {
  237.       var called = false;
  238.       var r;
  239.       return function () {
  240.         var args = [];
  241.         for (var _i = 0; _i < arguments.length; _i++) {
  242.           args[_i] = arguments[_i];
  243.         }
  244.         if (!called) {
  245.           called = true;
  246.           r = f.apply(null, args);
  247.         }
  248.         return r;
  249.       };
  250.     };
  251.  
  252.     var DeviceType = function (os, browser, userAgent, mediaMatch) {
  253.       var isiPad = os.isiOS() && /ipad/i.test(userAgent) === true;
  254.       var isiPhone = os.isiOS() && !isiPad;
  255.       var isMobile = os.isiOS() || os.isAndroid();
  256.       var isTouch = isMobile || mediaMatch('(pointer:coarse)');
  257.       var isTablet = isiPad || !isiPhone && isMobile && mediaMatch('(min-device-width:768px)');
  258.       var isPhone = isiPhone || isMobile && !isTablet;
  259.       var iOSwebview = browser.isSafari() && os.isiOS() && /safari/i.test(userAgent) === false;
  260.       var isDesktop = !isPhone && !isTablet && !iOSwebview;
  261.       return {
  262.         isiPad: constant$1(isiPad),
  263.         isiPhone: constant$1(isiPhone),
  264.         isTablet: constant$1(isTablet),
  265.         isPhone: constant$1(isPhone),
  266.         isTouch: constant$1(isTouch),
  267.         isAndroid: os.isAndroid,
  268.         isiOS: os.isiOS,
  269.         isWebView: constant$1(iOSwebview),
  270.         isDesktop: constant$1(isDesktop)
  271.       };
  272.     };
  273.  
  274.     var nativeSlice = Array.prototype.slice;
  275.     var nativeIndexOf = Array.prototype.indexOf;
  276.     var nativePush = Array.prototype.push;
  277.     var rawIndexOf = function (ts, t) {
  278.       return nativeIndexOf.call(ts, t);
  279.     };
  280.     var contains$1 = function (xs, x) {
  281.       return rawIndexOf(xs, x) > -1;
  282.     };
  283.     var exists = function (xs, pred) {
  284.       for (var i = 0, len = xs.length; i < len; i++) {
  285.         var x = xs[i];
  286.         if (pred(x, i)) {
  287.           return true;
  288.         }
  289.       }
  290.       return false;
  291.     };
  292.     var map$2 = function (xs, f) {
  293.       var len = xs.length;
  294.       var r = new Array(len);
  295.       for (var i = 0; i < len; i++) {
  296.         var x = xs[i];
  297.         r[i] = f(x, i);
  298.       }
  299.       return r;
  300.     };
  301.     var each$1 = function (xs, f) {
  302.       for (var i = 0, len = xs.length; i < len; i++) {
  303.         var x = xs[i];
  304.         f(x, i);
  305.       }
  306.     };
  307.     var eachr = function (xs, f) {
  308.       for (var i = xs.length - 1; i >= 0; i--) {
  309.         var x = xs[i];
  310.         f(x, i);
  311.       }
  312.     };
  313.     var filter$2 = function (xs, pred) {
  314.       var r = [];
  315.       for (var i = 0, len = xs.length; i < len; i++) {
  316.         var x = xs[i];
  317.         if (pred(x, i)) {
  318.           r.push(x);
  319.         }
  320.       }
  321.       return r;
  322.     };
  323.     var foldr = function (xs, f, acc) {
  324.       eachr(xs, function (x, i) {
  325.         acc = f(acc, x, i);
  326.       });
  327.       return acc;
  328.     };
  329.     var foldl = function (xs, f, acc) {
  330.       each$1(xs, function (x, i) {
  331.         acc = f(acc, x, i);
  332.       });
  333.       return acc;
  334.     };
  335.     var findUntil = function (xs, pred, until) {
  336.       for (var i = 0, len = xs.length; i < len; i++) {
  337.         var x = xs[i];
  338.         if (pred(x, i)) {
  339.           return Optional.some(x);
  340.         } else if (until(x, i)) {
  341.           break;
  342.         }
  343.       }
  344.       return Optional.none();
  345.     };
  346.     var find$2 = function (xs, pred) {
  347.       return findUntil(xs, pred, never);
  348.     };
  349.     var findIndex$1 = function (xs, pred) {
  350.       for (var i = 0, len = xs.length; i < len; i++) {
  351.         var x = xs[i];
  352.         if (pred(x, i)) {
  353.           return Optional.some(i);
  354.         }
  355.       }
  356.       return Optional.none();
  357.     };
  358.     var flatten = function (xs) {
  359.       var r = [];
  360.       for (var i = 0, len = xs.length; i < len; ++i) {
  361.         if (!isArray(xs[i])) {
  362.           throw new Error('Arr.flatten item ' + i + ' was not an array, input: ' + xs);
  363.         }
  364.         nativePush.apply(r, xs[i]);
  365.       }
  366.       return r;
  367.     };
  368.     var bind$3 = function (xs, f) {
  369.       return flatten(map$2(xs, f));
  370.     };
  371.     var forall = function (xs, pred) {
  372.       for (var i = 0, len = xs.length; i < len; ++i) {
  373.         var x = xs[i];
  374.         if (pred(x, i) !== true) {
  375.           return false;
  376.         }
  377.       }
  378.       return true;
  379.     };
  380.     var reverse = function (xs) {
  381.       var r = nativeSlice.call(xs, 0);
  382.       r.reverse();
  383.       return r;
  384.     };
  385.     var difference = function (a1, a2) {
  386.       return filter$2(a1, function (x) {
  387.         return !contains$1(a2, x);
  388.       });
  389.     };
  390.     var pure$2 = function (x) {
  391.       return [x];
  392.     };
  393.     var sort = function (xs, comparator) {
  394.       var copy = nativeSlice.call(xs, 0);
  395.       copy.sort(comparator);
  396.       return copy;
  397.     };
  398.     var get$d = function (xs, i) {
  399.       return i >= 0 && i < xs.length ? Optional.some(xs[i]) : Optional.none();
  400.     };
  401.     var head = function (xs) {
  402.       return get$d(xs, 0);
  403.     };
  404.     var findMap = function (arr, f) {
  405.       for (var i = 0; i < arr.length; i++) {
  406.         var r = f(arr[i], i);
  407.         if (r.isSome()) {
  408.           return r;
  409.         }
  410.       }
  411.       return Optional.none();
  412.     };
  413.  
  414.     var firstMatch = function (regexes, s) {
  415.       for (var i = 0; i < regexes.length; i++) {
  416.         var x = regexes[i];
  417.         if (x.test(s)) {
  418.           return x;
  419.         }
  420.       }
  421.       return undefined;
  422.     };
  423.     var find$1 = function (regexes, agent) {
  424.       var r = firstMatch(regexes, agent);
  425.       if (!r) {
  426.         return {
  427.           major: 0,
  428.           minor: 0
  429.         };
  430.       }
  431.       var group = function (i) {
  432.         return Number(agent.replace(r, '$' + i));
  433.       };
  434.       return nu$8(group(1), group(2));
  435.     };
  436.     var detect$4 = function (versionRegexes, agent) {
  437.       var cleanedAgent = String(agent).toLowerCase();
  438.       if (versionRegexes.length === 0) {
  439.         return unknown$3();
  440.       }
  441.       return find$1(versionRegexes, cleanedAgent);
  442.     };
  443.     var unknown$3 = function () {
  444.       return nu$8(0, 0);
  445.     };
  446.     var nu$8 = function (major, minor) {
  447.       return {
  448.         major: major,
  449.         minor: minor
  450.       };
  451.     };
  452.     var Version = {
  453.       nu: nu$8,
  454.       detect: detect$4,
  455.       unknown: unknown$3
  456.     };
  457.  
  458.     var detectBrowser$1 = function (browsers, userAgentData) {
  459.       return findMap(userAgentData.brands, function (uaBrand) {
  460.         var lcBrand = uaBrand.brand.toLowerCase();
  461.         return find$2(browsers, function (browser) {
  462.           var _a;
  463.           return lcBrand === ((_a = browser.brand) === null || _a === void 0 ? void 0 : _a.toLowerCase());
  464.         }).map(function (info) {
  465.           return {
  466.             current: info.name,
  467.             version: Version.nu(parseInt(uaBrand.version, 10), 0)
  468.           };
  469.         });
  470.       });
  471.     };
  472.  
  473.     var detect$3 = function (candidates, userAgent) {
  474.       var agent = String(userAgent).toLowerCase();
  475.       return find$2(candidates, function (candidate) {
  476.         return candidate.search(agent);
  477.       });
  478.     };
  479.     var detectBrowser = function (browsers, userAgent) {
  480.       return detect$3(browsers, userAgent).map(function (browser) {
  481.         var version = Version.detect(browser.versionRegexes, userAgent);
  482.         return {
  483.           current: browser.name,
  484.           version: version
  485.         };
  486.       });
  487.     };
  488.     var detectOs = function (oses, userAgent) {
  489.       return detect$3(oses, userAgent).map(function (os) {
  490.         var version = Version.detect(os.versionRegexes, userAgent);
  491.         return {
  492.           current: os.name,
  493.           version: version
  494.         };
  495.       });
  496.     };
  497.  
  498.     var checkRange = function (str, substr, start) {
  499.       return substr === '' || str.length >= substr.length && str.substr(start, start + substr.length) === substr;
  500.     };
  501.     var supplant = function (str, obj) {
  502.       var isStringOrNumber = function (a) {
  503.         var t = typeof a;
  504.         return t === 'string' || t === 'number';
  505.       };
  506.       return str.replace(/\$\{([^{}]*)\}/g, function (fullMatch, key) {
  507.         var value = obj[key];
  508.         return isStringOrNumber(value) ? value.toString() : fullMatch;
  509.       });
  510.     };
  511.     var contains = function (str, substr) {
  512.       return str.indexOf(substr) !== -1;
  513.     };
  514.     var endsWith = function (str, suffix) {
  515.       return checkRange(str, suffix, str.length - suffix.length);
  516.     };
  517.     var blank = function (r) {
  518.       return function (s) {
  519.         return s.replace(r, '');
  520.       };
  521.     };
  522.     var trim = blank(/^\s+|\s+$/g);
  523.  
  524.     var normalVersionRegex = /.*?version\/\ ?([0-9]+)\.([0-9]+).*/;
  525.     var checkContains = function (target) {
  526.       return function (uastring) {
  527.         return contains(uastring, target);
  528.       };
  529.     };
  530.     var browsers = [
  531.       {
  532.         name: 'Edge',
  533.         versionRegexes: [/.*?edge\/ ?([0-9]+)\.([0-9]+)$/],
  534.         search: function (uastring) {
  535.           return contains(uastring, 'edge/') && contains(uastring, 'chrome') && contains(uastring, 'safari') && contains(uastring, 'applewebkit');
  536.         }
  537.       },
  538.       {
  539.         name: 'Chrome',
  540.         brand: 'Chromium',
  541.         versionRegexes: [
  542.           /.*?chrome\/([0-9]+)\.([0-9]+).*/,
  543.           normalVersionRegex
  544.         ],
  545.         search: function (uastring) {
  546.           return contains(uastring, 'chrome') && !contains(uastring, 'chromeframe');
  547.         }
  548.       },
  549.       {
  550.         name: 'IE',
  551.         versionRegexes: [
  552.           /.*?msie\ ?([0-9]+)\.([0-9]+).*/,
  553.           /.*?rv:([0-9]+)\.([0-9]+).*/
  554.         ],
  555.         search: function (uastring) {
  556.           return contains(uastring, 'msie') || contains(uastring, 'trident');
  557.         }
  558.       },
  559.       {
  560.         name: 'Opera',
  561.         versionRegexes: [
  562.           normalVersionRegex,
  563.           /.*?opera\/([0-9]+)\.([0-9]+).*/
  564.         ],
  565.         search: checkContains('opera')
  566.       },
  567.       {
  568.         name: 'Firefox',
  569.         versionRegexes: [/.*?firefox\/\ ?([0-9]+)\.([0-9]+).*/],
  570.         search: checkContains('firefox')
  571.       },
  572.       {
  573.         name: 'Safari',
  574.         versionRegexes: [
  575.           normalVersionRegex,
  576.           /.*?cpu os ([0-9]+)_([0-9]+).*/
  577.         ],
  578.         search: function (uastring) {
  579.           return (contains(uastring, 'safari') || contains(uastring, 'mobile/')) && contains(uastring, 'applewebkit');
  580.         }
  581.       }
  582.     ];
  583.     var oses = [
  584.       {
  585.         name: 'Windows',
  586.         search: checkContains('win'),
  587.         versionRegexes: [/.*?windows\ nt\ ?([0-9]+)\.([0-9]+).*/]
  588.       },
  589.       {
  590.         name: 'iOS',
  591.         search: function (uastring) {
  592.           return contains(uastring, 'iphone') || contains(uastring, 'ipad');
  593.         },
  594.         versionRegexes: [
  595.           /.*?version\/\ ?([0-9]+)\.([0-9]+).*/,
  596.           /.*cpu os ([0-9]+)_([0-9]+).*/,
  597.           /.*cpu iphone os ([0-9]+)_([0-9]+).*/
  598.         ]
  599.       },
  600.       {
  601.         name: 'Android',
  602.         search: checkContains('android'),
  603.         versionRegexes: [/.*?android\ ?([0-9]+)\.([0-9]+).*/]
  604.       },
  605.       {
  606.         name: 'OSX',
  607.         search: checkContains('mac os x'),
  608.         versionRegexes: [/.*?mac\ os\ x\ ?([0-9]+)_([0-9]+).*/]
  609.       },
  610.       {
  611.         name: 'Linux',
  612.         search: checkContains('linux'),
  613.         versionRegexes: []
  614.       },
  615.       {
  616.         name: 'Solaris',
  617.         search: checkContains('sunos'),
  618.         versionRegexes: []
  619.       },
  620.       {
  621.         name: 'FreeBSD',
  622.         search: checkContains('freebsd'),
  623.         versionRegexes: []
  624.       },
  625.       {
  626.         name: 'ChromeOS',
  627.         search: checkContains('cros'),
  628.         versionRegexes: [/.*?chrome\/([0-9]+)\.([0-9]+).*/]
  629.       }
  630.     ];
  631.     var PlatformInfo = {
  632.       browsers: constant$1(browsers),
  633.       oses: constant$1(oses)
  634.     };
  635.  
  636.     var edge = 'Edge';
  637.     var chrome = 'Chrome';
  638.     var ie = 'IE';
  639.     var opera = 'Opera';
  640.     var firefox = 'Firefox';
  641.     var safari = 'Safari';
  642.     var unknown$2 = function () {
  643.       return nu$7({
  644.         current: undefined,
  645.         version: Version.unknown()
  646.       });
  647.     };
  648.     var nu$7 = function (info) {
  649.       var current = info.current;
  650.       var version = info.version;
  651.       var isBrowser = function (name) {
  652.         return function () {
  653.           return current === name;
  654.         };
  655.       };
  656.       return {
  657.         current: current,
  658.         version: version,
  659.         isEdge: isBrowser(edge),
  660.         isChrome: isBrowser(chrome),
  661.         isIE: isBrowser(ie),
  662.         isOpera: isBrowser(opera),
  663.         isFirefox: isBrowser(firefox),
  664.         isSafari: isBrowser(safari)
  665.       };
  666.     };
  667.     var Browser = {
  668.       unknown: unknown$2,
  669.       nu: nu$7,
  670.       edge: constant$1(edge),
  671.       chrome: constant$1(chrome),
  672.       ie: constant$1(ie),
  673.       opera: constant$1(opera),
  674.       firefox: constant$1(firefox),
  675.       safari: constant$1(safari)
  676.     };
  677.  
  678.     var windows = 'Windows';
  679.     var ios = 'iOS';
  680.     var android = 'Android';
  681.     var linux = 'Linux';
  682.     var osx = 'OSX';
  683.     var solaris = 'Solaris';
  684.     var freebsd = 'FreeBSD';
  685.     var chromeos = 'ChromeOS';
  686.     var unknown$1 = function () {
  687.       return nu$6({
  688.         current: undefined,
  689.         version: Version.unknown()
  690.       });
  691.     };
  692.     var nu$6 = function (info) {
  693.       var current = info.current;
  694.       var version = info.version;
  695.       var isOS = function (name) {
  696.         return function () {
  697.           return current === name;
  698.         };
  699.       };
  700.       return {
  701.         current: current,
  702.         version: version,
  703.         isWindows: isOS(windows),
  704.         isiOS: isOS(ios),
  705.         isAndroid: isOS(android),
  706.         isOSX: isOS(osx),
  707.         isLinux: isOS(linux),
  708.         isSolaris: isOS(solaris),
  709.         isFreeBSD: isOS(freebsd),
  710.         isChromeOS: isOS(chromeos)
  711.       };
  712.     };
  713.     var OperatingSystem = {
  714.       unknown: unknown$1,
  715.       nu: nu$6,
  716.       windows: constant$1(windows),
  717.       ios: constant$1(ios),
  718.       android: constant$1(android),
  719.       linux: constant$1(linux),
  720.       osx: constant$1(osx),
  721.       solaris: constant$1(solaris),
  722.       freebsd: constant$1(freebsd),
  723.       chromeos: constant$1(chromeos)
  724.     };
  725.  
  726.     var detect$2 = function (userAgent, userAgentDataOpt, mediaMatch) {
  727.       var browsers = PlatformInfo.browsers();
  728.       var oses = PlatformInfo.oses();
  729.       var browser = userAgentDataOpt.bind(function (userAgentData) {
  730.         return detectBrowser$1(browsers, userAgentData);
  731.       }).orThunk(function () {
  732.         return detectBrowser(browsers, userAgent);
  733.       }).fold(Browser.unknown, Browser.nu);
  734.       var os = detectOs(oses, userAgent).fold(OperatingSystem.unknown, OperatingSystem.nu);
  735.       var deviceType = DeviceType(os, browser, userAgent, mediaMatch);
  736.       return {
  737.         browser: browser,
  738.         os: os,
  739.         deviceType: deviceType
  740.       };
  741.     };
  742.     var PlatformDetection = { detect: detect$2 };
  743.  
  744.     var mediaMatch = function (query) {
  745.       return window.matchMedia(query).matches;
  746.     };
  747.     var platform$1 = cached(function () {
  748.       return PlatformDetection.detect(navigator.userAgent, Optional.from(navigator.userAgentData), mediaMatch);
  749.     });
  750.     var detect$1 = function () {
  751.       return platform$1();
  752.     };
  753.  
  754.     var constant = constant$1;
  755.     var touchstart = constant('touchstart');
  756.     var touchmove = constant('touchmove');
  757.     var touchend = constant('touchend');
  758.     var mousedown = constant('mousedown');
  759.     var mousemove = constant('mousemove');
  760.     var mouseup = constant('mouseup');
  761.     var mouseover = constant('mouseover');
  762.     var keydown = constant('keydown');
  763.     var keyup = constant('keyup');
  764.     var input$1 = constant('input');
  765.     var change = constant('change');
  766.     var click = constant('click');
  767.     var transitionend = constant('transitionend');
  768.     var selectstart = constant('selectstart');
  769.  
  770.     var prefixName = function (name) {
  771.       return constant$1('alloy.' + name);
  772.     };
  773.     var alloy = { tap: prefixName('tap') };
  774.     var focus$4 = prefixName('focus');
  775.     var postBlur = prefixName('blur.post');
  776.     var postPaste = prefixName('paste.post');
  777.     var receive$1 = prefixName('receive');
  778.     var execute$5 = prefixName('execute');
  779.     var focusItem = prefixName('focus.item');
  780.     var tap = alloy.tap;
  781.     var longpress = prefixName('longpress');
  782.     var systemInit = prefixName('system.init');
  783.     var attachedToDom = prefixName('system.attached');
  784.     var detachedFromDom = prefixName('system.detached');
  785.     var focusShifted = prefixName('focusmanager.shifted');
  786.     var highlight$1 = prefixName('highlight');
  787.     var dehighlight$1 = prefixName('dehighlight');
  788.  
  789.     var emit = function (component, event) {
  790.       dispatchWith(component, component.element, event, {});
  791.     };
  792.     var emitWith = function (component, event, properties) {
  793.       dispatchWith(component, component.element, event, properties);
  794.     };
  795.     var emitExecute = function (component) {
  796.       emit(component, execute$5());
  797.     };
  798.     var dispatch = function (component, target, event) {
  799.       dispatchWith(component, target, event, {});
  800.     };
  801.     var dispatchWith = function (component, target, event, properties) {
  802.       var data = __assign({ target: target }, properties);
  803.       component.getSystem().triggerEvent(event, target, data);
  804.     };
  805.     var dispatchEvent = function (component, target, event, simulatedEvent) {
  806.       component.getSystem().triggerEvent(event, target, simulatedEvent.event);
  807.     };
  808.     var dispatchFocus = function (component, target) {
  809.       component.getSystem().triggerFocus(target, component.element);
  810.     };
  811.  
  812.     var DOCUMENT = 9;
  813.     var DOCUMENT_FRAGMENT = 11;
  814.     var ELEMENT = 1;
  815.     var TEXT = 3;
  816.  
  817.     var fromHtml$2 = function (html, scope) {
  818.       var doc = scope || document;
  819.       var div = doc.createElement('div');
  820.       div.innerHTML = html;
  821.       if (!div.hasChildNodes() || div.childNodes.length > 1) {
  822.         console.error('HTML does not have a single root node', html);
  823.         throw new Error('HTML must have a single root node');
  824.       }
  825.       return fromDom(div.childNodes[0]);
  826.     };
  827.     var fromTag = function (tag, scope) {
  828.       var doc = scope || document;
  829.       var node = doc.createElement(tag);
  830.       return fromDom(node);
  831.     };
  832.     var fromText = function (text, scope) {
  833.       var doc = scope || document;
  834.       var node = doc.createTextNode(text);
  835.       return fromDom(node);
  836.     };
  837.     var fromDom = function (node) {
  838.       if (node === null || node === undefined) {
  839.         throw new Error('Node cannot be null or undefined');
  840.       }
  841.       return { dom: node };
  842.     };
  843.     var fromPoint = function (docElm, x, y) {
  844.       return Optional.from(docElm.dom.elementFromPoint(x, y)).map(fromDom);
  845.     };
  846.     var SugarElement = {
  847.       fromHtml: fromHtml$2,
  848.       fromTag: fromTag,
  849.       fromText: fromText,
  850.       fromDom: fromDom,
  851.       fromPoint: fromPoint
  852.     };
  853.  
  854.     var is$1 = function (element, selector) {
  855.       var dom = element.dom;
  856.       if (dom.nodeType !== ELEMENT) {
  857.         return false;
  858.       } else {
  859.         var elem = dom;
  860.         if (elem.matches !== undefined) {
  861.           return elem.matches(selector);
  862.         } else if (elem.msMatchesSelector !== undefined) {
  863.           return elem.msMatchesSelector(selector);
  864.         } else if (elem.webkitMatchesSelector !== undefined) {
  865.           return elem.webkitMatchesSelector(selector);
  866.         } else if (elem.mozMatchesSelector !== undefined) {
  867.           return elem.mozMatchesSelector(selector);
  868.         } else {
  869.           throw new Error('Browser lacks native selectors');
  870.         }
  871.       }
  872.     };
  873.     var bypassSelector = function (dom) {
  874.       return dom.nodeType !== ELEMENT && dom.nodeType !== DOCUMENT && dom.nodeType !== DOCUMENT_FRAGMENT || dom.childElementCount === 0;
  875.     };
  876.     var all$2 = function (selector, scope) {
  877.       var base = scope === undefined ? document : scope.dom;
  878.       return bypassSelector(base) ? [] : map$2(base.querySelectorAll(selector), SugarElement.fromDom);
  879.     };
  880.     var one = function (selector, scope) {
  881.       var base = scope === undefined ? document : scope.dom;
  882.       return bypassSelector(base) ? Optional.none() : Optional.from(base.querySelector(selector)).map(SugarElement.fromDom);
  883.     };
  884.  
  885.     var eq = function (e1, e2) {
  886.       return e1.dom === e2.dom;
  887.     };
  888.  
  889.     typeof window !== 'undefined' ? window : Function('return this;')();
  890.  
  891.     var name$1 = function (element) {
  892.       var r = element.dom.nodeName;
  893.       return r.toLowerCase();
  894.     };
  895.     var type = function (element) {
  896.       return element.dom.nodeType;
  897.     };
  898.     var isType = function (t) {
  899.       return function (element) {
  900.         return type(element) === t;
  901.       };
  902.     };
  903.     var isElement = isType(ELEMENT);
  904.     var isText = isType(TEXT);
  905.     var isDocument = isType(DOCUMENT);
  906.     var isDocumentFragment = isType(DOCUMENT_FRAGMENT);
  907.  
  908.     var owner$2 = function (element) {
  909.       return SugarElement.fromDom(element.dom.ownerDocument);
  910.     };
  911.     var documentOrOwner = function (dos) {
  912.       return isDocument(dos) ? dos : owner$2(dos);
  913.     };
  914.     var defaultView = function (element) {
  915.       return SugarElement.fromDom(documentOrOwner(element).dom.defaultView);
  916.     };
  917.     var parent = function (element) {
  918.       return Optional.from(element.dom.parentNode).map(SugarElement.fromDom);
  919.     };
  920.     var parents = function (element, isRoot) {
  921.       var stop = isFunction(isRoot) ? isRoot : never;
  922.       var dom = element.dom;
  923.       var ret = [];
  924.       while (dom.parentNode !== null && dom.parentNode !== undefined) {
  925.         var rawParent = dom.parentNode;
  926.         var p = SugarElement.fromDom(rawParent);
  927.         ret.push(p);
  928.         if (stop(p) === true) {
  929.           break;
  930.         } else {
  931.           dom = rawParent;
  932.         }
  933.       }
  934.       return ret;
  935.     };
  936.     var siblings$2 = function (element) {
  937.       var filterSelf = function (elements) {
  938.         return filter$2(elements, function (x) {
  939.           return !eq(element, x);
  940.         });
  941.       };
  942.       return parent(element).map(children).map(filterSelf).getOr([]);
  943.     };
  944.     var nextSibling = function (element) {
  945.       return Optional.from(element.dom.nextSibling).map(SugarElement.fromDom);
  946.     };
  947.     var children = function (element) {
  948.       return map$2(element.dom.childNodes, SugarElement.fromDom);
  949.     };
  950.     var child = function (element, index) {
  951.       var cs = element.dom.childNodes;
  952.       return Optional.from(cs[index]).map(SugarElement.fromDom);
  953.     };
  954.     var firstChild = function (element) {
  955.       return child(element, 0);
  956.     };
  957.  
  958.     var before$1 = function (marker, element) {
  959.       var parent$1 = parent(marker);
  960.       parent$1.each(function (v) {
  961.         v.dom.insertBefore(element.dom, marker.dom);
  962.       });
  963.     };
  964.     var after$2 = function (marker, element) {
  965.       var sibling = nextSibling(marker);
  966.       sibling.fold(function () {
  967.         var parent$1 = parent(marker);
  968.         parent$1.each(function (v) {
  969.           append$2(v, element);
  970.         });
  971.       }, function (v) {
  972.         before$1(v, element);
  973.       });
  974.     };
  975.     var prepend$1 = function (parent, element) {
  976.       var firstChild$1 = firstChild(parent);
  977.       firstChild$1.fold(function () {
  978.         append$2(parent, element);
  979.       }, function (v) {
  980.         parent.dom.insertBefore(element.dom, v.dom);
  981.       });
  982.     };
  983.     var append$2 = function (parent, element) {
  984.       parent.dom.appendChild(element.dom);
  985.     };
  986.     var appendAt = function (parent, element, index) {
  987.       child(parent, index).fold(function () {
  988.         append$2(parent, element);
  989.       }, function (v) {
  990.         before$1(v, element);
  991.       });
  992.     };
  993.  
  994.     var append$1 = function (parent, elements) {
  995.       each$1(elements, function (x) {
  996.         append$2(parent, x);
  997.       });
  998.     };
  999.  
  1000.     var empty = function (element) {
  1001.       element.dom.textContent = '';
  1002.       each$1(children(element), function (rogue) {
  1003.         remove$7(rogue);
  1004.       });
  1005.     };
  1006.     var remove$7 = function (element) {
  1007.       var dom = element.dom;
  1008.       if (dom.parentNode !== null) {
  1009.         dom.parentNode.removeChild(dom);
  1010.       }
  1011.     };
  1012.  
  1013.     var isShadowRoot = function (dos) {
  1014.       return isDocumentFragment(dos) && isNonNullable(dos.dom.host);
  1015.     };
  1016.     var supported = isFunction(Element.prototype.attachShadow) && isFunction(Node.prototype.getRootNode);
  1017.     var isSupported$1 = constant$1(supported);
  1018.     var getRootNode = supported ? function (e) {
  1019.       return SugarElement.fromDom(e.dom.getRootNode());
  1020.     } : documentOrOwner;
  1021.     var getShadowRoot = function (e) {
  1022.       var r = getRootNode(e);
  1023.       return isShadowRoot(r) ? Optional.some(r) : Optional.none();
  1024.     };
  1025.     var getShadowHost = function (e) {
  1026.       return SugarElement.fromDom(e.dom.host);
  1027.     };
  1028.     var getOriginalEventTarget = function (event) {
  1029.       if (isSupported$1() && isNonNullable(event.target)) {
  1030.         var el = SugarElement.fromDom(event.target);
  1031.         if (isElement(el) && isOpenShadowHost(el)) {
  1032.           if (event.composed && event.composedPath) {
  1033.             var composedPath = event.composedPath();
  1034.             if (composedPath) {
  1035.               return head(composedPath);
  1036.             }
  1037.           }
  1038.         }
  1039.       }
  1040.       return Optional.from(event.target);
  1041.     };
  1042.     var isOpenShadowHost = function (element) {
  1043.       return isNonNullable(element.dom.shadowRoot);
  1044.     };
  1045.  
  1046.     var inBody = function (element) {
  1047.       var dom = isText(element) ? element.dom.parentNode : element.dom;
  1048.       if (dom === undefined || dom === null || dom.ownerDocument === null) {
  1049.         return false;
  1050.       }
  1051.       var doc = dom.ownerDocument;
  1052.       return getShadowRoot(SugarElement.fromDom(dom)).fold(function () {
  1053.         return doc.body.contains(dom);
  1054.       }, compose1(inBody, getShadowHost));
  1055.     };
  1056.     var body = function () {
  1057.       return getBody(SugarElement.fromDom(document));
  1058.     };
  1059.     var getBody = function (doc) {
  1060.       var b = doc.dom.body;
  1061.       if (b === null || b === undefined) {
  1062.         throw new Error('Body is not available yet');
  1063.       }
  1064.       return SugarElement.fromDom(b);
  1065.     };
  1066.  
  1067.     var fireDetaching = function (component) {
  1068.       emit(component, detachedFromDom());
  1069.       var children = component.components();
  1070.       each$1(children, fireDetaching);
  1071.     };
  1072.     var fireAttaching = function (component) {
  1073.       var children = component.components();
  1074.       each$1(children, fireAttaching);
  1075.       emit(component, attachedToDom());
  1076.     };
  1077.     var attach$1 = function (parent, child) {
  1078.       append$2(parent.element, child.element);
  1079.     };
  1080.     var detachChildren = function (component) {
  1081.       each$1(component.components(), function (childComp) {
  1082.         return remove$7(childComp.element);
  1083.       });
  1084.       empty(component.element);
  1085.       component.syncComponents();
  1086.     };
  1087.     var replaceChildren = function (component, newChildren) {
  1088.       var subs = component.components();
  1089.       detachChildren(component);
  1090.       var deleted = difference(subs, newChildren);
  1091.       each$1(deleted, function (comp) {
  1092.         fireDetaching(comp);
  1093.         component.getSystem().removeFromWorld(comp);
  1094.       });
  1095.       each$1(newChildren, function (childComp) {
  1096.         if (!childComp.getSystem().isConnected()) {
  1097.           component.getSystem().addToWorld(childComp);
  1098.           attach$1(component, childComp);
  1099.           if (inBody(component.element)) {
  1100.             fireAttaching(childComp);
  1101.           }
  1102.         } else {
  1103.           attach$1(component, childComp);
  1104.         }
  1105.         component.syncComponents();
  1106.       });
  1107.     };
  1108.  
  1109.     var attach = function (parent, child) {
  1110.       attachWith(parent, child, append$2);
  1111.     };
  1112.     var attachWith = function (parent, child, insertion) {
  1113.       parent.getSystem().addToWorld(child);
  1114.       insertion(parent.element, child.element);
  1115.       if (inBody(parent.element)) {
  1116.         fireAttaching(child);
  1117.       }
  1118.       parent.syncComponents();
  1119.     };
  1120.     var doDetach = function (component) {
  1121.       fireDetaching(component);
  1122.       remove$7(component.element);
  1123.       component.getSystem().removeFromWorld(component);
  1124.     };
  1125.     var detach = function (component) {
  1126.       var parent$1 = parent(component.element).bind(function (p) {
  1127.         return component.getSystem().getByDom(p).toOptional();
  1128.       });
  1129.       doDetach(component);
  1130.       parent$1.each(function (p) {
  1131.         p.syncComponents();
  1132.       });
  1133.     };
  1134.     var attachSystemAfter = function (element, guiSystem) {
  1135.       attachSystemWith(element, guiSystem, after$2);
  1136.     };
  1137.     var attachSystemWith = function (element, guiSystem, inserter) {
  1138.       inserter(element, guiSystem.element);
  1139.       var children$1 = children(guiSystem.element);
  1140.       each$1(children$1, function (child) {
  1141.         guiSystem.getByDom(child).each(fireAttaching);
  1142.       });
  1143.     };
  1144.     var detachSystem = function (guiSystem) {
  1145.       var children$1 = children(guiSystem.element);
  1146.       each$1(children$1, function (child) {
  1147.         guiSystem.getByDom(child).each(fireDetaching);
  1148.       });
  1149.       remove$7(guiSystem.element);
  1150.     };
  1151.  
  1152.     var keys = Object.keys;
  1153.     var hasOwnProperty = Object.hasOwnProperty;
  1154.     var each = function (obj, f) {
  1155.       var props = keys(obj);
  1156.       for (var k = 0, len = props.length; k < len; k++) {
  1157.         var i = props[k];
  1158.         var x = obj[i];
  1159.         f(x, i);
  1160.       }
  1161.     };
  1162.     var map$1 = function (obj, f) {
  1163.       return tupleMap(obj, function (x, i) {
  1164.         return {
  1165.           k: i,
  1166.           v: f(x, i)
  1167.         };
  1168.       });
  1169.     };
  1170.     var tupleMap = function (obj, f) {
  1171.       var r = {};
  1172.       each(obj, function (x, i) {
  1173.         var tuple = f(x, i);
  1174.         r[tuple.k] = tuple.v;
  1175.       });
  1176.       return r;
  1177.     };
  1178.     var objAcc = function (r) {
  1179.       return function (x, i) {
  1180.         r[i] = x;
  1181.       };
  1182.     };
  1183.     var internalFilter = function (obj, pred, onTrue, onFalse) {
  1184.       var r = {};
  1185.       each(obj, function (x, i) {
  1186.         (pred(x, i) ? onTrue : onFalse)(x, i);
  1187.       });
  1188.       return r;
  1189.     };
  1190.     var filter$1 = function (obj, pred) {
  1191.       var t = {};
  1192.       internalFilter(obj, pred, objAcc(t), noop);
  1193.       return t;
  1194.     };
  1195.     var mapToArray = function (obj, f) {
  1196.       var r = [];
  1197.       each(obj, function (value, name) {
  1198.         r.push(f(value, name));
  1199.       });
  1200.       return r;
  1201.     };
  1202.     var find = function (obj, pred) {
  1203.       var props = keys(obj);
  1204.       for (var k = 0, len = props.length; k < len; k++) {
  1205.         var i = props[k];
  1206.         var x = obj[i];
  1207.         if (pred(x, i, obj)) {
  1208.           return Optional.some(x);
  1209.         }
  1210.       }
  1211.       return Optional.none();
  1212.     };
  1213.     var values = function (obj) {
  1214.       return mapToArray(obj, identity);
  1215.     };
  1216.     var get$c = function (obj, key) {
  1217.       return has$2(obj, key) ? Optional.from(obj[key]) : Optional.none();
  1218.     };
  1219.     var has$2 = function (obj, key) {
  1220.       return hasOwnProperty.call(obj, key);
  1221.     };
  1222.     var hasNonNullableKey = function (obj, key) {
  1223.       return has$2(obj, key) && obj[key] !== undefined && obj[key] !== null;
  1224.     };
  1225.  
  1226.     var rawSet = function (dom, key, value) {
  1227.       if (isString(value) || isBoolean(value) || isNumber(value)) {
  1228.         dom.setAttribute(key, value + '');
  1229.       } else {
  1230.         console.error('Invalid call to Attribute.set. Key ', key, ':: Value ', value, ':: Element ', dom);
  1231.         throw new Error('Attribute value was not simple');
  1232.       }
  1233.     };
  1234.     var set$8 = function (element, key, value) {
  1235.       rawSet(element.dom, key, value);
  1236.     };
  1237.     var setAll$1 = function (element, attrs) {
  1238.       var dom = element.dom;
  1239.       each(attrs, function (v, k) {
  1240.         rawSet(dom, k, v);
  1241.       });
  1242.     };
  1243.     var get$b = function (element, key) {
  1244.       var v = element.dom.getAttribute(key);
  1245.       return v === null ? undefined : v;
  1246.     };
  1247.     var getOpt = function (element, key) {
  1248.       return Optional.from(get$b(element, key));
  1249.     };
  1250.     var has$1 = function (element, key) {
  1251.       var dom = element.dom;
  1252.       return dom && dom.hasAttribute ? dom.hasAttribute(key) : false;
  1253.     };
  1254.     var remove$6 = function (element, key) {
  1255.       element.dom.removeAttribute(key);
  1256.     };
  1257.  
  1258.     var read$2 = function (element, attr) {
  1259.       var value = get$b(element, attr);
  1260.       return value === undefined || value === '' ? [] : value.split(' ');
  1261.     };
  1262.     var add$3 = function (element, attr, id) {
  1263.       var old = read$2(element, attr);
  1264.       var nu = old.concat([id]);
  1265.       set$8(element, attr, nu.join(' '));
  1266.       return true;
  1267.     };
  1268.     var remove$5 = function (element, attr, id) {
  1269.       var nu = filter$2(read$2(element, attr), function (v) {
  1270.         return v !== id;
  1271.       });
  1272.       if (nu.length > 0) {
  1273.         set$8(element, attr, nu.join(' '));
  1274.       } else {
  1275.         remove$6(element, attr);
  1276.       }
  1277.       return false;
  1278.     };
  1279.  
  1280.     var supports = function (element) {
  1281.       return element.dom.classList !== undefined;
  1282.     };
  1283.     var get$a = function (element) {
  1284.       return read$2(element, 'class');
  1285.     };
  1286.     var add$2 = function (element, clazz) {
  1287.       return add$3(element, 'class', clazz);
  1288.     };
  1289.     var remove$4 = function (element, clazz) {
  1290.       return remove$5(element, 'class', clazz);
  1291.     };
  1292.  
  1293.     var add$1 = function (element, clazz) {
  1294.       if (supports(element)) {
  1295.         element.dom.classList.add(clazz);
  1296.       } else {
  1297.         add$2(element, clazz);
  1298.       }
  1299.     };
  1300.     var cleanClass = function (element) {
  1301.       var classList = supports(element) ? element.dom.classList : get$a(element);
  1302.       if (classList.length === 0) {
  1303.         remove$6(element, 'class');
  1304.       }
  1305.     };
  1306.     var remove$3 = function (element, clazz) {
  1307.       if (supports(element)) {
  1308.         var classList = element.dom.classList;
  1309.         classList.remove(clazz);
  1310.       } else {
  1311.         remove$4(element, clazz);
  1312.       }
  1313.       cleanClass(element);
  1314.     };
  1315.     var has = function (element, clazz) {
  1316.       return supports(element) && element.dom.classList.contains(clazz);
  1317.     };
  1318.  
  1319.     var swap = function (element, addCls, removeCls) {
  1320.       remove$3(element, removeCls);
  1321.       add$1(element, addCls);
  1322.     };
  1323.     var toAlpha = function (component, swapConfig, _swapState) {
  1324.       swap(component.element, swapConfig.alpha, swapConfig.omega);
  1325.     };
  1326.     var toOmega = function (component, swapConfig, _swapState) {
  1327.       swap(component.element, swapConfig.omega, swapConfig.alpha);
  1328.     };
  1329.     var clear$1 = function (component, swapConfig, _swapState) {
  1330.       remove$3(component.element, swapConfig.alpha);
  1331.       remove$3(component.element, swapConfig.omega);
  1332.     };
  1333.     var isAlpha = function (component, swapConfig, _swapState) {
  1334.       return has(component.element, swapConfig.alpha);
  1335.     };
  1336.     var isOmega = function (component, swapConfig, _swapState) {
  1337.       return has(component.element, swapConfig.omega);
  1338.     };
  1339.  
  1340.     var SwapApis = /*#__PURE__*/Object.freeze({
  1341.         __proto__: null,
  1342.         toAlpha: toAlpha,
  1343.         toOmega: toOmega,
  1344.         isAlpha: isAlpha,
  1345.         isOmega: isOmega,
  1346.         clear: clear$1
  1347.     });
  1348.  
  1349.     var value$2 = function (o) {
  1350.       var or = function (_opt) {
  1351.         return value$2(o);
  1352.       };
  1353.       var orThunk = function (_f) {
  1354.         return value$2(o);
  1355.       };
  1356.       var map = function (f) {
  1357.         return value$2(f(o));
  1358.       };
  1359.       var mapError = function (_f) {
  1360.         return value$2(o);
  1361.       };
  1362.       var each = function (f) {
  1363.         f(o);
  1364.       };
  1365.       var bind = function (f) {
  1366.         return f(o);
  1367.       };
  1368.       var fold = function (_, onValue) {
  1369.         return onValue(o);
  1370.       };
  1371.       var exists = function (f) {
  1372.         return f(o);
  1373.       };
  1374.       var forall = function (f) {
  1375.         return f(o);
  1376.       };
  1377.       var toOptional = function () {
  1378.         return Optional.some(o);
  1379.       };
  1380.       return {
  1381.         isValue: always,
  1382.         isError: never,
  1383.         getOr: constant$1(o),
  1384.         getOrThunk: constant$1(o),
  1385.         getOrDie: constant$1(o),
  1386.         or: or,
  1387.         orThunk: orThunk,
  1388.         fold: fold,
  1389.         map: map,
  1390.         mapError: mapError,
  1391.         each: each,
  1392.         bind: bind,
  1393.         exists: exists,
  1394.         forall: forall,
  1395.         toOptional: toOptional
  1396.       };
  1397.     };
  1398.     var error = function (message) {
  1399.       var getOrThunk = function (f) {
  1400.         return f();
  1401.       };
  1402.       var getOrDie = function () {
  1403.         return die(String(message))();
  1404.       };
  1405.       var or = identity;
  1406.       var orThunk = function (f) {
  1407.         return f();
  1408.       };
  1409.       var map = function (_f) {
  1410.         return error(message);
  1411.       };
  1412.       var mapError = function (f) {
  1413.         return error(f(message));
  1414.       };
  1415.       var bind = function (_f) {
  1416.         return error(message);
  1417.       };
  1418.       var fold = function (onError, _) {
  1419.         return onError(message);
  1420.       };
  1421.       return {
  1422.         isValue: never,
  1423.         isError: always,
  1424.         getOr: identity,
  1425.         getOrThunk: getOrThunk,
  1426.         getOrDie: getOrDie,
  1427.         or: or,
  1428.         orThunk: orThunk,
  1429.         fold: fold,
  1430.         map: map,
  1431.         mapError: mapError,
  1432.         each: noop,
  1433.         bind: bind,
  1434.         exists: never,
  1435.         forall: always,
  1436.         toOptional: Optional.none
  1437.       };
  1438.     };
  1439.     var fromOption = function (opt, err) {
  1440.       return opt.fold(function () {
  1441.         return error(err);
  1442.       }, value$2);
  1443.     };
  1444.     var Result = {
  1445.       value: value$2,
  1446.       error: error,
  1447.       fromOption: fromOption
  1448.     };
  1449.  
  1450.     var SimpleResultType;
  1451.     (function (SimpleResultType) {
  1452.       SimpleResultType[SimpleResultType['Error'] = 0] = 'Error';
  1453.       SimpleResultType[SimpleResultType['Value'] = 1] = 'Value';
  1454.     }(SimpleResultType || (SimpleResultType = {})));
  1455.     var fold$1 = function (res, onError, onValue) {
  1456.       return res.stype === SimpleResultType.Error ? onError(res.serror) : onValue(res.svalue);
  1457.     };
  1458.     var partition$1 = function (results) {
  1459.       var values = [];
  1460.       var errors = [];
  1461.       each$1(results, function (obj) {
  1462.         fold$1(obj, function (err) {
  1463.           return errors.push(err);
  1464.         }, function (val) {
  1465.           return values.push(val);
  1466.         });
  1467.       });
  1468.       return {
  1469.         values: values,
  1470.         errors: errors
  1471.       };
  1472.     };
  1473.     var mapError = function (res, f) {
  1474.       if (res.stype === SimpleResultType.Error) {
  1475.         return {
  1476.           stype: SimpleResultType.Error,
  1477.           serror: f(res.serror)
  1478.         };
  1479.       } else {
  1480.         return res;
  1481.       }
  1482.     };
  1483.     var map = function (res, f) {
  1484.       if (res.stype === SimpleResultType.Value) {
  1485.         return {
  1486.           stype: SimpleResultType.Value,
  1487.           svalue: f(res.svalue)
  1488.         };
  1489.       } else {
  1490.         return res;
  1491.       }
  1492.     };
  1493.     var bind$2 = function (res, f) {
  1494.       if (res.stype === SimpleResultType.Value) {
  1495.         return f(res.svalue);
  1496.       } else {
  1497.         return res;
  1498.       }
  1499.     };
  1500.     var bindError = function (res, f) {
  1501.       if (res.stype === SimpleResultType.Error) {
  1502.         return f(res.serror);
  1503.       } else {
  1504.         return res;
  1505.       }
  1506.     };
  1507.     var svalue = function (v) {
  1508.       return {
  1509.         stype: SimpleResultType.Value,
  1510.         svalue: v
  1511.       };
  1512.     };
  1513.     var serror = function (e) {
  1514.       return {
  1515.         stype: SimpleResultType.Error,
  1516.         serror: e
  1517.       };
  1518.     };
  1519.     var toResult$1 = function (res) {
  1520.       return fold$1(res, Result.error, Result.value);
  1521.     };
  1522.     var fromResult = function (res) {
  1523.       return res.fold(serror, svalue);
  1524.     };
  1525.     var SimpleResult = {
  1526.       fromResult: fromResult,
  1527.       toResult: toResult$1,
  1528.       svalue: svalue,
  1529.       partition: partition$1,
  1530.       serror: serror,
  1531.       bind: bind$2,
  1532.       bindError: bindError,
  1533.       map: map,
  1534.       mapError: mapError,
  1535.       fold: fold$1
  1536.     };
  1537.  
  1538.     var field$3 = function (key, newKey, presence, prop) {
  1539.       return {
  1540.         tag: 'field',
  1541.         key: key,
  1542.         newKey: newKey,
  1543.         presence: presence,
  1544.         prop: prop
  1545.       };
  1546.     };
  1547.     var customField$1 = function (newKey, instantiator) {
  1548.       return {
  1549.         tag: 'custom',
  1550.         newKey: newKey,
  1551.         instantiator: instantiator
  1552.       };
  1553.     };
  1554.     var fold = function (value, ifField, ifCustom) {
  1555.       switch (value.tag) {
  1556.       case 'field':
  1557.         return ifField(value.key, value.newKey, value.presence, value.prop);
  1558.       case 'custom':
  1559.         return ifCustom(value.newKey, value.instantiator);
  1560.       }
  1561.     };
  1562.  
  1563.     var shallow$1 = function (old, nu) {
  1564.       return nu;
  1565.     };
  1566.     var deep = function (old, nu) {
  1567.       var bothObjects = isObject(old) && isObject(nu);
  1568.       return bothObjects ? deepMerge(old, nu) : nu;
  1569.     };
  1570.     var baseMerge = function (merger) {
  1571.       return function () {
  1572.         var objects = [];
  1573.         for (var _i = 0; _i < arguments.length; _i++) {
  1574.           objects[_i] = arguments[_i];
  1575.         }
  1576.         if (objects.length === 0) {
  1577.           throw new Error('Can\'t merge zero objects');
  1578.         }
  1579.         var ret = {};
  1580.         for (var j = 0; j < objects.length; j++) {
  1581.           var curObject = objects[j];
  1582.           for (var key in curObject) {
  1583.             if (has$2(curObject, key)) {
  1584.               ret[key] = merger(ret[key], curObject[key]);
  1585.             }
  1586.           }
  1587.         }
  1588.         return ret;
  1589.       };
  1590.     };
  1591.     var deepMerge = baseMerge(deep);
  1592.     var merge$1 = baseMerge(shallow$1);
  1593.  
  1594.     var required$2 = function () {
  1595.       return {
  1596.         tag: 'required',
  1597.         process: {}
  1598.       };
  1599.     };
  1600.     var defaultedThunk = function (fallbackThunk) {
  1601.       return {
  1602.         tag: 'defaultedThunk',
  1603.         process: fallbackThunk
  1604.       };
  1605.     };
  1606.     var defaulted$1 = function (fallback) {
  1607.       return defaultedThunk(constant$1(fallback));
  1608.     };
  1609.     var asOption = function () {
  1610.       return {
  1611.         tag: 'option',
  1612.         process: {}
  1613.       };
  1614.     };
  1615.     var mergeWithThunk = function (baseThunk) {
  1616.       return {
  1617.         tag: 'mergeWithThunk',
  1618.         process: baseThunk
  1619.       };
  1620.     };
  1621.     var mergeWith = function (base) {
  1622.       return mergeWithThunk(constant$1(base));
  1623.     };
  1624.  
  1625.     var mergeValues$1 = function (values, base) {
  1626.       return values.length > 0 ? SimpleResult.svalue(deepMerge(base, merge$1.apply(undefined, values))) : SimpleResult.svalue(base);
  1627.     };
  1628.     var mergeErrors$1 = function (errors) {
  1629.       return compose(SimpleResult.serror, flatten)(errors);
  1630.     };
  1631.     var consolidateObj = function (objects, base) {
  1632.       var partition = SimpleResult.partition(objects);
  1633.       return partition.errors.length > 0 ? mergeErrors$1(partition.errors) : mergeValues$1(partition.values, base);
  1634.     };
  1635.     var consolidateArr = function (objects) {
  1636.       var partitions = SimpleResult.partition(objects);
  1637.       return partitions.errors.length > 0 ? mergeErrors$1(partitions.errors) : SimpleResult.svalue(partitions.values);
  1638.     };
  1639.     var ResultCombine = {
  1640.       consolidateObj: consolidateObj,
  1641.       consolidateArr: consolidateArr
  1642.     };
  1643.  
  1644.     var formatObj = function (input) {
  1645.       return isObject(input) && keys(input).length > 100 ? ' removed due to size' : JSON.stringify(input, null, 2);
  1646.     };
  1647.     var formatErrors = function (errors) {
  1648.       var es = errors.length > 10 ? errors.slice(0, 10).concat([{
  1649.           path: [],
  1650.           getErrorInfo: constant$1('... (only showing first ten failures)')
  1651.         }]) : errors;
  1652.       return map$2(es, function (e) {
  1653.         return 'Failed path: (' + e.path.join(' > ') + ')\n' + e.getErrorInfo();
  1654.       });
  1655.     };
  1656.  
  1657.     var nu$5 = function (path, getErrorInfo) {
  1658.       return SimpleResult.serror([{
  1659.           path: path,
  1660.           getErrorInfo: getErrorInfo
  1661.         }]);
  1662.     };
  1663.     var missingRequired = function (path, key, obj) {
  1664.       return nu$5(path, function () {
  1665.         return 'Could not find valid *required* value for "' + key + '" in ' + formatObj(obj);
  1666.       });
  1667.     };
  1668.     var missingKey = function (path, key) {
  1669.       return nu$5(path, function () {
  1670.         return 'Choice schema did not contain choice key: "' + key + '"';
  1671.       });
  1672.     };
  1673.     var missingBranch = function (path, branches, branch) {
  1674.       return nu$5(path, function () {
  1675.         return 'The chosen schema: "' + branch + '" did not exist in branches: ' + formatObj(branches);
  1676.       });
  1677.     };
  1678.     var unsupportedFields = function (path, unsupported) {
  1679.       return nu$5(path, function () {
  1680.         return 'There are unsupported fields: [' + unsupported.join(', ') + '] specified';
  1681.       });
  1682.     };
  1683.     var custom = function (path, err) {
  1684.       return nu$5(path, constant$1(err));
  1685.     };
  1686.  
  1687.     var value$1 = function (validator) {
  1688.       var extract = function (path, val) {
  1689.         return SimpleResult.bindError(validator(val), function (err) {
  1690.           return custom(path, err);
  1691.         });
  1692.       };
  1693.       var toString = constant$1('val');
  1694.       return {
  1695.         extract: extract,
  1696.         toString: toString
  1697.       };
  1698.     };
  1699.     var anyValue$1 = value$1(SimpleResult.svalue);
  1700.  
  1701.     var requiredAccess = function (path, obj, key, bundle) {
  1702.       return get$c(obj, key).fold(function () {
  1703.         return missingRequired(path, key, obj);
  1704.       }, bundle);
  1705.     };
  1706.     var fallbackAccess = function (obj, key, fallback, bundle) {
  1707.       var v = get$c(obj, key).getOrThunk(function () {
  1708.         return fallback(obj);
  1709.       });
  1710.       return bundle(v);
  1711.     };
  1712.     var optionAccess = function (obj, key, bundle) {
  1713.       return bundle(get$c(obj, key));
  1714.     };
  1715.     var optionDefaultedAccess = function (obj, key, fallback, bundle) {
  1716.       var opt = get$c(obj, key).map(function (val) {
  1717.         return val === true ? fallback(obj) : val;
  1718.       });
  1719.       return bundle(opt);
  1720.     };
  1721.     var extractField = function (field, path, obj, key, prop) {
  1722.       var bundle = function (av) {
  1723.         return prop.extract(path.concat([key]), av);
  1724.       };
  1725.       var bundleAsOption = function (optValue) {
  1726.         return optValue.fold(function () {
  1727.           return SimpleResult.svalue(Optional.none());
  1728.         }, function (ov) {
  1729.           var result = prop.extract(path.concat([key]), ov);
  1730.           return SimpleResult.map(result, Optional.some);
  1731.         });
  1732.       };
  1733.       switch (field.tag) {
  1734.       case 'required':
  1735.         return requiredAccess(path, obj, key, bundle);
  1736.       case 'defaultedThunk':
  1737.         return fallbackAccess(obj, key, field.process, bundle);
  1738.       case 'option':
  1739.         return optionAccess(obj, key, bundleAsOption);
  1740.       case 'defaultedOptionThunk':
  1741.         return optionDefaultedAccess(obj, key, field.process, bundleAsOption);
  1742.       case 'mergeWithThunk': {
  1743.           return fallbackAccess(obj, key, constant$1({}), function (v) {
  1744.             var result = deepMerge(field.process(obj), v);
  1745.             return bundle(result);
  1746.           });
  1747.         }
  1748.       }
  1749.     };
  1750.     var extractFields = function (path, obj, fields) {
  1751.       var success = {};
  1752.       var errors = [];
  1753.       for (var _i = 0, fields_1 = fields; _i < fields_1.length; _i++) {
  1754.         var field = fields_1[_i];
  1755.         fold(field, function (key, newKey, presence, prop) {
  1756.           var result = extractField(presence, path, obj, key, prop);
  1757.           SimpleResult.fold(result, function (err) {
  1758.             errors.push.apply(errors, err);
  1759.           }, function (res) {
  1760.             success[newKey] = res;
  1761.           });
  1762.         }, function (newKey, instantiator) {
  1763.           success[newKey] = instantiator(obj);
  1764.         });
  1765.       }
  1766.       return errors.length > 0 ? SimpleResult.serror(errors) : SimpleResult.svalue(success);
  1767.     };
  1768.     var getSetKeys = function (obj) {
  1769.       return keys(filter$1(obj, isNonNullable));
  1770.     };
  1771.     var objOfOnly = function (fields) {
  1772.       var delegate = objOf(fields);
  1773.       var fieldNames = foldr(fields, function (acc, value) {
  1774.         return fold(value, function (key) {
  1775.           var _a;
  1776.           return deepMerge(acc, (_a = {}, _a[key] = true, _a));
  1777.         }, constant$1(acc));
  1778.       }, {});
  1779.       var extract = function (path, o) {
  1780.         var keys = isBoolean(o) ? [] : getSetKeys(o);
  1781.         var extra = filter$2(keys, function (k) {
  1782.           return !hasNonNullableKey(fieldNames, k);
  1783.         });
  1784.         return extra.length === 0 ? delegate.extract(path, o) : unsupportedFields(path, extra);
  1785.       };
  1786.       return {
  1787.         extract: extract,
  1788.         toString: delegate.toString
  1789.       };
  1790.     };
  1791.     var objOf = function (values) {
  1792.       var extract = function (path, o) {
  1793.         return extractFields(path, o, values);
  1794.       };
  1795.       var toString = function () {
  1796.         var fieldStrings = map$2(values, function (value) {
  1797.           return fold(value, function (key, _okey, _presence, prop) {
  1798.             return key + ' -> ' + prop.toString();
  1799.           }, function (newKey, _instantiator) {
  1800.             return 'state(' + newKey + ')';
  1801.           });
  1802.         });
  1803.         return 'obj{\n' + fieldStrings.join('\n') + '}';
  1804.       };
  1805.       return {
  1806.         extract: extract,
  1807.         toString: toString
  1808.       };
  1809.     };
  1810.     var arrOf = function (prop) {
  1811.       var extract = function (path, array) {
  1812.         var results = map$2(array, function (a, i) {
  1813.           return prop.extract(path.concat(['[' + i + ']']), a);
  1814.         });
  1815.         return ResultCombine.consolidateArr(results);
  1816.       };
  1817.       var toString = function () {
  1818.         return 'array(' + prop.toString() + ')';
  1819.       };
  1820.       return {
  1821.         extract: extract,
  1822.         toString: toString
  1823.       };
  1824.     };
  1825.     var setOf$1 = function (validator, prop) {
  1826.       var validateKeys = function (path, keys) {
  1827.         return arrOf(value$1(validator)).extract(path, keys);
  1828.       };
  1829.       var extract = function (path, o) {
  1830.         var keys$1 = keys(o);
  1831.         var validatedKeys = validateKeys(path, keys$1);
  1832.         return SimpleResult.bind(validatedKeys, function (validKeys) {
  1833.           var schema = map$2(validKeys, function (vk) {
  1834.             return field$3(vk, vk, required$2(), prop);
  1835.           });
  1836.           return objOf(schema).extract(path, o);
  1837.         });
  1838.       };
  1839.       var toString = function () {
  1840.         return 'setOf(' + prop.toString() + ')';
  1841.       };
  1842.       return {
  1843.         extract: extract,
  1844.         toString: toString
  1845.       };
  1846.     };
  1847.  
  1848.     var anyValue = constant$1(anyValue$1);
  1849.     var typedValue = function (validator, expectedType) {
  1850.       return value$1(function (a) {
  1851.         var actualType = typeof a;
  1852.         return validator(a) ? SimpleResult.svalue(a) : SimpleResult.serror('Expected type: ' + expectedType + ' but got: ' + actualType);
  1853.       });
  1854.     };
  1855.     var functionProcessor = typedValue(isFunction, 'function');
  1856.  
  1857.     var chooseFrom = function (path, input, branches, ch) {
  1858.       var fields = get$c(branches, ch);
  1859.       return fields.fold(function () {
  1860.         return missingBranch(path, branches, ch);
  1861.       }, function (vp) {
  1862.         return vp.extract(path.concat(['branch: ' + ch]), input);
  1863.       });
  1864.     };
  1865.     var choose$2 = function (key, branches) {
  1866.       var extract = function (path, input) {
  1867.         var choice = get$c(input, key);
  1868.         return choice.fold(function () {
  1869.           return missingKey(path, key);
  1870.         }, function (chosen) {
  1871.           return chooseFrom(path, input, branches, chosen);
  1872.         });
  1873.       };
  1874.       var toString = function () {
  1875.         return 'chooseOn(' + key + '). Possible values: ' + keys(branches);
  1876.       };
  1877.       return {
  1878.         extract: extract,
  1879.         toString: toString
  1880.       };
  1881.     };
  1882.  
  1883.     var valueOf = function (validator) {
  1884.       return value$1(function (v) {
  1885.         return validator(v).fold(SimpleResult.serror, SimpleResult.svalue);
  1886.       });
  1887.     };
  1888.     var setOf = function (validator, prop) {
  1889.       return setOf$1(function (v) {
  1890.         return SimpleResult.fromResult(validator(v));
  1891.       }, prop);
  1892.     };
  1893.     var extractValue = function (label, prop, obj) {
  1894.       var res = prop.extract([label], obj);
  1895.       return SimpleResult.mapError(res, function (errs) {
  1896.         return {
  1897.           input: obj,
  1898.           errors: errs
  1899.         };
  1900.       });
  1901.     };
  1902.     var asRaw = function (label, prop, obj) {
  1903.       return SimpleResult.toResult(extractValue(label, prop, obj));
  1904.     };
  1905.     var getOrDie = function (extraction) {
  1906.       return extraction.fold(function (errInfo) {
  1907.         throw new Error(formatError(errInfo));
  1908.       }, identity);
  1909.     };
  1910.     var asRawOrDie$1 = function (label, prop, obj) {
  1911.       return getOrDie(asRaw(label, prop, obj));
  1912.     };
  1913.     var formatError = function (errInfo) {
  1914.       return 'Errors: \n' + formatErrors(errInfo.errors).join('\n') + '\n\nInput object: ' + formatObj(errInfo.input);
  1915.     };
  1916.     var choose$1 = function (key, branches) {
  1917.       return choose$2(key, map$1(branches, objOf));
  1918.     };
  1919.  
  1920.     var field$2 = field$3;
  1921.     var customField = customField$1;
  1922.     var required$1 = function (key) {
  1923.       return field$2(key, key, required$2(), anyValue());
  1924.     };
  1925.     var requiredOf = function (key, schema) {
  1926.       return field$2(key, key, required$2(), schema);
  1927.     };
  1928.     var forbid = function (key, message) {
  1929.       return field$2(key, key, asOption(), value$1(function (_v) {
  1930.         return SimpleResult.serror('The field: ' + key + ' is forbidden. ' + message);
  1931.       }));
  1932.     };
  1933.     var requiredObjOf = function (key, objSchema) {
  1934.       return field$2(key, key, required$2(), objOf(objSchema));
  1935.     };
  1936.     var option = function (key) {
  1937.       return field$2(key, key, asOption(), anyValue());
  1938.     };
  1939.     var optionOf = function (key, schema) {
  1940.       return field$2(key, key, asOption(), schema);
  1941.     };
  1942.     var optionObjOf = function (key, objSchema) {
  1943.       return optionOf(key, objOf(objSchema));
  1944.     };
  1945.     var optionObjOfOnly = function (key, objSchema) {
  1946.       return optionOf(key, objOfOnly(objSchema));
  1947.     };
  1948.     var defaulted = function (key, fallback) {
  1949.       return field$2(key, key, defaulted$1(fallback), anyValue());
  1950.     };
  1951.     var defaultedOf = function (key, fallback, schema) {
  1952.       return field$2(key, key, defaulted$1(fallback), schema);
  1953.     };
  1954.     var defaultedFunction = function (key, fallback) {
  1955.       return defaultedOf(key, fallback, functionProcessor);
  1956.     };
  1957.     var defaultedObjOf = function (key, fallback, objSchema) {
  1958.       return defaultedOf(key, fallback, objOf(objSchema));
  1959.     };
  1960.  
  1961.     var SwapSchema = [
  1962.       required$1('alpha'),
  1963.       required$1('omega')
  1964.     ];
  1965.  
  1966.     var generate$5 = function (cases) {
  1967.       if (!isArray(cases)) {
  1968.         throw new Error('cases must be an array');
  1969.       }
  1970.       if (cases.length === 0) {
  1971.         throw new Error('there must be at least one case');
  1972.       }
  1973.       var constructors = [];
  1974.       var adt = {};
  1975.       each$1(cases, function (acase, count) {
  1976.         var keys$1 = keys(acase);
  1977.         if (keys$1.length !== 1) {
  1978.           throw new Error('one and only one name per case');
  1979.         }
  1980.         var key = keys$1[0];
  1981.         var value = acase[key];
  1982.         if (adt[key] !== undefined) {
  1983.           throw new Error('duplicate key detected:' + key);
  1984.         } else if (key === 'cata') {
  1985.           throw new Error('cannot have a case named cata (sorry)');
  1986.         } else if (!isArray(value)) {
  1987.           throw new Error('case arguments must be an array');
  1988.         }
  1989.         constructors.push(key);
  1990.         adt[key] = function () {
  1991.           var args = [];
  1992.           for (var _i = 0; _i < arguments.length; _i++) {
  1993.             args[_i] = arguments[_i];
  1994.           }
  1995.           var argLength = args.length;
  1996.           if (argLength !== value.length) {
  1997.             throw new Error('Wrong number of arguments to case ' + key + '. Expected ' + value.length + ' (' + value + '), got ' + argLength);
  1998.           }
  1999.           var match = function (branches) {
  2000.             var branchKeys = keys(branches);
  2001.             if (constructors.length !== branchKeys.length) {
  2002.               throw new Error('Wrong number of arguments to match. Expected: ' + constructors.join(',') + '\nActual: ' + branchKeys.join(','));
  2003.             }
  2004.             var allReqd = forall(constructors, function (reqKey) {
  2005.               return contains$1(branchKeys, reqKey);
  2006.             });
  2007.             if (!allReqd) {
  2008.               throw new Error('Not all branches were specified when using match. Specified: ' + branchKeys.join(', ') + '\nRequired: ' + constructors.join(', '));
  2009.             }
  2010.             return branches[key].apply(null, args);
  2011.           };
  2012.           return {
  2013.             fold: function () {
  2014.               var foldArgs = [];
  2015.               for (var _i = 0; _i < arguments.length; _i++) {
  2016.                 foldArgs[_i] = arguments[_i];
  2017.               }
  2018.               if (foldArgs.length !== cases.length) {
  2019.                 throw new Error('Wrong number of arguments to fold. Expected ' + cases.length + ', got ' + foldArgs.length);
  2020.               }
  2021.               var target = foldArgs[count];
  2022.               return target.apply(null, args);
  2023.             },
  2024.             match: match,
  2025.             log: function (label) {
  2026.               console.log(label, {
  2027.                 constructors: constructors,
  2028.                 constructor: key,
  2029.                 params: args
  2030.               });
  2031.             }
  2032.           };
  2033.         };
  2034.       });
  2035.       return adt;
  2036.     };
  2037.     var Adt = { generate: generate$5 };
  2038.  
  2039.     Adt.generate([
  2040.       {
  2041.         bothErrors: [
  2042.           'error1',
  2043.           'error2'
  2044.         ]
  2045.       },
  2046.       {
  2047.         firstError: [
  2048.           'error1',
  2049.           'value2'
  2050.         ]
  2051.       },
  2052.       {
  2053.         secondError: [
  2054.           'value1',
  2055.           'error2'
  2056.         ]
  2057.       },
  2058.       {
  2059.         bothValues: [
  2060.           'value1',
  2061.           'value2'
  2062.         ]
  2063.       }
  2064.     ]);
  2065.     var partition = function (results) {
  2066.       var errors = [];
  2067.       var values = [];
  2068.       each$1(results, function (result) {
  2069.         result.fold(function (err) {
  2070.           errors.push(err);
  2071.         }, function (value) {
  2072.           values.push(value);
  2073.         });
  2074.       });
  2075.       return {
  2076.         errors: errors,
  2077.         values: values
  2078.       };
  2079.     };
  2080.  
  2081.     var exclude$1 = function (obj, fields) {
  2082.       var r = {};
  2083.       each(obj, function (v, k) {
  2084.         if (!contains$1(fields, k)) {
  2085.           r[k] = v;
  2086.         }
  2087.       });
  2088.       return r;
  2089.     };
  2090.  
  2091.     var wrap$1 = function (key, value) {
  2092.       var _a;
  2093.       return _a = {}, _a[key] = value, _a;
  2094.     };
  2095.     var wrapAll$1 = function (keyvalues) {
  2096.       var r = {};
  2097.       each$1(keyvalues, function (kv) {
  2098.         r[kv.key] = kv.value;
  2099.       });
  2100.       return r;
  2101.     };
  2102.  
  2103.     var exclude = function (obj, fields) {
  2104.       return exclude$1(obj, fields);
  2105.     };
  2106.     var wrap = function (key, value) {
  2107.       return wrap$1(key, value);
  2108.     };
  2109.     var wrapAll = function (keyvalues) {
  2110.       return wrapAll$1(keyvalues);
  2111.     };
  2112.     var mergeValues = function (values, base) {
  2113.       return values.length === 0 ? Result.value(base) : Result.value(deepMerge(base, merge$1.apply(undefined, values)));
  2114.     };
  2115.     var mergeErrors = function (errors) {
  2116.       return Result.error(flatten(errors));
  2117.     };
  2118.     var consolidate = function (objs, base) {
  2119.       var partitions = partition(objs);
  2120.       return partitions.errors.length > 0 ? mergeErrors(partitions.errors) : mergeValues(partitions.values, base);
  2121.     };
  2122.  
  2123.     var is = function (lhs, rhs, comparator) {
  2124.       if (comparator === void 0) {
  2125.         comparator = tripleEquals;
  2126.       }
  2127.       return lhs.exists(function (left) {
  2128.         return comparator(left, rhs);
  2129.       });
  2130.     };
  2131.     var cat = function (arr) {
  2132.       var r = [];
  2133.       var push = function (x) {
  2134.         r.push(x);
  2135.       };
  2136.       for (var i = 0; i < arr.length; i++) {
  2137.         arr[i].each(push);
  2138.       }
  2139.       return r;
  2140.     };
  2141.     var sequence = function (arr) {
  2142.       var r = [];
  2143.       for (var i = 0; i < arr.length; i++) {
  2144.         var x = arr[i];
  2145.         if (x.isSome()) {
  2146.           r.push(x.getOrDie());
  2147.         } else {
  2148.           return Optional.none();
  2149.         }
  2150.       }
  2151.       return Optional.some(r);
  2152.     };
  2153.     var lift2 = function (oa, ob, f) {
  2154.       return oa.isSome() && ob.isSome() ? Optional.some(f(oa.getOrDie(), ob.getOrDie())) : Optional.none();
  2155.     };
  2156.     var someIf = function (b, a) {
  2157.       return b ? Optional.some(a) : Optional.none();
  2158.     };
  2159.  
  2160.     var ensureIsRoot = function (isRoot) {
  2161.       return isFunction(isRoot) ? isRoot : never;
  2162.     };
  2163.     var ancestor$2 = function (scope, transform, isRoot) {
  2164.       var element = scope.dom;
  2165.       var stop = ensureIsRoot(isRoot);
  2166.       while (element.parentNode) {
  2167.         element = element.parentNode;
  2168.         var el = SugarElement.fromDom(element);
  2169.         var transformed = transform(el);
  2170.         if (transformed.isSome()) {
  2171.           return transformed;
  2172.         } else if (stop(el)) {
  2173.           break;
  2174.         }
  2175.       }
  2176.       return Optional.none();
  2177.     };
  2178.     var closest$3 = function (scope, transform, isRoot) {
  2179.       var current = transform(scope);
  2180.       var stop = ensureIsRoot(isRoot);
  2181.       return current.orThunk(function () {
  2182.         return stop(scope) ? Optional.none() : ancestor$2(scope, transform, stop);
  2183.       });
  2184.     };
  2185.  
  2186.     var isSource = function (component, simulatedEvent) {
  2187.       return eq(component.element, simulatedEvent.event.target);
  2188.     };
  2189.  
  2190.     var defaultEventHandler = {
  2191.       can: always,
  2192.       abort: never,
  2193.       run: noop
  2194.     };
  2195.     var nu$4 = function (parts) {
  2196.       if (!hasNonNullableKey(parts, 'can') && !hasNonNullableKey(parts, 'abort') && !hasNonNullableKey(parts, 'run')) {
  2197.         throw new Error('EventHandler defined by: ' + JSON.stringify(parts, null, 2) + ' does not have can, abort, or run!');
  2198.       }
  2199.       return __assign(__assign({}, defaultEventHandler), parts);
  2200.     };
  2201.     var all$1 = function (handlers, f) {
  2202.       return function () {
  2203.         var args = [];
  2204.         for (var _i = 0; _i < arguments.length; _i++) {
  2205.           args[_i] = arguments[_i];
  2206.         }
  2207.         return foldl(handlers, function (acc, handler) {
  2208.           return acc && f(handler).apply(undefined, args);
  2209.         }, true);
  2210.       };
  2211.     };
  2212.     var any = function (handlers, f) {
  2213.       return function () {
  2214.         var args = [];
  2215.         for (var _i = 0; _i < arguments.length; _i++) {
  2216.           args[_i] = arguments[_i];
  2217.         }
  2218.         return foldl(handlers, function (acc, handler) {
  2219.           return acc || f(handler).apply(undefined, args);
  2220.         }, false);
  2221.       };
  2222.     };
  2223.     var read$1 = function (handler) {
  2224.       return isFunction(handler) ? {
  2225.         can: always,
  2226.         abort: never,
  2227.         run: handler
  2228.       } : handler;
  2229.     };
  2230.     var fuse$1 = function (handlers) {
  2231.       var can = all$1(handlers, function (handler) {
  2232.         return handler.can;
  2233.       });
  2234.       var abort = any(handlers, function (handler) {
  2235.         return handler.abort;
  2236.       });
  2237.       var run = function () {
  2238.         var args = [];
  2239.         for (var _i = 0; _i < arguments.length; _i++) {
  2240.           args[_i] = arguments[_i];
  2241.         }
  2242.         each$1(handlers, function (handler) {
  2243.           handler.run.apply(undefined, args);
  2244.         });
  2245.       };
  2246.       return {
  2247.         can: can,
  2248.         abort: abort,
  2249.         run: run
  2250.       };
  2251.     };
  2252.  
  2253.     var derive$3 = function (configs) {
  2254.       return wrapAll(configs);
  2255.     };
  2256.     var abort = function (name, predicate) {
  2257.       return {
  2258.         key: name,
  2259.         value: nu$4({ abort: predicate })
  2260.       };
  2261.     };
  2262.     var can = function (name, predicate) {
  2263.       return {
  2264.         key: name,
  2265.         value: nu$4({ can: predicate })
  2266.       };
  2267.     };
  2268.     var run = function (name, handler) {
  2269.       return {
  2270.         key: name,
  2271.         value: nu$4({ run: handler })
  2272.       };
  2273.     };
  2274.     var runActionExtra = function (name, action, extra) {
  2275.       return {
  2276.         key: name,
  2277.         value: nu$4({
  2278.           run: function (component, simulatedEvent) {
  2279.             action.apply(undefined, [
  2280.               component,
  2281.               simulatedEvent
  2282.             ].concat(extra));
  2283.           }
  2284.         })
  2285.       };
  2286.     };
  2287.     var runOnName = function (name) {
  2288.       return function (handler) {
  2289.         return run(name, handler);
  2290.       };
  2291.     };
  2292.     var runOnSourceName = function (name) {
  2293.       return function (handler) {
  2294.         return {
  2295.           key: name,
  2296.           value: nu$4({
  2297.             run: function (component, simulatedEvent) {
  2298.               if (isSource(component, simulatedEvent)) {
  2299.                 handler(component, simulatedEvent);
  2300.               }
  2301.             }
  2302.           })
  2303.         };
  2304.       };
  2305.     };
  2306.     var redirectToUid = function (name, uid) {
  2307.       return run(name, function (component, simulatedEvent) {
  2308.         component.getSystem().getByUid(uid).each(function (redirectee) {
  2309.           dispatchEvent(redirectee, redirectee.element, name, simulatedEvent);
  2310.         });
  2311.       });
  2312.     };
  2313.     var redirectToPart = function (name, detail, partName) {
  2314.       var uid = detail.partUids[partName];
  2315.       return redirectToUid(name, uid);
  2316.     };
  2317.     var cutter = function (name) {
  2318.       return run(name, function (component, simulatedEvent) {
  2319.         simulatedEvent.cut();
  2320.       });
  2321.     };
  2322.     var stopper = function (name) {
  2323.       return run(name, function (component, simulatedEvent) {
  2324.         simulatedEvent.stop();
  2325.       });
  2326.     };
  2327.     var runOnSource = function (name, f) {
  2328.       return runOnSourceName(name)(f);
  2329.     };
  2330.     var runOnAttached = runOnSourceName(attachedToDom());
  2331.     var runOnDetached = runOnSourceName(detachedFromDom());
  2332.     var runOnInit = runOnSourceName(systemInit());
  2333.     var runOnExecute = runOnName(execute$5());
  2334.  
  2335.     var markAsBehaviourApi = function (f, apiName, apiFunction) {
  2336.       var delegate = apiFunction.toString();
  2337.       var endIndex = delegate.indexOf(')') + 1;
  2338.       var openBracketIndex = delegate.indexOf('(');
  2339.       var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
  2340.       f.toFunctionAnnotation = function () {
  2341.         return {
  2342.           name: apiName,
  2343.           parameters: cleanParameters(parameters.slice(0, 1).concat(parameters.slice(3)))
  2344.         };
  2345.       };
  2346.       return f;
  2347.     };
  2348.     var cleanParameters = function (parameters) {
  2349.       return map$2(parameters, function (p) {
  2350.         return endsWith(p, '/*') ? p.substring(0, p.length - '/*'.length) : p;
  2351.       });
  2352.     };
  2353.     var markAsExtraApi = function (f, extraName) {
  2354.       var delegate = f.toString();
  2355.       var endIndex = delegate.indexOf(')') + 1;
  2356.       var openBracketIndex = delegate.indexOf('(');
  2357.       var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
  2358.       f.toFunctionAnnotation = function () {
  2359.         return {
  2360.           name: extraName,
  2361.           parameters: cleanParameters(parameters)
  2362.         };
  2363.       };
  2364.       return f;
  2365.     };
  2366.     var markAsSketchApi = function (f, apiFunction) {
  2367.       var delegate = apiFunction.toString();
  2368.       var endIndex = delegate.indexOf(')') + 1;
  2369.       var openBracketIndex = delegate.indexOf('(');
  2370.       var parameters = delegate.substring(openBracketIndex + 1, endIndex - 1).split(/,\s*/);
  2371.       f.toFunctionAnnotation = function () {
  2372.         return {
  2373.           name: 'OVERRIDE',
  2374.           parameters: cleanParameters(parameters.slice(1))
  2375.         };
  2376.       };
  2377.       return f;
  2378.     };
  2379.  
  2380.     var nu$3 = function (s) {
  2381.       return {
  2382.         classes: isUndefined(s.classes) ? [] : s.classes,
  2383.         attributes: isUndefined(s.attributes) ? {} : s.attributes,
  2384.         styles: isUndefined(s.styles) ? {} : s.styles
  2385.       };
  2386.     };
  2387.     var merge = function (defnA, mod) {
  2388.       return __assign(__assign({}, defnA), {
  2389.         attributes: __assign(__assign({}, defnA.attributes), mod.attributes),
  2390.         styles: __assign(__assign({}, defnA.styles), mod.styles),
  2391.         classes: defnA.classes.concat(mod.classes)
  2392.       });
  2393.     };
  2394.  
  2395.     var executeEvent = function (bConfig, bState, executor) {
  2396.       return runOnExecute(function (component) {
  2397.         executor(component, bConfig, bState);
  2398.       });
  2399.     };
  2400.     var loadEvent = function (bConfig, bState, f) {
  2401.       return runOnInit(function (component, _simulatedEvent) {
  2402.         f(component, bConfig, bState);
  2403.       });
  2404.     };
  2405.     var create$6 = function (schema, name, active, apis, extra, state) {
  2406.       var configSchema = objOfOnly(schema);
  2407.       var schemaSchema = optionObjOf(name, [optionObjOfOnly('config', schema)]);
  2408.       return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);
  2409.     };
  2410.     var createModes$1 = function (modes, name, active, apis, extra, state) {
  2411.       var configSchema = modes;
  2412.       var schemaSchema = optionObjOf(name, [optionOf('config', modes)]);
  2413.       return doCreate(configSchema, schemaSchema, name, active, apis, extra, state);
  2414.     };
  2415.     var wrapApi = function (bName, apiFunction, apiName) {
  2416.       var f = function (component) {
  2417.         var rest = [];
  2418.         for (var _i = 1; _i < arguments.length; _i++) {
  2419.           rest[_i - 1] = arguments[_i];
  2420.         }
  2421.         var args = [component].concat(rest);
  2422.         return component.config({ name: constant$1(bName) }).fold(function () {
  2423.           throw new Error('We could not find any behaviour configuration for: ' + bName + '. Using API: ' + apiName);
  2424.         }, function (info) {
  2425.           var rest = Array.prototype.slice.call(args, 1);
  2426.           return apiFunction.apply(undefined, [
  2427.             component,
  2428.             info.config,
  2429.             info.state
  2430.           ].concat(rest));
  2431.         });
  2432.       };
  2433.       return markAsBehaviourApi(f, apiName, apiFunction);
  2434.     };
  2435.     var revokeBehaviour = function (name) {
  2436.       return {
  2437.         key: name,
  2438.         value: undefined
  2439.       };
  2440.     };
  2441.     var doCreate = function (configSchema, schemaSchema, name, active, apis, extra, state) {
  2442.       var getConfig = function (info) {
  2443.         return hasNonNullableKey(info, name) ? info[name]() : Optional.none();
  2444.       };
  2445.       var wrappedApis = map$1(apis, function (apiF, apiName) {
  2446.         return wrapApi(name, apiF, apiName);
  2447.       });
  2448.       var wrappedExtra = map$1(extra, function (extraF, extraName) {
  2449.         return markAsExtraApi(extraF, extraName);
  2450.       });
  2451.       var me = __assign(__assign(__assign({}, wrappedExtra), wrappedApis), {
  2452.         revoke: curry(revokeBehaviour, name),
  2453.         config: function (spec) {
  2454.           var prepared = asRawOrDie$1(name + '-config', configSchema, spec);
  2455.           return {
  2456.             key: name,
  2457.             value: {
  2458.               config: prepared,
  2459.               me: me,
  2460.               configAsRaw: cached(function () {
  2461.                 return asRawOrDie$1(name + '-config', configSchema, spec);
  2462.               }),
  2463.               initialConfig: spec,
  2464.               state: state
  2465.             }
  2466.           };
  2467.         },
  2468.         schema: constant$1(schemaSchema),
  2469.         exhibit: function (info, base) {
  2470.           return lift2(getConfig(info), get$c(active, 'exhibit'), function (behaviourInfo, exhibitor) {
  2471.             return exhibitor(base, behaviourInfo.config, behaviourInfo.state);
  2472.           }).getOrThunk(function () {
  2473.             return nu$3({});
  2474.           });
  2475.         },
  2476.         name: constant$1(name),
  2477.         handlers: function (info) {
  2478.           return getConfig(info).map(function (behaviourInfo) {
  2479.             var getEvents = get$c(active, 'events').getOr(function () {
  2480.               return {};
  2481.             });
  2482.             return getEvents(behaviourInfo.config, behaviourInfo.state);
  2483.           }).getOr({});
  2484.         }
  2485.       });
  2486.       return me;
  2487.     };
  2488.  
  2489.     var NoState = {
  2490.       init: function () {
  2491.         return nu$2({ readState: constant$1('No State required') });
  2492.       }
  2493.     };
  2494.     var nu$2 = function (spec) {
  2495.       return spec;
  2496.     };
  2497.  
  2498.     var derive$2 = function (capabilities) {
  2499.       return wrapAll(capabilities);
  2500.     };
  2501.     var simpleSchema = objOfOnly([
  2502.       required$1('fields'),
  2503.       required$1('name'),
  2504.       defaulted('active', {}),
  2505.       defaulted('apis', {}),
  2506.       defaulted('state', NoState),
  2507.       defaulted('extra', {})
  2508.     ]);
  2509.     var create$5 = function (data) {
  2510.       var value = asRawOrDie$1('Creating behaviour: ' + data.name, simpleSchema, data);
  2511.       return create$6(value.fields, value.name, value.active, value.apis, value.extra, value.state);
  2512.     };
  2513.     var modeSchema = objOfOnly([
  2514.       required$1('branchKey'),
  2515.       required$1('branches'),
  2516.       required$1('name'),
  2517.       defaulted('active', {}),
  2518.       defaulted('apis', {}),
  2519.       defaulted('state', NoState),
  2520.       defaulted('extra', {})
  2521.     ]);
  2522.     var createModes = function (data) {
  2523.       var value = asRawOrDie$1('Creating behaviour: ' + data.name, modeSchema, data);
  2524.       return createModes$1(choose$1(value.branchKey, value.branches), value.name, value.active, value.apis, value.extra, value.state);
  2525.     };
  2526.     var revoke = constant$1(undefined);
  2527.  
  2528.     var Swapping = create$5({
  2529.       fields: SwapSchema,
  2530.       name: 'swapping',
  2531.       apis: SwapApis
  2532.     });
  2533.  
  2534.     var Cell = function (initial) {
  2535.       var value = initial;
  2536.       var get = function () {
  2537.         return value;
  2538.       };
  2539.       var set = function (v) {
  2540.         value = v;
  2541.       };
  2542.       return {
  2543.         get: get,
  2544.         set: set
  2545.       };
  2546.     };
  2547.  
  2548.     var getDocument = function () {
  2549.       return SugarElement.fromDom(document);
  2550.     };
  2551.  
  2552.     var focus$3 = function (element) {
  2553.       return element.dom.focus();
  2554.     };
  2555.     var blur$1 = function (element) {
  2556.       return element.dom.blur();
  2557.     };
  2558.     var hasFocus = function (element) {
  2559.       var root = getRootNode(element).dom;
  2560.       return element.dom === root.activeElement;
  2561.     };
  2562.     var active = function (root) {
  2563.       if (root === void 0) {
  2564.         root = getDocument();
  2565.       }
  2566.       return Optional.from(root.dom.activeElement).map(SugarElement.fromDom);
  2567.     };
  2568.     var search = function (element) {
  2569.       return active(getRootNode(element)).filter(function (e) {
  2570.         return element.dom.contains(e.dom);
  2571.       });
  2572.     };
  2573.  
  2574.     var global$5 = tinymce.util.Tools.resolve('tinymce.dom.DOMUtils');
  2575.  
  2576.     var global$4 = tinymce.util.Tools.resolve('tinymce.ThemeManager');
  2577.  
  2578.     var openLink = function (target) {
  2579.       var link = document.createElement('a');
  2580.       link.target = '_blank';
  2581.       link.href = target.href;
  2582.       link.rel = 'noreferrer noopener';
  2583.       var nuEvt = document.createEvent('MouseEvents');
  2584.       nuEvt.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
  2585.       document.body.appendChild(link);
  2586.       link.dispatchEvent(nuEvt);
  2587.       document.body.removeChild(link);
  2588.     };
  2589.  
  2590.     var DefaultStyleFormats = [
  2591.       {
  2592.         title: 'Headings',
  2593.         items: [
  2594.           {
  2595.             title: 'Heading 1',
  2596.             format: 'h1'
  2597.           },
  2598.           {
  2599.             title: 'Heading 2',
  2600.             format: 'h2'
  2601.           },
  2602.           {
  2603.             title: 'Heading 3',
  2604.             format: 'h3'
  2605.           },
  2606.           {
  2607.             title: 'Heading 4',
  2608.             format: 'h4'
  2609.           },
  2610.           {
  2611.             title: 'Heading 5',
  2612.             format: 'h5'
  2613.           },
  2614.           {
  2615.             title: 'Heading 6',
  2616.             format: 'h6'
  2617.           }
  2618.         ]
  2619.       },
  2620.       {
  2621.         title: 'Inline',
  2622.         items: [
  2623.           {
  2624.             title: 'Bold',
  2625.             icon: 'bold',
  2626.             format: 'bold'
  2627.           },
  2628.           {
  2629.             title: 'Italic',
  2630.             icon: 'italic',
  2631.             format: 'italic'
  2632.           },
  2633.           {
  2634.             title: 'Underline',
  2635.             icon: 'underline',
  2636.             format: 'underline'
  2637.           },
  2638.           {
  2639.             title: 'Strikethrough',
  2640.             icon: 'strikethrough',
  2641.             format: 'strikethrough'
  2642.           },
  2643.           {
  2644.             title: 'Superscript',
  2645.             icon: 'superscript',
  2646.             format: 'superscript'
  2647.           },
  2648.           {
  2649.             title: 'Subscript',
  2650.             icon: 'subscript',
  2651.             format: 'subscript'
  2652.           },
  2653.           {
  2654.             title: 'Code',
  2655.             icon: 'code',
  2656.             format: 'code'
  2657.           }
  2658.         ]
  2659.       },
  2660.       {
  2661.         title: 'Blocks',
  2662.         items: [
  2663.           {
  2664.             title: 'Paragraph',
  2665.             format: 'p'
  2666.           },
  2667.           {
  2668.             title: 'Blockquote',
  2669.             format: 'blockquote'
  2670.           },
  2671.           {
  2672.             title: 'Div',
  2673.             format: 'div'
  2674.           },
  2675.           {
  2676.             title: 'Pre',
  2677.             format: 'pre'
  2678.           }
  2679.         ]
  2680.       },
  2681.       {
  2682.         title: 'Alignment',
  2683.         items: [
  2684.           {
  2685.             title: 'Left',
  2686.             icon: 'alignleft',
  2687.             format: 'alignleft'
  2688.           },
  2689.           {
  2690.             title: 'Center',
  2691.             icon: 'aligncenter',
  2692.             format: 'aligncenter'
  2693.           },
  2694.           {
  2695.             title: 'Right',
  2696.             icon: 'alignright',
  2697.             format: 'alignright'
  2698.           },
  2699.           {
  2700.             title: 'Justify',
  2701.             icon: 'alignjustify',
  2702.             format: 'alignjustify'
  2703.           }
  2704.         ]
  2705.       }
  2706.     ];
  2707.  
  2708.     var defaults = [
  2709.       'undo',
  2710.       'bold',
  2711.       'italic',
  2712.       'link',
  2713.       'image',
  2714.       'bullist',
  2715.       'styleselect'
  2716.     ];
  2717.     var isSkinDisabled = function (editor) {
  2718.       return editor.getParam('skin') === false;
  2719.     };
  2720.     var readOnlyOnInit = function (_editor) {
  2721.       return false;
  2722.     };
  2723.     var getToolbar = function (editor) {
  2724.       return editor.getParam('toolbar', defaults, 'array');
  2725.     };
  2726.     var getStyleFormats = function (editor) {
  2727.       return editor.getParam('style_formats', DefaultStyleFormats, 'array');
  2728.     };
  2729.     var getSkinUrl = function (editor) {
  2730.       return editor.getParam('skin_url');
  2731.     };
  2732.  
  2733.     var formatChanged = 'formatChanged';
  2734.     var orientationChanged = 'orientationChanged';
  2735.     var dropupDismissed = 'dropupDismissed';
  2736.  
  2737.     var fromHtml$1 = function (html, scope) {
  2738.       var doc = scope || document;
  2739.       var div = doc.createElement('div');
  2740.       div.innerHTML = html;
  2741.       return children(SugarElement.fromDom(div));
  2742.     };
  2743.  
  2744.     var get$9 = function (element) {
  2745.       return element.dom.innerHTML;
  2746.     };
  2747.     var set$7 = function (element, content) {
  2748.       var owner = owner$2(element);
  2749.       var docDom = owner.dom;
  2750.       var fragment = SugarElement.fromDom(docDom.createDocumentFragment());
  2751.       var contentElements = fromHtml$1(content, docDom);
  2752.       append$1(fragment, contentElements);
  2753.       empty(element);
  2754.       append$2(element, fragment);
  2755.     };
  2756.     var getOuter = function (element) {
  2757.       var container = SugarElement.fromTag('div');
  2758.       var clone = SugarElement.fromDom(element.dom.cloneNode(true));
  2759.       append$2(container, clone);
  2760.       return get$9(container);
  2761.     };
  2762.  
  2763.     var clone = function (original, isDeep) {
  2764.       return SugarElement.fromDom(original.dom.cloneNode(isDeep));
  2765.     };
  2766.     var shallow = function (original) {
  2767.       return clone(original, false);
  2768.     };
  2769.  
  2770.     var getHtml = function (element) {
  2771.       if (isShadowRoot(element)) {
  2772.         return '#shadow-root';
  2773.       } else {
  2774.         var clone = shallow(element);
  2775.         return getOuter(clone);
  2776.       }
  2777.     };
  2778.  
  2779.     var element = function (elem) {
  2780.       return getHtml(elem);
  2781.     };
  2782.  
  2783.     var chooseChannels = function (channels, message) {
  2784.       return message.universal ? channels : filter$2(channels, function (ch) {
  2785.         return contains$1(message.channels, ch);
  2786.       });
  2787.     };
  2788.     var events$a = function (receiveConfig) {
  2789.       return derive$3([run(receive$1(), function (component, message) {
  2790.           var channelMap = receiveConfig.channels;
  2791.           var channels = keys(channelMap);
  2792.           var receivingData = message;
  2793.           var targetChannels = chooseChannels(channels, receivingData);
  2794.           each$1(targetChannels, function (ch) {
  2795.             var channelInfo = channelMap[ch];
  2796.             var channelSchema = channelInfo.schema;
  2797.             var data = asRawOrDie$1('channel[' + ch + '] data\nReceiver: ' + element(component.element), channelSchema, receivingData.data);
  2798.             channelInfo.onReceive(component, data);
  2799.           });
  2800.         })]);
  2801.     };
  2802.  
  2803.     var ActiveReceiving = /*#__PURE__*/Object.freeze({
  2804.         __proto__: null,
  2805.         events: events$a
  2806.     });
  2807.  
  2808.     var unknown = 'unknown';
  2809.     var EventConfiguration;
  2810.     (function (EventConfiguration) {
  2811.       EventConfiguration[EventConfiguration['STOP'] = 0] = 'STOP';
  2812.       EventConfiguration[EventConfiguration['NORMAL'] = 1] = 'NORMAL';
  2813.       EventConfiguration[EventConfiguration['LOGGING'] = 2] = 'LOGGING';
  2814.     }(EventConfiguration || (EventConfiguration = {})));
  2815.     var eventConfig = Cell({});
  2816.     var makeEventLogger = function (eventName, initialTarget) {
  2817.       var sequence = [];
  2818.       var startTime = new Date().getTime();
  2819.       return {
  2820.         logEventCut: function (_name, target, purpose) {
  2821.           sequence.push({
  2822.             outcome: 'cut',
  2823.             target: target,
  2824.             purpose: purpose
  2825.           });
  2826.         },
  2827.         logEventStopped: function (_name, target, purpose) {
  2828.           sequence.push({
  2829.             outcome: 'stopped',
  2830.             target: target,
  2831.             purpose: purpose
  2832.           });
  2833.         },
  2834.         logNoParent: function (_name, target, purpose) {
  2835.           sequence.push({
  2836.             outcome: 'no-parent',
  2837.             target: target,
  2838.             purpose: purpose
  2839.           });
  2840.         },
  2841.         logEventNoHandlers: function (_name, target) {
  2842.           sequence.push({
  2843.             outcome: 'no-handlers-left',
  2844.             target: target
  2845.           });
  2846.         },
  2847.         logEventResponse: function (_name, target, purpose) {
  2848.           sequence.push({
  2849.             outcome: 'response',
  2850.             purpose: purpose,
  2851.             target: target
  2852.           });
  2853.         },
  2854.         write: function () {
  2855.           var finishTime = new Date().getTime();
  2856.           if (contains$1([
  2857.               'mousemove',
  2858.               'mouseover',
  2859.               'mouseout',
  2860.               systemInit()
  2861.             ], eventName)) {
  2862.             return;
  2863.           }
  2864.           console.log(eventName, {
  2865.             event: eventName,
  2866.             time: finishTime - startTime,
  2867.             target: initialTarget.dom,
  2868.             sequence: map$2(sequence, function (s) {
  2869.               if (!contains$1([
  2870.                   'cut',
  2871.                   'stopped',
  2872.                   'response'
  2873.                 ], s.outcome)) {
  2874.                 return s.outcome;
  2875.               } else {
  2876.                 return '{' + s.purpose + '} ' + s.outcome + ' at (' + element(s.target) + ')';
  2877.               }
  2878.             })
  2879.           });
  2880.         }
  2881.       };
  2882.     };
  2883.     var processEvent = function (eventName, initialTarget, f) {
  2884.       var status = get$c(eventConfig.get(), eventName).orThunk(function () {
  2885.         var patterns = keys(eventConfig.get());
  2886.         return findMap(patterns, function (p) {
  2887.           return eventName.indexOf(p) > -1 ? Optional.some(eventConfig.get()[p]) : Optional.none();
  2888.         });
  2889.       }).getOr(EventConfiguration.NORMAL);
  2890.       switch (status) {
  2891.       case EventConfiguration.NORMAL:
  2892.         return f(noLogger());
  2893.       case EventConfiguration.LOGGING: {
  2894.           var logger = makeEventLogger(eventName, initialTarget);
  2895.           var output = f(logger);
  2896.           logger.write();
  2897.           return output;
  2898.         }
  2899.       case EventConfiguration.STOP:
  2900.         return true;
  2901.       }
  2902.     };
  2903.     var path = [
  2904.       'alloy/data/Fields',
  2905.       'alloy/debugging/Debugging'
  2906.     ];
  2907.     var getTrace = function () {
  2908.       var err = new Error();
  2909.       if (err.stack !== undefined) {
  2910.         var lines = err.stack.split('\n');
  2911.         return find$2(lines, function (line) {
  2912.           return line.indexOf('alloy') > 0 && !exists(path, function (p) {
  2913.             return line.indexOf(p) > -1;
  2914.           });
  2915.         }).getOr(unknown);
  2916.       } else {
  2917.         return unknown;
  2918.       }
  2919.     };
  2920.     var ignoreEvent = {
  2921.       logEventCut: noop,
  2922.       logEventStopped: noop,
  2923.       logNoParent: noop,
  2924.       logEventNoHandlers: noop,
  2925.       logEventResponse: noop,
  2926.       write: noop
  2927.     };
  2928.     var monitorEvent = function (eventName, initialTarget, f) {
  2929.       return processEvent(eventName, initialTarget, f);
  2930.     };
  2931.     var noLogger = constant$1(ignoreEvent);
  2932.  
  2933.     var menuFields = constant$1([
  2934.       required$1('menu'),
  2935.       required$1('selectedMenu')
  2936.     ]);
  2937.     var itemFields = constant$1([
  2938.       required$1('item'),
  2939.       required$1('selectedItem')
  2940.     ]);
  2941.     constant$1(objOf(itemFields().concat(menuFields())));
  2942.     var itemSchema$1 = constant$1(objOf(itemFields()));
  2943.  
  2944.     var _initSize = requiredObjOf('initSize', [
  2945.       required$1('numColumns'),
  2946.       required$1('numRows')
  2947.     ]);
  2948.     var itemMarkers = function () {
  2949.       return requiredOf('markers', itemSchema$1());
  2950.     };
  2951.     var tieredMenuMarkers = function () {
  2952.       return requiredObjOf('markers', [required$1('backgroundMenu')].concat(menuFields()).concat(itemFields()));
  2953.     };
  2954.     var markers = function (required) {
  2955.       return requiredObjOf('markers', map$2(required, required$1));
  2956.     };
  2957.     var onPresenceHandler = function (label, fieldName, presence) {
  2958.       getTrace();
  2959.       return field$2(fieldName, fieldName, presence, valueOf(function (f) {
  2960.         return Result.value(function () {
  2961.           var args = [];
  2962.           for (var _i = 0; _i < arguments.length; _i++) {
  2963.             args[_i] = arguments[_i];
  2964.           }
  2965.           return f.apply(undefined, args);
  2966.         });
  2967.       }));
  2968.     };
  2969.     var onHandler = function (fieldName) {
  2970.       return onPresenceHandler('onHandler', fieldName, defaulted$1(noop));
  2971.     };
  2972.     var onKeyboardHandler = function (fieldName) {
  2973.       return onPresenceHandler('onKeyboardHandler', fieldName, defaulted$1(Optional.none));
  2974.     };
  2975.     var onStrictHandler = function (fieldName) {
  2976.       return onPresenceHandler('onHandler', fieldName, required$2());
  2977.     };
  2978.     var onStrictKeyboardHandler = function (fieldName) {
  2979.       return onPresenceHandler('onKeyboardHandler', fieldName, required$2());
  2980.     };
  2981.     var output = function (name, value) {
  2982.       return customField(name, constant$1(value));
  2983.     };
  2984.     var snapshot = function (name) {
  2985.       return customField(name, identity);
  2986.     };
  2987.     var initSize = constant$1(_initSize);
  2988.  
  2989.     var ReceivingSchema = [requiredOf('channels', setOf(Result.value, objOfOnly([
  2990.         onStrictHandler('onReceive'),
  2991.         defaulted('schema', anyValue())
  2992.       ])))];
  2993.  
  2994.     var Receiving = create$5({
  2995.       fields: ReceivingSchema,
  2996.       name: 'receiving',
  2997.       active: ActiveReceiving
  2998.     });
  2999.  
  3000.     var SetupBehaviourCellState = function (initialState) {
  3001.       var init = function () {
  3002.         var cell = Cell(initialState);
  3003.         var get = function () {
  3004.           return cell.get();
  3005.         };
  3006.         var set = function (newState) {
  3007.           return cell.set(newState);
  3008.         };
  3009.         var clear = function () {
  3010.           return cell.set(initialState);
  3011.         };
  3012.         var readState = function () {
  3013.           return cell.get();
  3014.         };
  3015.         return {
  3016.           get: get,
  3017.           set: set,
  3018.           clear: clear,
  3019.           readState: readState
  3020.         };
  3021.       };
  3022.       return { init: init };
  3023.     };
  3024.  
  3025.     var updateAriaState = function (component, toggleConfig, toggleState) {
  3026.       var ariaInfo = toggleConfig.aria;
  3027.       ariaInfo.update(component, ariaInfo, toggleState.get());
  3028.     };
  3029.     var updateClass = function (component, toggleConfig, toggleState) {
  3030.       toggleConfig.toggleClass.each(function (toggleClass) {
  3031.         if (toggleState.get()) {
  3032.           add$1(component.element, toggleClass);
  3033.         } else {
  3034.           remove$3(component.element, toggleClass);
  3035.         }
  3036.       });
  3037.     };
  3038.     var toggle = function (component, toggleConfig, toggleState) {
  3039.       set$6(component, toggleConfig, toggleState, !toggleState.get());
  3040.     };
  3041.     var on$1 = function (component, toggleConfig, toggleState) {
  3042.       toggleState.set(true);
  3043.       updateClass(component, toggleConfig, toggleState);
  3044.       updateAriaState(component, toggleConfig, toggleState);
  3045.     };
  3046.     var off = function (component, toggleConfig, toggleState) {
  3047.       toggleState.set(false);
  3048.       updateClass(component, toggleConfig, toggleState);
  3049.       updateAriaState(component, toggleConfig, toggleState);
  3050.     };
  3051.     var set$6 = function (component, toggleConfig, toggleState, state) {
  3052.       var action = state ? on$1 : off;
  3053.       action(component, toggleConfig, toggleState);
  3054.     };
  3055.     var isOn = function (component, toggleConfig, toggleState) {
  3056.       return toggleState.get();
  3057.     };
  3058.     var onLoad$5 = function (component, toggleConfig, toggleState) {
  3059.       set$6(component, toggleConfig, toggleState, toggleConfig.selected);
  3060.     };
  3061.  
  3062.     var ToggleApis = /*#__PURE__*/Object.freeze({
  3063.         __proto__: null,
  3064.         onLoad: onLoad$5,
  3065.         toggle: toggle,
  3066.         isOn: isOn,
  3067.         on: on$1,
  3068.         off: off,
  3069.         set: set$6
  3070.     });
  3071.  
  3072.     var exhibit$5 = function () {
  3073.       return nu$3({});
  3074.     };
  3075.     var events$9 = function (toggleConfig, toggleState) {
  3076.       var execute = executeEvent(toggleConfig, toggleState, toggle);
  3077.       var load = loadEvent(toggleConfig, toggleState, onLoad$5);
  3078.       return derive$3(flatten([
  3079.         toggleConfig.toggleOnExecute ? [execute] : [],
  3080.         [load]
  3081.       ]));
  3082.     };
  3083.  
  3084.     var ActiveToggle = /*#__PURE__*/Object.freeze({
  3085.         __proto__: null,
  3086.         exhibit: exhibit$5,
  3087.         events: events$9
  3088.     });
  3089.  
  3090.     var updatePressed = function (component, ariaInfo, status) {
  3091.       set$8(component.element, 'aria-pressed', status);
  3092.       if (ariaInfo.syncWithExpanded) {
  3093.         updateExpanded(component, ariaInfo, status);
  3094.       }
  3095.     };
  3096.     var updateSelected = function (component, ariaInfo, status) {
  3097.       set$8(component.element, 'aria-selected', status);
  3098.     };
  3099.     var updateChecked = function (component, ariaInfo, status) {
  3100.       set$8(component.element, 'aria-checked', status);
  3101.     };
  3102.     var updateExpanded = function (component, ariaInfo, status) {
  3103.       set$8(component.element, 'aria-expanded', status);
  3104.     };
  3105.  
  3106.     var ToggleSchema = [
  3107.       defaulted('selected', false),
  3108.       option('toggleClass'),
  3109.       defaulted('toggleOnExecute', true),
  3110.       defaultedOf('aria', { mode: 'none' }, choose$1('mode', {
  3111.         pressed: [
  3112.           defaulted('syncWithExpanded', false),
  3113.           output('update', updatePressed)
  3114.         ],
  3115.         checked: [output('update', updateChecked)],
  3116.         expanded: [output('update', updateExpanded)],
  3117.         selected: [output('update', updateSelected)],
  3118.         none: [output('update', noop)]
  3119.       }))
  3120.     ];
  3121.  
  3122.     var Toggling = create$5({
  3123.       fields: ToggleSchema,
  3124.       name: 'toggling',
  3125.       active: ActiveToggle,
  3126.       apis: ToggleApis,
  3127.       state: SetupBehaviourCellState(false)
  3128.     });
  3129.  
  3130.     var format = function (command, update) {
  3131.       return Receiving.config({
  3132.         channels: wrap(formatChanged, {
  3133.           onReceive: function (button, data) {
  3134.             if (data.command === command) {
  3135.               update(button, data.state);
  3136.             }
  3137.           }
  3138.         })
  3139.       });
  3140.     };
  3141.     var orientation = function (onReceive) {
  3142.       return Receiving.config({ channels: wrap(orientationChanged, { onReceive: onReceive }) });
  3143.     };
  3144.     var receive = function (channel, onReceive) {
  3145.       return {
  3146.         key: channel,
  3147.         value: { onReceive: onReceive }
  3148.       };
  3149.     };
  3150.  
  3151.     var prefix$2 = 'tinymce-mobile';
  3152.     var resolve = function (p) {
  3153.       return prefix$2 + '-' + p;
  3154.     };
  3155.  
  3156.     var pointerEvents = function () {
  3157.       var onClick = function (component, simulatedEvent) {
  3158.         simulatedEvent.stop();
  3159.         emitExecute(component);
  3160.       };
  3161.       return [
  3162.         run(click(), onClick),
  3163.         run(tap(), onClick),
  3164.         cutter(touchstart()),
  3165.         cutter(mousedown())
  3166.       ];
  3167.     };
  3168.     var events$8 = function (optAction) {
  3169.       var executeHandler = function (action) {
  3170.         return runOnExecute(function (component, simulatedEvent) {
  3171.           action(component);
  3172.           simulatedEvent.stop();
  3173.         });
  3174.       };
  3175.       return derive$3(flatten([
  3176.         optAction.map(executeHandler).toArray(),
  3177.         pointerEvents()
  3178.       ]));
  3179.     };
  3180.  
  3181.     var focus$2 = function (component, focusConfig) {
  3182.       if (!focusConfig.ignore) {
  3183.         focus$3(component.element);
  3184.         focusConfig.onFocus(component);
  3185.       }
  3186.     };
  3187.     var blur = function (component, focusConfig) {
  3188.       if (!focusConfig.ignore) {
  3189.         blur$1(component.element);
  3190.       }
  3191.     };
  3192.     var isFocused = function (component) {
  3193.       return hasFocus(component.element);
  3194.     };
  3195.  
  3196.     var FocusApis = /*#__PURE__*/Object.freeze({
  3197.         __proto__: null,
  3198.         focus: focus$2,
  3199.         blur: blur,
  3200.         isFocused: isFocused
  3201.     });
  3202.  
  3203.     var exhibit$4 = function (base, focusConfig) {
  3204.       var mod = focusConfig.ignore ? {} : { attributes: { tabindex: '-1' } };
  3205.       return nu$3(mod);
  3206.     };
  3207.     var events$7 = function (focusConfig) {
  3208.       return derive$3([run(focus$4(), function (component, simulatedEvent) {
  3209.           focus$2(component, focusConfig);
  3210.           simulatedEvent.stop();
  3211.         })].concat(focusConfig.stopMousedown ? [run(mousedown(), function (_, simulatedEvent) {
  3212.           simulatedEvent.event.prevent();
  3213.         })] : []));
  3214.     };
  3215.  
  3216.     var ActiveFocus = /*#__PURE__*/Object.freeze({
  3217.         __proto__: null,
  3218.         exhibit: exhibit$4,
  3219.         events: events$7
  3220.     });
  3221.  
  3222.     var FocusSchema = [
  3223.       onHandler('onFocus'),
  3224.       defaulted('stopMousedown', false),
  3225.       defaulted('ignore', false)
  3226.     ];
  3227.  
  3228.     var Focusing = create$5({
  3229.       fields: FocusSchema,
  3230.       name: 'focusing',
  3231.       active: ActiveFocus,
  3232.       apis: FocusApis
  3233.     });
  3234.  
  3235.     var isSupported = function (dom) {
  3236.       return dom.style !== undefined && isFunction(dom.style.getPropertyValue);
  3237.     };
  3238.  
  3239.     var internalSet = function (dom, property, value) {
  3240.       if (!isString(value)) {
  3241.         console.error('Invalid call to CSS.set. Property ', property, ':: Value ', value, ':: Element ', dom);
  3242.         throw new Error('CSS value must be a string: ' + value);
  3243.       }
  3244.       if (isSupported(dom)) {
  3245.         dom.style.setProperty(property, value);
  3246.       }
  3247.     };
  3248.     var internalRemove = function (dom, property) {
  3249.       if (isSupported(dom)) {
  3250.         dom.style.removeProperty(property);
  3251.       }
  3252.     };
  3253.     var set$5 = function (element, property, value) {
  3254.       var dom = element.dom;
  3255.       internalSet(dom, property, value);
  3256.     };
  3257.     var setAll = function (element, css) {
  3258.       var dom = element.dom;
  3259.       each(css, function (v, k) {
  3260.         internalSet(dom, k, v);
  3261.       });
  3262.     };
  3263.     var get$8 = function (element, property) {
  3264.       var dom = element.dom;
  3265.       var styles = window.getComputedStyle(dom);
  3266.       var r = styles.getPropertyValue(property);
  3267.       return r === '' && !inBody(element) ? getUnsafeProperty(dom, property) : r;
  3268.     };
  3269.     var getUnsafeProperty = function (dom, property) {
  3270.       return isSupported(dom) ? dom.style.getPropertyValue(property) : '';
  3271.     };
  3272.     var getRaw = function (element, property) {
  3273.       var dom = element.dom;
  3274.       var raw = getUnsafeProperty(dom, property);
  3275.       return Optional.from(raw).filter(function (r) {
  3276.         return r.length > 0;
  3277.       });
  3278.     };
  3279.     var remove$2 = function (element, property) {
  3280.       var dom = element.dom;
  3281.       internalRemove(dom, property);
  3282.       if (is(getOpt(element, 'style').map(trim), '')) {
  3283.         remove$6(element, 'style');
  3284.       }
  3285.     };
  3286.     var reflow = function (e) {
  3287.       return e.dom.offsetWidth;
  3288.     };
  3289.  
  3290.     var Dimension = function (name, getOffset) {
  3291.       var set = function (element, h) {
  3292.         if (!isNumber(h) && !h.match(/^[0-9]+$/)) {
  3293.           throw new Error(name + '.set accepts only positive integer values. Value was ' + h);
  3294.         }
  3295.         var dom = element.dom;
  3296.         if (isSupported(dom)) {
  3297.           dom.style[name] = h + 'px';
  3298.         }
  3299.       };
  3300.       var get = function (element) {
  3301.         var r = getOffset(element);
  3302.         if (r <= 0 || r === null) {
  3303.           var css = get$8(element, name);
  3304.           return parseFloat(css) || 0;
  3305.         }
  3306.         return r;
  3307.       };
  3308.       var getOuter = get;
  3309.       var aggregate = function (element, properties) {
  3310.         return foldl(properties, function (acc, property) {
  3311.           var val = get$8(element, property);
  3312.           var value = val === undefined ? 0 : parseInt(val, 10);
  3313.           return isNaN(value) ? acc : acc + value;
  3314.         }, 0);
  3315.       };
  3316.       var max = function (element, value, properties) {
  3317.         var cumulativeInclusions = aggregate(element, properties);
  3318.         var absoluteMax = value > cumulativeInclusions ? value - cumulativeInclusions : 0;
  3319.         return absoluteMax;
  3320.       };
  3321.       return {
  3322.         set: set,
  3323.         get: get,
  3324.         getOuter: getOuter,
  3325.         aggregate: aggregate,
  3326.         max: max
  3327.       };
  3328.     };
  3329.  
  3330.     var api$3 = Dimension('height', function (element) {
  3331.       var dom = element.dom;
  3332.       return inBody(element) ? dom.getBoundingClientRect().height : dom.offsetHeight;
  3333.     });
  3334.     var get$7 = function (element) {
  3335.       return api$3.get(element);
  3336.     };
  3337.  
  3338.     var ancestors$1 = function (scope, predicate, isRoot) {
  3339.       return filter$2(parents(scope, isRoot), predicate);
  3340.     };
  3341.     var siblings$1 = function (scope, predicate) {
  3342.       return filter$2(siblings$2(scope), predicate);
  3343.     };
  3344.  
  3345.     var all = function (selector) {
  3346.       return all$2(selector);
  3347.     };
  3348.     var ancestors = function (scope, selector, isRoot) {
  3349.       return ancestors$1(scope, function (e) {
  3350.         return is$1(e, selector);
  3351.       }, isRoot);
  3352.     };
  3353.     var siblings = function (scope, selector) {
  3354.       return siblings$1(scope, function (e) {
  3355.         return is$1(e, selector);
  3356.       });
  3357.     };
  3358.     var descendants = function (scope, selector) {
  3359.       return all$2(selector, scope);
  3360.     };
  3361.  
  3362.     function ClosestOrAncestor (is, ancestor, scope, a, isRoot) {
  3363.       if (is(scope, a)) {
  3364.         return Optional.some(scope);
  3365.       } else if (isFunction(isRoot) && isRoot(scope)) {
  3366.         return Optional.none();
  3367.       } else {
  3368.         return ancestor(scope, a, isRoot);
  3369.       }
  3370.     }
  3371.  
  3372.     var ancestor$1 = function (scope, predicate, isRoot) {
  3373.       var element = scope.dom;
  3374.       var stop = isFunction(isRoot) ? isRoot : never;
  3375.       while (element.parentNode) {
  3376.         element = element.parentNode;
  3377.         var el = SugarElement.fromDom(element);
  3378.         if (predicate(el)) {
  3379.           return Optional.some(el);
  3380.         } else if (stop(el)) {
  3381.           break;
  3382.         }
  3383.       }
  3384.       return Optional.none();
  3385.     };
  3386.     var closest$2 = function (scope, predicate, isRoot) {
  3387.       var is = function (s, test) {
  3388.         return test(s);
  3389.       };
  3390.       return ClosestOrAncestor(is, ancestor$1, scope, predicate, isRoot);
  3391.     };
  3392.     var descendant$1 = function (scope, predicate) {
  3393.       var descend = function (node) {
  3394.         for (var i = 0; i < node.childNodes.length; i++) {
  3395.           var child_1 = SugarElement.fromDom(node.childNodes[i]);
  3396.           if (predicate(child_1)) {
  3397.             return Optional.some(child_1);
  3398.           }
  3399.           var res = descend(node.childNodes[i]);
  3400.           if (res.isSome()) {
  3401.             return res;
  3402.           }
  3403.         }
  3404.         return Optional.none();
  3405.       };
  3406.       return descend(scope.dom);
  3407.     };
  3408.  
  3409.     var first$1 = function (selector) {
  3410.       return one(selector);
  3411.     };
  3412.     var ancestor = function (scope, selector, isRoot) {
  3413.       return ancestor$1(scope, function (e) {
  3414.         return is$1(e, selector);
  3415.       }, isRoot);
  3416.     };
  3417.     var descendant = function (scope, selector) {
  3418.       return one(selector, scope);
  3419.     };
  3420.     var closest$1 = function (scope, selector, isRoot) {
  3421.       var is = function (element, selector) {
  3422.         return is$1(element, selector);
  3423.       };
  3424.       return ClosestOrAncestor(is, ancestor, scope, selector, isRoot);
  3425.     };
  3426.  
  3427.     var BACKSPACE = [8];
  3428.     var TAB = [9];
  3429.     var ENTER = [13];
  3430.     var ESCAPE = [27];
  3431.     var SPACE = [32];
  3432.     var LEFT = [37];
  3433.     var UP = [38];
  3434.     var RIGHT = [39];
  3435.     var DOWN = [40];
  3436.  
  3437.     var cyclePrev = function (values, index, predicate) {
  3438.       var before = reverse(values.slice(0, index));
  3439.       var after = reverse(values.slice(index + 1));
  3440.       return find$2(before.concat(after), predicate);
  3441.     };
  3442.     var tryPrev = function (values, index, predicate) {
  3443.       var before = reverse(values.slice(0, index));
  3444.       return find$2(before, predicate);
  3445.     };
  3446.     var cycleNext = function (values, index, predicate) {
  3447.       var before = values.slice(0, index);
  3448.       var after = values.slice(index + 1);
  3449.       return find$2(after.concat(before), predicate);
  3450.     };
  3451.     var tryNext = function (values, index, predicate) {
  3452.       var after = values.slice(index + 1);
  3453.       return find$2(after, predicate);
  3454.     };
  3455.  
  3456.     var inSet = function (keys) {
  3457.       return function (event) {
  3458.         var raw = event.raw;
  3459.         return contains$1(keys, raw.which);
  3460.       };
  3461.     };
  3462.     var and = function (preds) {
  3463.       return function (event) {
  3464.         return forall(preds, function (pred) {
  3465.           return pred(event);
  3466.         });
  3467.       };
  3468.     };
  3469.     var isShift = function (event) {
  3470.       var raw = event.raw;
  3471.       return raw.shiftKey === true;
  3472.     };
  3473.     var isControl = function (event) {
  3474.       var raw = event.raw;
  3475.       return raw.ctrlKey === true;
  3476.     };
  3477.     var isNotShift = not(isShift);
  3478.  
  3479.     var rule = function (matches, action) {
  3480.       return {
  3481.         matches: matches,
  3482.         classification: action
  3483.       };
  3484.     };
  3485.     var choose = function (transitions, event) {
  3486.       var transition = find$2(transitions, function (t) {
  3487.         return t.matches(event);
  3488.       });
  3489.       return transition.map(function (t) {
  3490.         return t.classification;
  3491.       });
  3492.     };
  3493.  
  3494.     var cycleBy = function (value, delta, min, max) {
  3495.       var r = value + delta;
  3496.       if (r > max) {
  3497.         return min;
  3498.       } else if (r < min) {
  3499.         return max;
  3500.       } else {
  3501.         return r;
  3502.       }
  3503.     };
  3504.     var clamp = function (value, min, max) {
  3505.       return Math.min(Math.max(value, min), max);
  3506.     };
  3507.  
  3508.     var dehighlightAllExcept = function (component, hConfig, hState, skip) {
  3509.       var highlighted = descendants(component.element, '.' + hConfig.highlightClass);
  3510.       each$1(highlighted, function (h) {
  3511.         if (!exists(skip, function (skipComp) {
  3512.             return skipComp.element === h;
  3513.           })) {
  3514.           remove$3(h, hConfig.highlightClass);
  3515.           component.getSystem().getByDom(h).each(function (target) {
  3516.             hConfig.onDehighlight(component, target);
  3517.             emit(target, dehighlight$1());
  3518.           });
  3519.         }
  3520.       });
  3521.     };
  3522.     var dehighlightAll = function (component, hConfig, hState) {
  3523.       return dehighlightAllExcept(component, hConfig, hState, []);
  3524.     };
  3525.     var dehighlight = function (component, hConfig, hState, target) {
  3526.       if (isHighlighted(component, hConfig, hState, target)) {
  3527.         remove$3(target.element, hConfig.highlightClass);
  3528.         hConfig.onDehighlight(component, target);
  3529.         emit(target, dehighlight$1());
  3530.       }
  3531.     };
  3532.     var highlight = function (component, hConfig, hState, target) {
  3533.       dehighlightAllExcept(component, hConfig, hState, [target]);
  3534.       if (!isHighlighted(component, hConfig, hState, target)) {
  3535.         add$1(target.element, hConfig.highlightClass);
  3536.         hConfig.onHighlight(component, target);
  3537.         emit(target, highlight$1());
  3538.       }
  3539.     };
  3540.     var highlightFirst = function (component, hConfig, hState) {
  3541.       getFirst(component, hConfig).each(function (firstComp) {
  3542.         highlight(component, hConfig, hState, firstComp);
  3543.       });
  3544.     };
  3545.     var highlightLast = function (component, hConfig, hState) {
  3546.       getLast(component, hConfig).each(function (lastComp) {
  3547.         highlight(component, hConfig, hState, lastComp);
  3548.       });
  3549.     };
  3550.     var highlightAt = function (component, hConfig, hState, index) {
  3551.       getByIndex(component, hConfig, hState, index).fold(function (err) {
  3552.         throw err;
  3553.       }, function (firstComp) {
  3554.         highlight(component, hConfig, hState, firstComp);
  3555.       });
  3556.     };
  3557.     var highlightBy = function (component, hConfig, hState, predicate) {
  3558.       var candidates = getCandidates(component, hConfig);
  3559.       var targetComp = find$2(candidates, predicate);
  3560.       targetComp.each(function (c) {
  3561.         highlight(component, hConfig, hState, c);
  3562.       });
  3563.     };
  3564.     var isHighlighted = function (component, hConfig, hState, queryTarget) {
  3565.       return has(queryTarget.element, hConfig.highlightClass);
  3566.     };
  3567.     var getHighlighted = function (component, hConfig, _hState) {
  3568.       return descendant(component.element, '.' + hConfig.highlightClass).bind(function (e) {
  3569.         return component.getSystem().getByDom(e).toOptional();
  3570.       });
  3571.     };
  3572.     var getByIndex = function (component, hConfig, hState, index) {
  3573.       var items = descendants(component.element, '.' + hConfig.itemClass);
  3574.       return Optional.from(items[index]).fold(function () {
  3575.         return Result.error(new Error('No element found with index ' + index));
  3576.       }, component.getSystem().getByDom);
  3577.     };
  3578.     var getFirst = function (component, hConfig, _hState) {
  3579.       return descendant(component.element, '.' + hConfig.itemClass).bind(function (e) {
  3580.         return component.getSystem().getByDom(e).toOptional();
  3581.       });
  3582.     };
  3583.     var getLast = function (component, hConfig, _hState) {
  3584.       var items = descendants(component.element, '.' + hConfig.itemClass);
  3585.       var last = items.length > 0 ? Optional.some(items[items.length - 1]) : Optional.none();
  3586.       return last.bind(function (c) {
  3587.         return component.getSystem().getByDom(c).toOptional();
  3588.       });
  3589.     };
  3590.     var getDelta = function (component, hConfig, hState, delta) {
  3591.       var items = descendants(component.element, '.' + hConfig.itemClass);
  3592.       var current = findIndex$1(items, function (item) {
  3593.         return has(item, hConfig.highlightClass);
  3594.       });
  3595.       return current.bind(function (selected) {
  3596.         var dest = cycleBy(selected, delta, 0, items.length - 1);
  3597.         return component.getSystem().getByDom(items[dest]).toOptional();
  3598.       });
  3599.     };
  3600.     var getPrevious = function (component, hConfig, hState) {
  3601.       return getDelta(component, hConfig, hState, -1);
  3602.     };
  3603.     var getNext = function (component, hConfig, hState) {
  3604.       return getDelta(component, hConfig, hState, +1);
  3605.     };
  3606.     var getCandidates = function (component, hConfig, _hState) {
  3607.       var items = descendants(component.element, '.' + hConfig.itemClass);
  3608.       return cat(map$2(items, function (i) {
  3609.         return component.getSystem().getByDom(i).toOptional();
  3610.       }));
  3611.     };
  3612.  
  3613.     var HighlightApis = /*#__PURE__*/Object.freeze({
  3614.         __proto__: null,
  3615.         dehighlightAll: dehighlightAll,
  3616.         dehighlight: dehighlight,
  3617.         highlight: highlight,
  3618.         highlightFirst: highlightFirst,
  3619.         highlightLast: highlightLast,
  3620.         highlightAt: highlightAt,
  3621.         highlightBy: highlightBy,
  3622.         isHighlighted: isHighlighted,
  3623.         getHighlighted: getHighlighted,
  3624.         getFirst: getFirst,
  3625.         getLast: getLast,
  3626.         getPrevious: getPrevious,
  3627.         getNext: getNext,
  3628.         getCandidates: getCandidates
  3629.     });
  3630.  
  3631.     var HighlightSchema = [
  3632.       required$1('highlightClass'),
  3633.       required$1('itemClass'),
  3634.       onHandler('onHighlight'),
  3635.       onHandler('onDehighlight')
  3636.     ];
  3637.  
  3638.     var Highlighting = create$5({
  3639.       fields: HighlightSchema,
  3640.       name: 'highlighting',
  3641.       apis: HighlightApis
  3642.     });
  3643.  
  3644.     var reportFocusShifting = function (component, prevFocus, newFocus) {
  3645.       var noChange = prevFocus.exists(function (p) {
  3646.         return newFocus.exists(function (n) {
  3647.           return eq(n, p);
  3648.         });
  3649.       });
  3650.       if (!noChange) {
  3651.         emitWith(component, focusShifted(), {
  3652.           prevFocus: prevFocus,
  3653.           newFocus: newFocus
  3654.         });
  3655.       }
  3656.     };
  3657.     var dom$2 = function () {
  3658.       var get = function (component) {
  3659.         return search(component.element);
  3660.       };
  3661.       var set = function (component, focusee) {
  3662.         var prevFocus = get(component);
  3663.         component.getSystem().triggerFocus(focusee, component.element);
  3664.         var newFocus = get(component);
  3665.         reportFocusShifting(component, prevFocus, newFocus);
  3666.       };
  3667.       return {
  3668.         get: get,
  3669.         set: set
  3670.       };
  3671.     };
  3672.     var highlights = function () {
  3673.       var get = function (component) {
  3674.         return Highlighting.getHighlighted(component).map(function (item) {
  3675.           return item.element;
  3676.         });
  3677.       };
  3678.       var set = function (component, element) {
  3679.         var prevFocus = get(component);
  3680.         component.getSystem().getByDom(element).fold(noop, function (item) {
  3681.           Highlighting.highlight(component, item);
  3682.         });
  3683.         var newFocus = get(component);
  3684.         reportFocusShifting(component, prevFocus, newFocus);
  3685.       };
  3686.       return {
  3687.         get: get,
  3688.         set: set
  3689.       };
  3690.     };
  3691.  
  3692.     var FocusInsideModes;
  3693.     (function (FocusInsideModes) {
  3694.       FocusInsideModes['OnFocusMode'] = 'onFocus';
  3695.       FocusInsideModes['OnEnterOrSpaceMode'] = 'onEnterOrSpace';
  3696.       FocusInsideModes['OnApiMode'] = 'onApi';
  3697.     }(FocusInsideModes || (FocusInsideModes = {})));
  3698.  
  3699.     var typical = function (infoSchema, stateInit, getKeydownRules, getKeyupRules, optFocusIn) {
  3700.       var schema = function () {
  3701.         return infoSchema.concat([
  3702.           defaulted('focusManager', dom$2()),
  3703.           defaultedOf('focusInside', 'onFocus', valueOf(function (val) {
  3704.             return contains$1([
  3705.               'onFocus',
  3706.               'onEnterOrSpace',
  3707.               'onApi'
  3708.             ], val) ? Result.value(val) : Result.error('Invalid value for focusInside');
  3709.           })),
  3710.           output('handler', me),
  3711.           output('state', stateInit),
  3712.           output('sendFocusIn', optFocusIn)
  3713.         ]);
  3714.       };
  3715.       var processKey = function (component, simulatedEvent, getRules, keyingConfig, keyingState) {
  3716.         var rules = getRules(component, simulatedEvent, keyingConfig, keyingState);
  3717.         return choose(rules, simulatedEvent.event).bind(function (rule) {
  3718.           return rule(component, simulatedEvent, keyingConfig, keyingState);
  3719.         });
  3720.       };
  3721.       var toEvents = function (keyingConfig, keyingState) {
  3722.         var onFocusHandler = keyingConfig.focusInside !== FocusInsideModes.OnFocusMode ? Optional.none() : optFocusIn(keyingConfig).map(function (focusIn) {
  3723.           return run(focus$4(), function (component, simulatedEvent) {
  3724.             focusIn(component, keyingConfig, keyingState);
  3725.             simulatedEvent.stop();
  3726.           });
  3727.         });
  3728.         var tryGoInsideComponent = function (component, simulatedEvent) {
  3729.           var isEnterOrSpace = inSet(SPACE.concat(ENTER))(simulatedEvent.event);
  3730.           if (keyingConfig.focusInside === FocusInsideModes.OnEnterOrSpaceMode && isEnterOrSpace && isSource(component, simulatedEvent)) {
  3731.             optFocusIn(keyingConfig).each(function (focusIn) {
  3732.               focusIn(component, keyingConfig, keyingState);
  3733.               simulatedEvent.stop();
  3734.             });
  3735.           }
  3736.         };
  3737.         var keyboardEvents = [
  3738.           run(keydown(), function (component, simulatedEvent) {
  3739.             processKey(component, simulatedEvent, getKeydownRules, keyingConfig, keyingState).fold(function () {
  3740.               tryGoInsideComponent(component, simulatedEvent);
  3741.             }, function (_) {
  3742.               simulatedEvent.stop();
  3743.             });
  3744.           }),
  3745.           run(keyup(), function (component, simulatedEvent) {
  3746.             processKey(component, simulatedEvent, getKeyupRules, keyingConfig, keyingState).each(function (_) {
  3747.               simulatedEvent.stop();
  3748.             });
  3749.           })
  3750.         ];
  3751.         return derive$3(onFocusHandler.toArray().concat(keyboardEvents));
  3752.       };
  3753.       var me = {
  3754.         schema: schema,
  3755.         processKey: processKey,
  3756.         toEvents: toEvents
  3757.       };
  3758.       return me;
  3759.     };
  3760.  
  3761.     var create$4 = function (cyclicField) {
  3762.       var schema = [
  3763.         option('onEscape'),
  3764.         option('onEnter'),
  3765.         defaulted('selector', '[data-alloy-tabstop="true"]:not(:disabled)'),
  3766.         defaulted('firstTabstop', 0),
  3767.         defaulted('useTabstopAt', always),
  3768.         option('visibilitySelector')
  3769.       ].concat([cyclicField]);
  3770.       var isVisible = function (tabbingConfig, element) {
  3771.         var target = tabbingConfig.visibilitySelector.bind(function (sel) {
  3772.           return closest$1(element, sel);
  3773.         }).getOr(element);
  3774.         return get$7(target) > 0;
  3775.       };
  3776.       var findInitial = function (component, tabbingConfig) {
  3777.         var tabstops = descendants(component.element, tabbingConfig.selector);
  3778.         var visibles = filter$2(tabstops, function (elem) {
  3779.           return isVisible(tabbingConfig, elem);
  3780.         });
  3781.         return Optional.from(visibles[tabbingConfig.firstTabstop]);
  3782.       };
  3783.       var findCurrent = function (component, tabbingConfig) {
  3784.         return tabbingConfig.focusManager.get(component).bind(function (elem) {
  3785.           return closest$1(elem, tabbingConfig.selector);
  3786.         });
  3787.       };
  3788.       var isTabstop = function (tabbingConfig, element) {
  3789.         return isVisible(tabbingConfig, element) && tabbingConfig.useTabstopAt(element);
  3790.       };
  3791.       var focusIn = function (component, tabbingConfig, _tabbingState) {
  3792.         findInitial(component, tabbingConfig).each(function (target) {
  3793.           tabbingConfig.focusManager.set(component, target);
  3794.         });
  3795.       };
  3796.       var goFromTabstop = function (component, tabstops, stopIndex, tabbingConfig, cycle) {
  3797.         return cycle(tabstops, stopIndex, function (elem) {
  3798.           return isTabstop(tabbingConfig, elem);
  3799.         }).fold(function () {
  3800.           return tabbingConfig.cyclic ? Optional.some(true) : Optional.none();
  3801.         }, function (target) {
  3802.           tabbingConfig.focusManager.set(component, target);
  3803.           return Optional.some(true);
  3804.         });
  3805.       };
  3806.       var go = function (component, _simulatedEvent, tabbingConfig, cycle) {
  3807.         var tabstops = descendants(component.element, tabbingConfig.selector);
  3808.         return findCurrent(component, tabbingConfig).bind(function (tabstop) {
  3809.           var optStopIndex = findIndex$1(tabstops, curry(eq, tabstop));
  3810.           return optStopIndex.bind(function (stopIndex) {
  3811.             return goFromTabstop(component, tabstops, stopIndex, tabbingConfig, cycle);
  3812.           });
  3813.         });
  3814.       };
  3815.       var goBackwards = function (component, simulatedEvent, tabbingConfig) {
  3816.         var navigate = tabbingConfig.cyclic ? cyclePrev : tryPrev;
  3817.         return go(component, simulatedEvent, tabbingConfig, navigate);
  3818.       };
  3819.       var goForwards = function (component, simulatedEvent, tabbingConfig) {
  3820.         var navigate = tabbingConfig.cyclic ? cycleNext : tryNext;
  3821.         return go(component, simulatedEvent, tabbingConfig, navigate);
  3822.       };
  3823.       var execute = function (component, simulatedEvent, tabbingConfig) {
  3824.         return tabbingConfig.onEnter.bind(function (f) {
  3825.           return f(component, simulatedEvent);
  3826.         });
  3827.       };
  3828.       var exit = function (component, simulatedEvent, tabbingConfig) {
  3829.         return tabbingConfig.onEscape.bind(function (f) {
  3830.           return f(component, simulatedEvent);
  3831.         });
  3832.       };
  3833.       var getKeydownRules = constant$1([
  3834.         rule(and([
  3835.           isShift,
  3836.           inSet(TAB)
  3837.         ]), goBackwards),
  3838.         rule(inSet(TAB), goForwards),
  3839.         rule(inSet(ESCAPE), exit),
  3840.         rule(and([
  3841.           isNotShift,
  3842.           inSet(ENTER)
  3843.         ]), execute)
  3844.       ]);
  3845.       var getKeyupRules = constant$1([]);
  3846.       return typical(schema, NoState.init, getKeydownRules, getKeyupRules, function () {
  3847.         return Optional.some(focusIn);
  3848.       });
  3849.     };
  3850.  
  3851.     var AcyclicType = create$4(customField('cyclic', never));
  3852.  
  3853.     var CyclicType = create$4(customField('cyclic', always));
  3854.  
  3855.     var inside = function (target) {
  3856.       return name$1(target) === 'input' && get$b(target, 'type') !== 'radio' || name$1(target) === 'textarea';
  3857.     };
  3858.  
  3859.     var doDefaultExecute = function (component, _simulatedEvent, focused) {
  3860.       dispatch(component, focused, execute$5());
  3861.       return Optional.some(true);
  3862.     };
  3863.     var defaultExecute = function (component, simulatedEvent, focused) {
  3864.       var isComplex = inside(focused) && inSet(SPACE)(simulatedEvent.event);
  3865.       return isComplex ? Optional.none() : doDefaultExecute(component, simulatedEvent, focused);
  3866.     };
  3867.     var stopEventForFirefox = function (_component, _simulatedEvent) {
  3868.       return Optional.some(true);
  3869.     };
  3870.  
  3871.     var schema$f = [
  3872.       defaulted('execute', defaultExecute),
  3873.       defaulted('useSpace', false),
  3874.       defaulted('useEnter', true),
  3875.       defaulted('useControlEnter', false),
  3876.       defaulted('useDown', false)
  3877.     ];
  3878.     var execute$4 = function (component, simulatedEvent, executeConfig) {
  3879.       return executeConfig.execute(component, simulatedEvent, component.element);
  3880.     };
  3881.     var getKeydownRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {
  3882.       var spaceExec = executeConfig.useSpace && !inside(component.element) ? SPACE : [];
  3883.       var enterExec = executeConfig.useEnter ? ENTER : [];
  3884.       var downExec = executeConfig.useDown ? DOWN : [];
  3885.       var execKeys = spaceExec.concat(enterExec).concat(downExec);
  3886.       return [rule(inSet(execKeys), execute$4)].concat(executeConfig.useControlEnter ? [rule(and([
  3887.           isControl,
  3888.           inSet(ENTER)
  3889.         ]), execute$4)] : []);
  3890.     };
  3891.     var getKeyupRules$5 = function (component, _simulatedEvent, executeConfig, _executeState) {
  3892.       return executeConfig.useSpace && !inside(component.element) ? [rule(inSet(SPACE), stopEventForFirefox)] : [];
  3893.     };
  3894.     var ExecutionType = typical(schema$f, NoState.init, getKeydownRules$5, getKeyupRules$5, function () {
  3895.       return Optional.none();
  3896.     });
  3897.  
  3898.     var singleton$1 = function (doRevoke) {
  3899.       var subject = Cell(Optional.none());
  3900.       var revoke = function () {
  3901.         return subject.get().each(doRevoke);
  3902.       };
  3903.       var clear = function () {
  3904.         revoke();
  3905.         subject.set(Optional.none());
  3906.       };
  3907.       var isSet = function () {
  3908.         return subject.get().isSome();
  3909.       };
  3910.       var get = function () {
  3911.         return subject.get();
  3912.       };
  3913.       var set = function (s) {
  3914.         revoke();
  3915.         subject.set(Optional.some(s));
  3916.       };
  3917.       return {
  3918.         clear: clear,
  3919.         isSet: isSet,
  3920.         get: get,
  3921.         set: set
  3922.       };
  3923.     };
  3924.     var destroyable = function () {
  3925.       return singleton$1(function (s) {
  3926.         return s.destroy();
  3927.       });
  3928.     };
  3929.     var api$2 = function () {
  3930.       var subject = destroyable();
  3931.       var run = function (f) {
  3932.         return subject.get().each(f);
  3933.       };
  3934.       return __assign(__assign({}, subject), { run: run });
  3935.     };
  3936.     var value = function () {
  3937.       var subject = singleton$1(noop);
  3938.       var on = function (f) {
  3939.         return subject.get().each(f);
  3940.       };
  3941.       return __assign(__assign({}, subject), { on: on });
  3942.     };
  3943.  
  3944.     var flatgrid$1 = function () {
  3945.       var dimensions = value();
  3946.       var setGridSize = function (numRows, numColumns) {
  3947.         dimensions.set({
  3948.           numRows: numRows,
  3949.           numColumns: numColumns
  3950.         });
  3951.       };
  3952.       var getNumRows = function () {
  3953.         return dimensions.get().map(function (d) {
  3954.           return d.numRows;
  3955.         });
  3956.       };
  3957.       var getNumColumns = function () {
  3958.         return dimensions.get().map(function (d) {
  3959.           return d.numColumns;
  3960.         });
  3961.       };
  3962.       return nu$2({
  3963.         readState: function () {
  3964.           return dimensions.get().map(function (d) {
  3965.             return {
  3966.               numRows: String(d.numRows),
  3967.               numColumns: String(d.numColumns)
  3968.             };
  3969.           }).getOr({
  3970.             numRows: '?',
  3971.             numColumns: '?'
  3972.           });
  3973.         },
  3974.         setGridSize: setGridSize,
  3975.         getNumRows: getNumRows,
  3976.         getNumColumns: getNumColumns
  3977.       });
  3978.     };
  3979.     var init$5 = function (spec) {
  3980.       return spec.state(spec);
  3981.     };
  3982.  
  3983.     var KeyingState = /*#__PURE__*/Object.freeze({
  3984.         __proto__: null,
  3985.         flatgrid: flatgrid$1,
  3986.         init: init$5
  3987.     });
  3988.  
  3989.     var onDirection = function (isLtr, isRtl) {
  3990.       return function (element) {
  3991.         return getDirection(element) === 'rtl' ? isRtl : isLtr;
  3992.       };
  3993.     };
  3994.     var getDirection = function (element) {
  3995.       return get$8(element, 'direction') === 'rtl' ? 'rtl' : 'ltr';
  3996.     };
  3997.  
  3998.     var useH = function (movement) {
  3999.       return function (component, simulatedEvent, config, state) {
  4000.         var move = movement(component.element);
  4001.         return use(move, component, simulatedEvent, config, state);
  4002.       };
  4003.     };
  4004.     var west = function (moveLeft, moveRight) {
  4005.       var movement = onDirection(moveLeft, moveRight);
  4006.       return useH(movement);
  4007.     };
  4008.     var east = function (moveLeft, moveRight) {
  4009.       var movement = onDirection(moveRight, moveLeft);
  4010.       return useH(movement);
  4011.     };
  4012.     var useV = function (move) {
  4013.       return function (component, simulatedEvent, config, state) {
  4014.         return use(move, component, simulatedEvent, config, state);
  4015.       };
  4016.     };
  4017.     var use = function (move, component, simulatedEvent, config, state) {
  4018.       var outcome = config.focusManager.get(component).bind(function (focused) {
  4019.         return move(component.element, focused, config, state);
  4020.       });
  4021.       return outcome.map(function (newFocus) {
  4022.         config.focusManager.set(component, newFocus);
  4023.         return true;
  4024.       });
  4025.     };
  4026.     var north = useV;
  4027.     var south = useV;
  4028.     var move$1 = useV;
  4029.  
  4030.     var isHidden = function (dom) {
  4031.       return dom.offsetWidth <= 0 && dom.offsetHeight <= 0;
  4032.     };
  4033.     var isVisible = function (element) {
  4034.       return !isHidden(element.dom);
  4035.     };
  4036.  
  4037.     var locate = function (candidates, predicate) {
  4038.       return findIndex$1(candidates, predicate).map(function (index) {
  4039.         return {
  4040.           index: index,
  4041.           candidates: candidates
  4042.         };
  4043.       });
  4044.     };
  4045.  
  4046.     var locateVisible = function (container, current, selector) {
  4047.       var predicate = function (x) {
  4048.         return eq(x, current);
  4049.       };
  4050.       var candidates = descendants(container, selector);
  4051.       var visible = filter$2(candidates, isVisible);
  4052.       return locate(visible, predicate);
  4053.     };
  4054.     var findIndex = function (elements, target) {
  4055.       return findIndex$1(elements, function (elem) {
  4056.         return eq(target, elem);
  4057.       });
  4058.     };
  4059.  
  4060.     var withGrid = function (values, index, numCols, f) {
  4061.       var oldRow = Math.floor(index / numCols);
  4062.       var oldColumn = index % numCols;
  4063.       return f(oldRow, oldColumn).bind(function (address) {
  4064.         var newIndex = address.row * numCols + address.column;
  4065.         return newIndex >= 0 && newIndex < values.length ? Optional.some(values[newIndex]) : Optional.none();
  4066.       });
  4067.     };
  4068.     var cycleHorizontal$1 = function (values, index, numRows, numCols, delta) {
  4069.       return withGrid(values, index, numCols, function (oldRow, oldColumn) {
  4070.         var onLastRow = oldRow === numRows - 1;
  4071.         var colsInRow = onLastRow ? values.length - oldRow * numCols : numCols;
  4072.         var newColumn = cycleBy(oldColumn, delta, 0, colsInRow - 1);
  4073.         return Optional.some({
  4074.           row: oldRow,
  4075.           column: newColumn
  4076.         });
  4077.       });
  4078.     };
  4079.     var cycleVertical$1 = function (values, index, numRows, numCols, delta) {
  4080.       return withGrid(values, index, numCols, function (oldRow, oldColumn) {
  4081.         var newRow = cycleBy(oldRow, delta, 0, numRows - 1);
  4082.         var onLastRow = newRow === numRows - 1;
  4083.         var colsInRow = onLastRow ? values.length - newRow * numCols : numCols;
  4084.         var newCol = clamp(oldColumn, 0, colsInRow - 1);
  4085.         return Optional.some({
  4086.           row: newRow,
  4087.           column: newCol
  4088.         });
  4089.       });
  4090.     };
  4091.     var cycleRight$1 = function (values, index, numRows, numCols) {
  4092.       return cycleHorizontal$1(values, index, numRows, numCols, +1);
  4093.     };
  4094.     var cycleLeft$1 = function (values, index, numRows, numCols) {
  4095.       return cycleHorizontal$1(values, index, numRows, numCols, -1);
  4096.     };
  4097.     var cycleUp$1 = function (values, index, numRows, numCols) {
  4098.       return cycleVertical$1(values, index, numRows, numCols, -1);
  4099.     };
  4100.     var cycleDown$1 = function (values, index, numRows, numCols) {
  4101.       return cycleVertical$1(values, index, numRows, numCols, +1);
  4102.     };
  4103.  
  4104.     var schema$e = [
  4105.       required$1('selector'),
  4106.       defaulted('execute', defaultExecute),
  4107.       onKeyboardHandler('onEscape'),
  4108.       defaulted('captureTab', false),
  4109.       initSize()
  4110.     ];
  4111.     var focusIn$3 = function (component, gridConfig, _gridState) {
  4112.       descendant(component.element, gridConfig.selector).each(function (first) {
  4113.         gridConfig.focusManager.set(component, first);
  4114.       });
  4115.     };
  4116.     var findCurrent$1 = function (component, gridConfig) {
  4117.       return gridConfig.focusManager.get(component).bind(function (elem) {
  4118.         return closest$1(elem, gridConfig.selector);
  4119.       });
  4120.     };
  4121.     var execute$3 = function (component, simulatedEvent, gridConfig, _gridState) {
  4122.       return findCurrent$1(component, gridConfig).bind(function (focused) {
  4123.         return gridConfig.execute(component, simulatedEvent, focused);
  4124.       });
  4125.     };
  4126.     var doMove$2 = function (cycle) {
  4127.       return function (element, focused, gridConfig, gridState) {
  4128.         return locateVisible(element, focused, gridConfig.selector).bind(function (identified) {
  4129.           return cycle(identified.candidates, identified.index, gridState.getNumRows().getOr(gridConfig.initSize.numRows), gridState.getNumColumns().getOr(gridConfig.initSize.numColumns));
  4130.         });
  4131.       };
  4132.     };
  4133.     var handleTab = function (_component, _simulatedEvent, gridConfig) {
  4134.       return gridConfig.captureTab ? Optional.some(true) : Optional.none();
  4135.     };
  4136.     var doEscape$1 = function (component, simulatedEvent, gridConfig) {
  4137.       return gridConfig.onEscape(component, simulatedEvent);
  4138.     };
  4139.     var moveLeft$3 = doMove$2(cycleLeft$1);
  4140.     var moveRight$3 = doMove$2(cycleRight$1);
  4141.     var moveNorth$1 = doMove$2(cycleUp$1);
  4142.     var moveSouth$1 = doMove$2(cycleDown$1);
  4143.     var getKeydownRules$4 = constant$1([
  4144.       rule(inSet(LEFT), west(moveLeft$3, moveRight$3)),
  4145.       rule(inSet(RIGHT), east(moveLeft$3, moveRight$3)),
  4146.       rule(inSet(UP), north(moveNorth$1)),
  4147.       rule(inSet(DOWN), south(moveSouth$1)),
  4148.       rule(and([
  4149.         isShift,
  4150.         inSet(TAB)
  4151.       ]), handleTab),
  4152.       rule(and([
  4153.         isNotShift,
  4154.         inSet(TAB)
  4155.       ]), handleTab),
  4156.       rule(inSet(ESCAPE), doEscape$1),
  4157.       rule(inSet(SPACE.concat(ENTER)), execute$3)
  4158.     ]);
  4159.     var getKeyupRules$4 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
  4160.     var FlatgridType = typical(schema$e, flatgrid$1, getKeydownRules$4, getKeyupRules$4, function () {
  4161.       return Optional.some(focusIn$3);
  4162.     });
  4163.  
  4164.     var horizontal = function (container, selector, current, delta) {
  4165.       var isDisabledButton = function (candidate) {
  4166.         return name$1(candidate) === 'button' && get$b(candidate, 'disabled') === 'disabled';
  4167.       };
  4168.       var tryCycle = function (initial, index, candidates) {
  4169.         var newIndex = cycleBy(index, delta, 0, candidates.length - 1);
  4170.         if (newIndex === initial) {
  4171.           return Optional.none();
  4172.         } else {
  4173.           return isDisabledButton(candidates[newIndex]) ? tryCycle(initial, newIndex, candidates) : Optional.from(candidates[newIndex]);
  4174.         }
  4175.       };
  4176.       return locateVisible(container, current, selector).bind(function (identified) {
  4177.         var index = identified.index;
  4178.         var candidates = identified.candidates;
  4179.         return tryCycle(index, index, candidates);
  4180.       });
  4181.     };
  4182.  
  4183.     var schema$d = [
  4184.       required$1('selector'),
  4185.       defaulted('getInitial', Optional.none),
  4186.       defaulted('execute', defaultExecute),
  4187.       onKeyboardHandler('onEscape'),
  4188.       defaulted('executeOnMove', false),
  4189.       defaulted('allowVertical', true)
  4190.     ];
  4191.     var findCurrent = function (component, flowConfig) {
  4192.       return flowConfig.focusManager.get(component).bind(function (elem) {
  4193.         return closest$1(elem, flowConfig.selector);
  4194.       });
  4195.     };
  4196.     var execute$2 = function (component, simulatedEvent, flowConfig) {
  4197.       return findCurrent(component, flowConfig).bind(function (focused) {
  4198.         return flowConfig.execute(component, simulatedEvent, focused);
  4199.       });
  4200.     };
  4201.     var focusIn$2 = function (component, flowConfig, _state) {
  4202.       flowConfig.getInitial(component).orThunk(function () {
  4203.         return descendant(component.element, flowConfig.selector);
  4204.       }).each(function (first) {
  4205.         flowConfig.focusManager.set(component, first);
  4206.       });
  4207.     };
  4208.     var moveLeft$2 = function (element, focused, info) {
  4209.       return horizontal(element, info.selector, focused, -1);
  4210.     };
  4211.     var moveRight$2 = function (element, focused, info) {
  4212.       return horizontal(element, info.selector, focused, +1);
  4213.     };
  4214.     var doMove$1 = function (movement) {
  4215.       return function (component, simulatedEvent, flowConfig, flowState) {
  4216.         return movement(component, simulatedEvent, flowConfig, flowState).bind(function () {
  4217.           return flowConfig.executeOnMove ? execute$2(component, simulatedEvent, flowConfig) : Optional.some(true);
  4218.         });
  4219.       };
  4220.     };
  4221.     var doEscape = function (component, simulatedEvent, flowConfig) {
  4222.       return flowConfig.onEscape(component, simulatedEvent);
  4223.     };
  4224.     var getKeydownRules$3 = function (_component, _se, flowConfig, _flowState) {
  4225.       var westMovers = LEFT.concat(flowConfig.allowVertical ? UP : []);
  4226.       var eastMovers = RIGHT.concat(flowConfig.allowVertical ? DOWN : []);
  4227.       return [
  4228.         rule(inSet(westMovers), doMove$1(west(moveLeft$2, moveRight$2))),
  4229.         rule(inSet(eastMovers), doMove$1(east(moveLeft$2, moveRight$2))),
  4230.         rule(inSet(ENTER), execute$2),
  4231.         rule(inSet(SPACE), execute$2),
  4232.         rule(inSet(ESCAPE), doEscape)
  4233.       ];
  4234.     };
  4235.     var getKeyupRules$3 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
  4236.     var FlowType = typical(schema$d, NoState.init, getKeydownRules$3, getKeyupRules$3, function () {
  4237.       return Optional.some(focusIn$2);
  4238.     });
  4239.  
  4240.     var toCell = function (matrix, rowIndex, columnIndex) {
  4241.       return Optional.from(matrix[rowIndex]).bind(function (row) {
  4242.         return Optional.from(row[columnIndex]).map(function (cell) {
  4243.           return {
  4244.             rowIndex: rowIndex,
  4245.             columnIndex: columnIndex,
  4246.             cell: cell
  4247.           };
  4248.         });
  4249.       });
  4250.     };
  4251.     var cycleHorizontal = function (matrix, rowIndex, startCol, deltaCol) {
  4252.       var row = matrix[rowIndex];
  4253.       var colsInRow = row.length;
  4254.       var newColIndex = cycleBy(startCol, deltaCol, 0, colsInRow - 1);
  4255.       return toCell(matrix, rowIndex, newColIndex);
  4256.     };
  4257.     var cycleVertical = function (matrix, colIndex, startRow, deltaRow) {
  4258.       var nextRowIndex = cycleBy(startRow, deltaRow, 0, matrix.length - 1);
  4259.       var colsInNextRow = matrix[nextRowIndex].length;
  4260.       var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);
  4261.       return toCell(matrix, nextRowIndex, nextColIndex);
  4262.     };
  4263.     var moveHorizontal = function (matrix, rowIndex, startCol, deltaCol) {
  4264.       var row = matrix[rowIndex];
  4265.       var colsInRow = row.length;
  4266.       var newColIndex = clamp(startCol + deltaCol, 0, colsInRow - 1);
  4267.       return toCell(matrix, rowIndex, newColIndex);
  4268.     };
  4269.     var moveVertical = function (matrix, colIndex, startRow, deltaRow) {
  4270.       var nextRowIndex = clamp(startRow + deltaRow, 0, matrix.length - 1);
  4271.       var colsInNextRow = matrix[nextRowIndex].length;
  4272.       var nextColIndex = clamp(colIndex, 0, colsInNextRow - 1);
  4273.       return toCell(matrix, nextRowIndex, nextColIndex);
  4274.     };
  4275.     var cycleRight = function (matrix, startRow, startCol) {
  4276.       return cycleHorizontal(matrix, startRow, startCol, +1);
  4277.     };
  4278.     var cycleLeft = function (matrix, startRow, startCol) {
  4279.       return cycleHorizontal(matrix, startRow, startCol, -1);
  4280.     };
  4281.     var cycleUp = function (matrix, startRow, startCol) {
  4282.       return cycleVertical(matrix, startCol, startRow, -1);
  4283.     };
  4284.     var cycleDown = function (matrix, startRow, startCol) {
  4285.       return cycleVertical(matrix, startCol, startRow, +1);
  4286.     };
  4287.     var moveLeft$1 = function (matrix, startRow, startCol) {
  4288.       return moveHorizontal(matrix, startRow, startCol, -1);
  4289.     };
  4290.     var moveRight$1 = function (matrix, startRow, startCol) {
  4291.       return moveHorizontal(matrix, startRow, startCol, +1);
  4292.     };
  4293.     var moveUp$1 = function (matrix, startRow, startCol) {
  4294.       return moveVertical(matrix, startCol, startRow, -1);
  4295.     };
  4296.     var moveDown$1 = function (matrix, startRow, startCol) {
  4297.       return moveVertical(matrix, startCol, startRow, +1);
  4298.     };
  4299.  
  4300.     var schema$c = [
  4301.       requiredObjOf('selectors', [
  4302.         required$1('row'),
  4303.         required$1('cell')
  4304.       ]),
  4305.       defaulted('cycles', true),
  4306.       defaulted('previousSelector', Optional.none),
  4307.       defaulted('execute', defaultExecute)
  4308.     ];
  4309.     var focusIn$1 = function (component, matrixConfig, _state) {
  4310.       var focused = matrixConfig.previousSelector(component).orThunk(function () {
  4311.         var selectors = matrixConfig.selectors;
  4312.         return descendant(component.element, selectors.cell);
  4313.       });
  4314.       focused.each(function (cell) {
  4315.         matrixConfig.focusManager.set(component, cell);
  4316.       });
  4317.     };
  4318.     var execute$1 = function (component, simulatedEvent, matrixConfig) {
  4319.       return search(component.element).bind(function (focused) {
  4320.         return matrixConfig.execute(component, simulatedEvent, focused);
  4321.       });
  4322.     };
  4323.     var toMatrix = function (rows, matrixConfig) {
  4324.       return map$2(rows, function (row) {
  4325.         return descendants(row, matrixConfig.selectors.cell);
  4326.       });
  4327.     };
  4328.     var doMove = function (ifCycle, ifMove) {
  4329.       return function (element, focused, matrixConfig) {
  4330.         var move = matrixConfig.cycles ? ifCycle : ifMove;
  4331.         return closest$1(focused, matrixConfig.selectors.row).bind(function (inRow) {
  4332.           var cellsInRow = descendants(inRow, matrixConfig.selectors.cell);
  4333.           return findIndex(cellsInRow, focused).bind(function (colIndex) {
  4334.             var allRows = descendants(element, matrixConfig.selectors.row);
  4335.             return findIndex(allRows, inRow).bind(function (rowIndex) {
  4336.               var matrix = toMatrix(allRows, matrixConfig);
  4337.               return move(matrix, rowIndex, colIndex).map(function (next) {
  4338.                 return next.cell;
  4339.               });
  4340.             });
  4341.           });
  4342.         });
  4343.       };
  4344.     };
  4345.     var moveLeft = doMove(cycleLeft, moveLeft$1);
  4346.     var moveRight = doMove(cycleRight, moveRight$1);
  4347.     var moveNorth = doMove(cycleUp, moveUp$1);
  4348.     var moveSouth = doMove(cycleDown, moveDown$1);
  4349.     var getKeydownRules$2 = constant$1([
  4350.       rule(inSet(LEFT), west(moveLeft, moveRight)),
  4351.       rule(inSet(RIGHT), east(moveLeft, moveRight)),
  4352.       rule(inSet(UP), north(moveNorth)),
  4353.       rule(inSet(DOWN), south(moveSouth)),
  4354.       rule(inSet(SPACE.concat(ENTER)), execute$1)
  4355.     ]);
  4356.     var getKeyupRules$2 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
  4357.     var MatrixType = typical(schema$c, NoState.init, getKeydownRules$2, getKeyupRules$2, function () {
  4358.       return Optional.some(focusIn$1);
  4359.     });
  4360.  
  4361.     var schema$b = [
  4362.       required$1('selector'),
  4363.       defaulted('execute', defaultExecute),
  4364.       defaulted('moveOnTab', false)
  4365.     ];
  4366.     var execute = function (component, simulatedEvent, menuConfig) {
  4367.       return menuConfig.focusManager.get(component).bind(function (focused) {
  4368.         return menuConfig.execute(component, simulatedEvent, focused);
  4369.       });
  4370.     };
  4371.     var focusIn = function (component, menuConfig, _state) {
  4372.       descendant(component.element, menuConfig.selector).each(function (first) {
  4373.         menuConfig.focusManager.set(component, first);
  4374.       });
  4375.     };
  4376.     var moveUp = function (element, focused, info) {
  4377.       return horizontal(element, info.selector, focused, -1);
  4378.     };
  4379.     var moveDown = function (element, focused, info) {
  4380.       return horizontal(element, info.selector, focused, +1);
  4381.     };
  4382.     var fireShiftTab = function (component, simulatedEvent, menuConfig, menuState) {
  4383.       return menuConfig.moveOnTab ? move$1(moveUp)(component, simulatedEvent, menuConfig, menuState) : Optional.none();
  4384.     };
  4385.     var fireTab = function (component, simulatedEvent, menuConfig, menuState) {
  4386.       return menuConfig.moveOnTab ? move$1(moveDown)(component, simulatedEvent, menuConfig, menuState) : Optional.none();
  4387.     };
  4388.     var getKeydownRules$1 = constant$1([
  4389.       rule(inSet(UP), move$1(moveUp)),
  4390.       rule(inSet(DOWN), move$1(moveDown)),
  4391.       rule(and([
  4392.         isShift,
  4393.         inSet(TAB)
  4394.       ]), fireShiftTab),
  4395.       rule(and([
  4396.         isNotShift,
  4397.         inSet(TAB)
  4398.       ]), fireTab),
  4399.       rule(inSet(ENTER), execute),
  4400.       rule(inSet(SPACE), execute)
  4401.     ]);
  4402.     var getKeyupRules$1 = constant$1([rule(inSet(SPACE), stopEventForFirefox)]);
  4403.     var MenuType = typical(schema$b, NoState.init, getKeydownRules$1, getKeyupRules$1, function () {
  4404.       return Optional.some(focusIn);
  4405.     });
  4406.  
  4407.     var schema$a = [
  4408.       onKeyboardHandler('onSpace'),
  4409.       onKeyboardHandler('onEnter'),
  4410.       onKeyboardHandler('onShiftEnter'),
  4411.       onKeyboardHandler('onLeft'),
  4412.       onKeyboardHandler('onRight'),
  4413.       onKeyboardHandler('onTab'),
  4414.       onKeyboardHandler('onShiftTab'),
  4415.       onKeyboardHandler('onUp'),
  4416.       onKeyboardHandler('onDown'),
  4417.       onKeyboardHandler('onEscape'),
  4418.       defaulted('stopSpaceKeyup', false),
  4419.       option('focusIn')
  4420.     ];
  4421.     var getKeydownRules = function (component, simulatedEvent, specialInfo) {
  4422.       return [
  4423.         rule(inSet(SPACE), specialInfo.onSpace),
  4424.         rule(and([
  4425.           isNotShift,
  4426.           inSet(ENTER)
  4427.         ]), specialInfo.onEnter),
  4428.         rule(and([
  4429.           isShift,
  4430.           inSet(ENTER)
  4431.         ]), specialInfo.onShiftEnter),
  4432.         rule(and([
  4433.           isShift,
  4434.           inSet(TAB)
  4435.         ]), specialInfo.onShiftTab),
  4436.         rule(and([
  4437.           isNotShift,
  4438.           inSet(TAB)
  4439.         ]), specialInfo.onTab),
  4440.         rule(inSet(UP), specialInfo.onUp),
  4441.         rule(inSet(DOWN), specialInfo.onDown),
  4442.         rule(inSet(LEFT), specialInfo.onLeft),
  4443.         rule(inSet(RIGHT), specialInfo.onRight),
  4444.         rule(inSet(SPACE), specialInfo.onSpace),
  4445.         rule(inSet(ESCAPE), specialInfo.onEscape)
  4446.       ];
  4447.     };
  4448.     var getKeyupRules = function (component, simulatedEvent, specialInfo) {
  4449.       return specialInfo.stopSpaceKeyup ? [rule(inSet(SPACE), stopEventForFirefox)] : [];
  4450.     };
  4451.     var SpecialType = typical(schema$a, NoState.init, getKeydownRules, getKeyupRules, function (specialInfo) {
  4452.       return specialInfo.focusIn;
  4453.     });
  4454.  
  4455.     var acyclic = AcyclicType.schema();
  4456.     var cyclic = CyclicType.schema();
  4457.     var flow = FlowType.schema();
  4458.     var flatgrid = FlatgridType.schema();
  4459.     var matrix = MatrixType.schema();
  4460.     var execution = ExecutionType.schema();
  4461.     var menu = MenuType.schema();
  4462.     var special = SpecialType.schema();
  4463.  
  4464.     var KeyboardBranches = /*#__PURE__*/Object.freeze({
  4465.         __proto__: null,
  4466.         acyclic: acyclic,
  4467.         cyclic: cyclic,
  4468.         flow: flow,
  4469.         flatgrid: flatgrid,
  4470.         matrix: matrix,
  4471.         execution: execution,
  4472.         menu: menu,
  4473.         special: special
  4474.     });
  4475.  
  4476.     var isFlatgridState = function (keyState) {
  4477.       return hasNonNullableKey(keyState, 'setGridSize');
  4478.     };
  4479.     var Keying = createModes({
  4480.       branchKey: 'mode',
  4481.       branches: KeyboardBranches,
  4482.       name: 'keying',
  4483.       active: {
  4484.         events: function (keyingConfig, keyingState) {
  4485.           var handler = keyingConfig.handler;
  4486.           return handler.toEvents(keyingConfig, keyingState);
  4487.         }
  4488.       },
  4489.       apis: {
  4490.         focusIn: function (component, keyConfig, keyState) {
  4491.           keyConfig.sendFocusIn(keyConfig).fold(function () {
  4492.             component.getSystem().triggerFocus(component.element, component.element);
  4493.           }, function (sendFocusIn) {
  4494.             sendFocusIn(component, keyConfig, keyState);
  4495.           });
  4496.         },
  4497.         setGridSize: function (component, keyConfig, keyState, numRows, numColumns) {
  4498.           if (!isFlatgridState(keyState)) {
  4499.             console.error('Layout does not support setGridSize');
  4500.           } else {
  4501.             keyState.setGridSize(numRows, numColumns);
  4502.           }
  4503.         }
  4504.       },
  4505.       state: KeyingState
  4506.     });
  4507.  
  4508.     var field$1 = function (name, forbidden) {
  4509.       return defaultedObjOf(name, {}, map$2(forbidden, function (f) {
  4510.         return forbid(f.name(), 'Cannot configure ' + f.name() + ' for ' + name);
  4511.       }).concat([customField('dump', identity)]));
  4512.     };
  4513.     var get$6 = function (data) {
  4514.       return data.dump;
  4515.     };
  4516.     var augment = function (data, original) {
  4517.       return __assign(__assign({}, derive$2(original)), data.dump);
  4518.     };
  4519.     var SketchBehaviours = {
  4520.       field: field$1,
  4521.       augment: augment,
  4522.       get: get$6
  4523.     };
  4524.  
  4525.     var _placeholder = 'placeholder';
  4526.     var adt$5 = Adt.generate([
  4527.       {
  4528.         single: [
  4529.           'required',
  4530.           'valueThunk'
  4531.         ]
  4532.       },
  4533.       {
  4534.         multiple: [
  4535.           'required',
  4536.           'valueThunks'
  4537.         ]
  4538.       }
  4539.     ]);
  4540.     var isSubstituted = function (spec) {
  4541.       return has$2(spec, 'uiType');
  4542.     };
  4543.     var subPlaceholder = function (owner, detail, compSpec, placeholders) {
  4544.       if (owner.exists(function (o) {
  4545.           return o !== compSpec.owner;
  4546.         })) {
  4547.         return adt$5.single(true, constant$1(compSpec));
  4548.       }
  4549.       return get$c(placeholders, compSpec.name).fold(function () {
  4550.         throw new Error('Unknown placeholder component: ' + compSpec.name + '\nKnown: [' + keys(placeholders) + ']\nNamespace: ' + owner.getOr('none') + '\nSpec: ' + JSON.stringify(compSpec, null, 2));
  4551.       }, function (newSpec) {
  4552.         return newSpec.replace();
  4553.       });
  4554.     };
  4555.     var scan = function (owner, detail, compSpec, placeholders) {
  4556.       if (isSubstituted(compSpec) && compSpec.uiType === _placeholder) {
  4557.         return subPlaceholder(owner, detail, compSpec, placeholders);
  4558.       } else {
  4559.         return adt$5.single(false, constant$1(compSpec));
  4560.       }
  4561.     };
  4562.     var substitute = function (owner, detail, compSpec, placeholders) {
  4563.       var base = scan(owner, detail, compSpec, placeholders);
  4564.       return base.fold(function (req, valueThunk) {
  4565.         var value = isSubstituted(compSpec) ? valueThunk(detail, compSpec.config, compSpec.validated) : valueThunk(detail);
  4566.         var childSpecs = get$c(value, 'components').getOr([]);
  4567.         var substituted = bind$3(childSpecs, function (c) {
  4568.           return substitute(owner, detail, c, placeholders);
  4569.         });
  4570.         return [__assign(__assign({}, value), { components: substituted })];
  4571.       }, function (req, valuesThunk) {
  4572.         if (isSubstituted(compSpec)) {
  4573.           var values = valuesThunk(detail, compSpec.config, compSpec.validated);
  4574.           var preprocessor = compSpec.validated.preprocess.getOr(identity);
  4575.           return preprocessor(values);
  4576.         } else {
  4577.           return valuesThunk(detail);
  4578.         }
  4579.       });
  4580.     };
  4581.     var substituteAll = function (owner, detail, components, placeholders) {
  4582.       return bind$3(components, function (c) {
  4583.         return substitute(owner, detail, c, placeholders);
  4584.       });
  4585.     };
  4586.     var oneReplace = function (label, replacements) {
  4587.       var called = false;
  4588.       var used = function () {
  4589.         return called;
  4590.       };
  4591.       var replace = function () {
  4592.         if (called) {
  4593.           throw new Error('Trying to use the same placeholder more than once: ' + label);
  4594.         }
  4595.         called = true;
  4596.         return replacements;
  4597.       };
  4598.       var required = function () {
  4599.         return replacements.fold(function (req, _) {
  4600.           return req;
  4601.         }, function (req, _) {
  4602.           return req;
  4603.         });
  4604.       };
  4605.       return {
  4606.         name: constant$1(label),
  4607.         required: required,
  4608.         used: used,
  4609.         replace: replace
  4610.       };
  4611.     };
  4612.     var substitutePlaces = function (owner, detail, components, placeholders) {
  4613.       var ps = map$1(placeholders, function (ph, name) {
  4614.         return oneReplace(name, ph);
  4615.       });
  4616.       var outcome = substituteAll(owner, detail, components, ps);
  4617.       each(ps, function (p) {
  4618.         if (p.used() === false && p.required()) {
  4619.           throw new Error('Placeholder: ' + p.name() + ' was not found in components list\nNamespace: ' + owner.getOr('none') + '\nComponents: ' + JSON.stringify(detail.components, null, 2));
  4620.         }
  4621.       });
  4622.       return outcome;
  4623.     };
  4624.     var single$2 = adt$5.single;
  4625.     var multiple = adt$5.multiple;
  4626.     var placeholder = constant$1(_placeholder);
  4627.  
  4628.     var unique = 0;
  4629.     var generate$4 = function (prefix) {
  4630.       var date = new Date();
  4631.       var time = date.getTime();
  4632.       var random = Math.floor(Math.random() * 1000000000);
  4633.       unique++;
  4634.       return prefix + '_' + random + unique + String(time);
  4635.     };
  4636.  
  4637.     var adt$4 = Adt.generate([
  4638.       { required: ['data'] },
  4639.       { external: ['data'] },
  4640.       { optional: ['data'] },
  4641.       { group: ['data'] }
  4642.     ]);
  4643.     var fFactory = defaulted('factory', { sketch: identity });
  4644.     var fSchema = defaulted('schema', []);
  4645.     var fName = required$1('name');
  4646.     var fPname = field$2('pname', 'pname', defaultedThunk(function (typeSpec) {
  4647.       return '<alloy.' + generate$4(typeSpec.name) + '>';
  4648.     }), anyValue());
  4649.     var fGroupSchema = customField('schema', function () {
  4650.       return [option('preprocess')];
  4651.     });
  4652.     var fDefaults = defaulted('defaults', constant$1({}));
  4653.     var fOverrides = defaulted('overrides', constant$1({}));
  4654.     var requiredSpec = objOf([
  4655.       fFactory,
  4656.       fSchema,
  4657.       fName,
  4658.       fPname,
  4659.       fDefaults,
  4660.       fOverrides
  4661.     ]);
  4662.     var externalSpec = objOf([
  4663.       fFactory,
  4664.       fSchema,
  4665.       fName,
  4666.       fDefaults,
  4667.       fOverrides
  4668.     ]);
  4669.     var optionalSpec = objOf([
  4670.       fFactory,
  4671.       fSchema,
  4672.       fName,
  4673.       fPname,
  4674.       fDefaults,
  4675.       fOverrides
  4676.     ]);
  4677.     var groupSpec = objOf([
  4678.       fFactory,
  4679.       fGroupSchema,
  4680.       fName,
  4681.       required$1('unit'),
  4682.       fPname,
  4683.       fDefaults,
  4684.       fOverrides
  4685.     ]);
  4686.     var asNamedPart = function (part) {
  4687.       return part.fold(Optional.some, Optional.none, Optional.some, Optional.some);
  4688.     };
  4689.     var name = function (part) {
  4690.       var get = function (data) {
  4691.         return data.name;
  4692.       };
  4693.       return part.fold(get, get, get, get);
  4694.     };
  4695.     var convert$1 = function (adtConstructor, partSchema) {
  4696.       return function (spec) {
  4697.         var data = asRawOrDie$1('Converting part type', partSchema, spec);
  4698.         return adtConstructor(data);
  4699.       };
  4700.     };
  4701.     var required = convert$1(adt$4.required, requiredSpec);
  4702.     convert$1(adt$4.external, externalSpec);
  4703.     var optional = convert$1(adt$4.optional, optionalSpec);
  4704.     var group = convert$1(adt$4.group, groupSpec);
  4705.     var original = constant$1('entirety');
  4706.  
  4707.     var combine$2 = function (detail, data, partSpec, partValidated) {
  4708.       return deepMerge(data.defaults(detail, partSpec, partValidated), partSpec, { uid: detail.partUids[data.name] }, data.overrides(detail, partSpec, partValidated));
  4709.     };
  4710.     var subs = function (owner, detail, parts) {
  4711.       var internals = {};
  4712.       var externals = {};
  4713.       each$1(parts, function (part) {
  4714.         part.fold(function (data) {
  4715.           internals[data.pname] = single$2(true, function (detail, partSpec, partValidated) {
  4716.             return data.factory.sketch(combine$2(detail, data, partSpec, partValidated));
  4717.           });
  4718.         }, function (data) {
  4719.           var partSpec = detail.parts[data.name];
  4720.           externals[data.name] = constant$1(data.factory.sketch(combine$2(detail, data, partSpec[original()]), partSpec));
  4721.         }, function (data) {
  4722.           internals[data.pname] = single$2(false, function (detail, partSpec, partValidated) {
  4723.             return data.factory.sketch(combine$2(detail, data, partSpec, partValidated));
  4724.           });
  4725.         }, function (data) {
  4726.           internals[data.pname] = multiple(true, function (detail, _partSpec, _partValidated) {
  4727.             var units = detail[data.name];
  4728.             return map$2(units, function (u) {
  4729.               return data.factory.sketch(deepMerge(data.defaults(detail, u, _partValidated), u, data.overrides(detail, u)));
  4730.             });
  4731.           });
  4732.         });
  4733.       });
  4734.       return {
  4735.         internals: constant$1(internals),
  4736.         externals: constant$1(externals)
  4737.       };
  4738.     };
  4739.  
  4740.     var generate$3 = function (owner, parts) {
  4741.       var r = {};
  4742.       each$1(parts, function (part) {
  4743.         asNamedPart(part).each(function (np) {
  4744.           var g = doGenerateOne(owner, np.pname);
  4745.           r[np.name] = function (config) {
  4746.             var validated = asRawOrDie$1('Part: ' + np.name + ' in ' + owner, objOf(np.schema), config);
  4747.             return __assign(__assign({}, g), {
  4748.               config: config,
  4749.               validated: validated
  4750.             });
  4751.           };
  4752.         });
  4753.       });
  4754.       return r;
  4755.     };
  4756.     var doGenerateOne = function (owner, pname) {
  4757.       return {
  4758.         uiType: placeholder(),
  4759.         owner: owner,
  4760.         name: pname
  4761.       };
  4762.     };
  4763.     var generateOne = function (owner, pname, config) {
  4764.       return {
  4765.         uiType: placeholder(),
  4766.         owner: owner,
  4767.         name: pname,
  4768.         config: config,
  4769.         validated: {}
  4770.       };
  4771.     };
  4772.     var schemas = function (parts) {
  4773.       return bind$3(parts, function (part) {
  4774.         return part.fold(Optional.none, Optional.some, Optional.none, Optional.none).map(function (data) {
  4775.           return requiredObjOf(data.name, data.schema.concat([snapshot(original())]));
  4776.         }).toArray();
  4777.       });
  4778.     };
  4779.     var names = function (parts) {
  4780.       return map$2(parts, name);
  4781.     };
  4782.     var substitutes = function (owner, detail, parts) {
  4783.       return subs(owner, detail, parts);
  4784.     };
  4785.     var components = function (owner, detail, internals) {
  4786.       return substitutePlaces(Optional.some(owner), detail, detail.components, internals);
  4787.     };
  4788.     var getPart = function (component, detail, partKey) {
  4789.       var uid = detail.partUids[partKey];
  4790.       return component.getSystem().getByUid(uid).toOptional();
  4791.     };
  4792.     var getPartOrDie = function (component, detail, partKey) {
  4793.       return getPart(component, detail, partKey).getOrDie('Could not find part: ' + partKey);
  4794.     };
  4795.     var getAllParts = function (component, detail) {
  4796.       var system = component.getSystem();
  4797.       return map$1(detail.partUids, function (pUid, _k) {
  4798.         return constant$1(system.getByUid(pUid));
  4799.       });
  4800.     };
  4801.     var defaultUids = function (baseUid, partTypes) {
  4802.       var partNames = names(partTypes);
  4803.       return wrapAll(map$2(partNames, function (pn) {
  4804.         return {
  4805.           key: pn,
  4806.           value: baseUid + '-' + pn
  4807.         };
  4808.       }));
  4809.     };
  4810.     var defaultUidsSchema = function (partTypes) {
  4811.       return field$2('partUids', 'partUids', mergeWithThunk(function (spec) {
  4812.         return defaultUids(spec.uid, partTypes);
  4813.       }), anyValue());
  4814.     };
  4815.  
  4816.     var premadeTag = generate$4('alloy-premade');
  4817.     var premade$1 = function (comp) {
  4818.       return wrap(premadeTag, comp);
  4819.     };
  4820.     var getPremade = function (spec) {
  4821.       return get$c(spec, premadeTag);
  4822.     };
  4823.     var makeApi = function (f) {
  4824.       return markAsSketchApi(function (component) {
  4825.         var rest = [];
  4826.         for (var _i = 1; _i < arguments.length; _i++) {
  4827.           rest[_i - 1] = arguments[_i];
  4828.         }
  4829.         return f.apply(void 0, __spreadArray([
  4830.           component.getApis(),
  4831.           component
  4832.         ], rest, false));
  4833.       }, f);
  4834.     };
  4835.  
  4836.     var prefix$1 = constant$1('alloy-id-');
  4837.     var idAttr$1 = constant$1('data-alloy-id');
  4838.  
  4839.     var prefix = prefix$1();
  4840.     var idAttr = idAttr$1();
  4841.     var write = function (label, elem) {
  4842.       var id = generate$4(prefix + label);
  4843.       writeOnly(elem, id);
  4844.       return id;
  4845.     };
  4846.     var writeOnly = function (elem, uid) {
  4847.       Object.defineProperty(elem.dom, idAttr, {
  4848.         value: uid,
  4849.         writable: true
  4850.       });
  4851.     };
  4852.     var read = function (elem) {
  4853.       var id = isElement(elem) ? elem.dom[idAttr] : null;
  4854.       return Optional.from(id);
  4855.     };
  4856.     var generate$2 = function (prefix) {
  4857.       return generate$4(prefix);
  4858.     };
  4859.  
  4860.     var base = function (partSchemas, partUidsSchemas) {
  4861.       var ps = partSchemas.length > 0 ? [requiredObjOf('parts', partSchemas)] : [];
  4862.       return ps.concat([
  4863.         required$1('uid'),
  4864.         defaulted('dom', {}),
  4865.         defaulted('components', []),
  4866.         snapshot('originalSpec'),
  4867.         defaulted('debug.sketcher', {})
  4868.       ]).concat(partUidsSchemas);
  4869.     };
  4870.     var asRawOrDie = function (label, schema, spec, partSchemas, partUidsSchemas) {
  4871.       var baseS = base(partSchemas, partUidsSchemas);
  4872.       return asRawOrDie$1(label + ' [SpecSchema]', objOfOnly(baseS.concat(schema)), spec);
  4873.     };
  4874.  
  4875.     var single$1 = function (owner, schema, factory, spec) {
  4876.       var specWithUid = supplyUid(spec);
  4877.       var detail = asRawOrDie(owner, schema, specWithUid, [], []);
  4878.       return factory(detail, specWithUid);
  4879.     };
  4880.     var composite$1 = function (owner, schema, partTypes, factory, spec) {
  4881.       var specWithUid = supplyUid(spec);
  4882.       var partSchemas = schemas(partTypes);
  4883.       var partUidsSchema = defaultUidsSchema(partTypes);
  4884.       var detail = asRawOrDie(owner, schema, specWithUid, partSchemas, [partUidsSchema]);
  4885.       var subs = substitutes(owner, detail, partTypes);
  4886.       var components$1 = components(owner, detail, subs.internals());
  4887.       return factory(detail, components$1, specWithUid, subs.externals());
  4888.     };
  4889.     var hasUid = function (spec) {
  4890.       return has$2(spec, 'uid');
  4891.     };
  4892.     var supplyUid = function (spec) {
  4893.       return hasUid(spec) ? spec : __assign(__assign({}, spec), { uid: generate$2('uid') });
  4894.     };
  4895.  
  4896.     var isSketchSpec$1 = function (spec) {
  4897.       return spec.uid !== undefined;
  4898.     };
  4899.     var singleSchema = objOfOnly([
  4900.       required$1('name'),
  4901.       required$1('factory'),
  4902.       required$1('configFields'),
  4903.       defaulted('apis', {}),
  4904.       defaulted('extraApis', {})
  4905.     ]);
  4906.     var compositeSchema = objOfOnly([
  4907.       required$1('name'),
  4908.       required$1('factory'),
  4909.       required$1('configFields'),
  4910.       required$1('partFields'),
  4911.       defaulted('apis', {}),
  4912.       defaulted('extraApis', {})
  4913.     ]);
  4914.     var single = function (rawConfig) {
  4915.       var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, singleSchema, rawConfig);
  4916.       var sketch = function (spec) {
  4917.         return single$1(config.name, config.configFields, config.factory, spec);
  4918.       };
  4919.       var apis = map$1(config.apis, makeApi);
  4920.       var extraApis = map$1(config.extraApis, function (f, k) {
  4921.         return markAsExtraApi(f, k);
  4922.       });
  4923.       return __assign(__assign({
  4924.         name: config.name,
  4925.         configFields: config.configFields,
  4926.         sketch: sketch
  4927.       }, apis), extraApis);
  4928.     };
  4929.     var composite = function (rawConfig) {
  4930.       var config = asRawOrDie$1('Sketcher for ' + rawConfig.name, compositeSchema, rawConfig);
  4931.       var sketch = function (spec) {
  4932.         return composite$1(config.name, config.configFields, config.partFields, config.factory, spec);
  4933.       };
  4934.       var parts = generate$3(config.name, config.partFields);
  4935.       var apis = map$1(config.apis, makeApi);
  4936.       var extraApis = map$1(config.extraApis, function (f, k) {
  4937.         return markAsExtraApi(f, k);
  4938.       });
  4939.       return __assign(__assign({
  4940.         name: config.name,
  4941.         partFields: config.partFields,
  4942.         configFields: config.configFields,
  4943.         sketch: sketch,
  4944.         parts: parts
  4945.       }, apis), extraApis);
  4946.     };
  4947.  
  4948.     var factory$5 = function (detail) {
  4949.       var events = events$8(detail.action);
  4950.       var tag = detail.dom.tag;
  4951.       var lookupAttr = function (attr) {
  4952.         return get$c(detail.dom, 'attributes').bind(function (attrs) {
  4953.           return get$c(attrs, attr);
  4954.         });
  4955.       };
  4956.       var getModAttributes = function () {
  4957.         if (tag === 'button') {
  4958.           var type = lookupAttr('type').getOr('button');
  4959.           var roleAttrs = lookupAttr('role').map(function (role) {
  4960.             return { role: role };
  4961.           }).getOr({});
  4962.           return __assign({ type: type }, roleAttrs);
  4963.         } else {
  4964.           var role = lookupAttr('role').getOr('button');
  4965.           return { role: role };
  4966.         }
  4967.       };
  4968.       return {
  4969.         uid: detail.uid,
  4970.         dom: detail.dom,
  4971.         components: detail.components,
  4972.         events: events,
  4973.         behaviours: SketchBehaviours.augment(detail.buttonBehaviours, [
  4974.           Focusing.config({}),
  4975.           Keying.config({
  4976.             mode: 'execution',
  4977.             useSpace: true,
  4978.             useEnter: true
  4979.           })
  4980.         ]),
  4981.         domModification: { attributes: getModAttributes() },
  4982.         eventOrder: detail.eventOrder
  4983.       };
  4984.     };
  4985.     var Button = single({
  4986.       name: 'Button',
  4987.       factory: factory$5,
  4988.       configFields: [
  4989.         defaulted('uid', undefined),
  4990.         required$1('dom'),
  4991.         defaulted('components', []),
  4992.         SketchBehaviours.field('buttonBehaviours', [
  4993.           Focusing,
  4994.           Keying
  4995.         ]),
  4996.         option('action'),
  4997.         option('role'),
  4998.         defaulted('eventOrder', {})
  4999.       ]
  5000.     });
  5001.  
  5002.     var exhibit$3 = function () {
  5003.       return nu$3({
  5004.         styles: {
  5005.           '-webkit-user-select': 'none',
  5006.           'user-select': 'none',
  5007.           '-ms-user-select': 'none',
  5008.           '-moz-user-select': '-moz-none'
  5009.         },
  5010.         attributes: { unselectable: 'on' }
  5011.       });
  5012.     };
  5013.     var events$6 = function () {
  5014.       return derive$3([abort(selectstart(), always)]);
  5015.     };
  5016.  
  5017.     var ActiveUnselecting = /*#__PURE__*/Object.freeze({
  5018.         __proto__: null,
  5019.         events: events$6,
  5020.         exhibit: exhibit$3
  5021.     });
  5022.  
  5023.     var Unselecting = create$5({
  5024.       fields: [],
  5025.       name: 'unselecting',
  5026.       active: ActiveUnselecting
  5027.     });
  5028.  
  5029.     var getAttrs$1 = function (elem) {
  5030.       var attributes = elem.dom.attributes !== undefined ? elem.dom.attributes : [];
  5031.       return foldl(attributes, function (b, attr) {
  5032.         var _a;
  5033.         if (attr.name === 'class') {
  5034.           return b;
  5035.         } else {
  5036.           return __assign(__assign({}, b), (_a = {}, _a[attr.name] = attr.value, _a));
  5037.         }
  5038.       }, {});
  5039.     };
  5040.     var getClasses = function (elem) {
  5041.       return Array.prototype.slice.call(elem.dom.classList, 0);
  5042.     };
  5043.     var fromHtml = function (html) {
  5044.       var elem = SugarElement.fromHtml(html);
  5045.       var children$1 = children(elem);
  5046.       var attrs = getAttrs$1(elem);
  5047.       var classes = getClasses(elem);
  5048.       var contents = children$1.length === 0 ? {} : { innerHtml: get$9(elem) };
  5049.       return __assign({
  5050.         tag: name$1(elem),
  5051.         classes: classes,
  5052.         attributes: attrs
  5053.       }, contents);
  5054.     };
  5055.  
  5056.     var dom$1 = function (rawHtml) {
  5057.       var html = supplant(rawHtml, { prefix: prefix$2 });
  5058.       return fromHtml(html);
  5059.     };
  5060.     var spec = function (rawHtml) {
  5061.       return { dom: dom$1(rawHtml) };
  5062.     };
  5063.  
  5064.     var forToolbarCommand = function (editor, command) {
  5065.       return forToolbar(command, function () {
  5066.         editor.execCommand(command);
  5067.       }, {}, editor);
  5068.     };
  5069.     var getToggleBehaviours = function (command) {
  5070.       return derive$2([
  5071.         Toggling.config({
  5072.           toggleClass: resolve('toolbar-button-selected'),
  5073.           toggleOnExecute: false,
  5074.           aria: { mode: 'pressed' }
  5075.         }),
  5076.         format(command, function (button, status) {
  5077.           var toggle = status ? Toggling.on : Toggling.off;
  5078.           toggle(button);
  5079.         })
  5080.       ]);
  5081.     };
  5082.     var forToolbarStateCommand = function (editor, command) {
  5083.       var extraBehaviours = getToggleBehaviours(command);
  5084.       return forToolbar(command, function () {
  5085.         editor.execCommand(command);
  5086.       }, extraBehaviours, editor);
  5087.     };
  5088.     var forToolbarStateAction = function (editor, clazz, command, action) {
  5089.       var extraBehaviours = getToggleBehaviours(command);
  5090.       return forToolbar(clazz, action, extraBehaviours, editor);
  5091.     };
  5092.     var getToolbarIconButton = function (clazz, editor) {
  5093.       var icons = editor.ui.registry.getAll().icons;
  5094.       var optOxideIcon = Optional.from(icons[clazz]);
  5095.       return optOxideIcon.fold(function () {
  5096.         return dom$1('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item ${prefix}-icon-' + clazz + ' ${prefix}-icon"></span>');
  5097.       }, function (icon) {
  5098.         return dom$1('<span class="${prefix}-toolbar-button ${prefix}-toolbar-group-item">' + icon + '</span>');
  5099.       });
  5100.     };
  5101.     var forToolbar = function (clazz, action, extraBehaviours, editor) {
  5102.       return Button.sketch({
  5103.         dom: getToolbarIconButton(clazz, editor),
  5104.         action: action,
  5105.         buttonBehaviours: deepMerge(derive$2([Unselecting.config({})]), extraBehaviours)
  5106.       });
  5107.     };
  5108.  
  5109.     var labelPart = optional({
  5110.       schema: [required$1('dom')],
  5111.       name: 'label'
  5112.     });
  5113.     var edgePart = function (name) {
  5114.       return optional({
  5115.         name: '' + name + '-edge',
  5116.         overrides: function (detail) {
  5117.           var action = detail.model.manager.edgeActions[name];
  5118.           return action.fold(function () {
  5119.             return {};
  5120.           }, function (a) {
  5121.             return {
  5122.               events: derive$3([
  5123.                 runActionExtra(touchstart(), function (comp, se, d) {
  5124.                   return a(comp, d);
  5125.                 }, [detail]),
  5126.                 runActionExtra(mousedown(), function (comp, se, d) {
  5127.                   return a(comp, d);
  5128.                 }, [detail]),
  5129.                 runActionExtra(mousemove(), function (comp, se, det) {
  5130.                   if (det.mouseIsDown.get()) {
  5131.                     a(comp, det);
  5132.                   }
  5133.                 }, [detail])
  5134.               ])
  5135.             };
  5136.           });
  5137.         }
  5138.       });
  5139.     };
  5140.     var tlEdgePart = edgePart('top-left');
  5141.     var tedgePart = edgePart('top');
  5142.     var trEdgePart = edgePart('top-right');
  5143.     var redgePart = edgePart('right');
  5144.     var brEdgePart = edgePart('bottom-right');
  5145.     var bedgePart = edgePart('bottom');
  5146.     var blEdgePart = edgePart('bottom-left');
  5147.     var ledgePart = edgePart('left');
  5148.     var thumbPart = required({
  5149.       name: 'thumb',
  5150.       defaults: constant$1({ dom: { styles: { position: 'absolute' } } }),
  5151.       overrides: function (detail) {
  5152.         return {
  5153.           events: derive$3([
  5154.             redirectToPart(touchstart(), detail, 'spectrum'),
  5155.             redirectToPart(touchmove(), detail, 'spectrum'),
  5156.             redirectToPart(touchend(), detail, 'spectrum'),
  5157.             redirectToPart(mousedown(), detail, 'spectrum'),
  5158.             redirectToPart(mousemove(), detail, 'spectrum'),
  5159.             redirectToPart(mouseup(), detail, 'spectrum')
  5160.           ])
  5161.         };
  5162.       }
  5163.     });
  5164.     var spectrumPart = required({
  5165.       schema: [customField('mouseIsDown', function () {
  5166.           return Cell(false);
  5167.         })],
  5168.       name: 'spectrum',
  5169.       overrides: function (detail) {
  5170.         var modelDetail = detail.model;
  5171.         var model = modelDetail.manager;
  5172.         var setValueFrom = function (component, simulatedEvent) {
  5173.           return model.getValueFromEvent(simulatedEvent).map(function (value) {
  5174.             return model.setValueFrom(component, detail, value);
  5175.           });
  5176.         };
  5177.         return {
  5178.           behaviours: derive$2([
  5179.             Keying.config({
  5180.               mode: 'special',
  5181.               onLeft: function (spectrum) {
  5182.                 return model.onLeft(spectrum, detail);
  5183.               },
  5184.               onRight: function (spectrum) {
  5185.                 return model.onRight(spectrum, detail);
  5186.               },
  5187.               onUp: function (spectrum) {
  5188.                 return model.onUp(spectrum, detail);
  5189.               },
  5190.               onDown: function (spectrum) {
  5191.                 return model.onDown(spectrum, detail);
  5192.               }
  5193.             }),
  5194.             Focusing.config({})
  5195.           ]),
  5196.           events: derive$3([
  5197.             run(touchstart(), setValueFrom),
  5198.             run(touchmove(), setValueFrom),
  5199.             run(mousedown(), setValueFrom),
  5200.             run(mousemove(), function (spectrum, se) {
  5201.               if (detail.mouseIsDown.get()) {
  5202.                 setValueFrom(spectrum, se);
  5203.               }
  5204.             })
  5205.           ])
  5206.         };
  5207.       }
  5208.     });
  5209.     var SliderParts = [
  5210.       labelPart,
  5211.       ledgePart,
  5212.       redgePart,
  5213.       tedgePart,
  5214.       bedgePart,
  5215.       tlEdgePart,
  5216.       trEdgePart,
  5217.       blEdgePart,
  5218.       brEdgePart,
  5219.       thumbPart,
  5220.       spectrumPart
  5221.     ];
  5222.  
  5223.     var onLoad$4 = function (component, repConfig, repState) {
  5224.       repConfig.store.manager.onLoad(component, repConfig, repState);
  5225.     };
  5226.     var onUnload$2 = function (component, repConfig, repState) {
  5227.       repConfig.store.manager.onUnload(component, repConfig, repState);
  5228.     };
  5229.     var setValue$3 = function (component, repConfig, repState, data) {
  5230.       repConfig.store.manager.setValue(component, repConfig, repState, data);
  5231.     };
  5232.     var getValue$4 = function (component, repConfig, repState) {
  5233.       return repConfig.store.manager.getValue(component, repConfig, repState);
  5234.     };
  5235.     var getState$1 = function (component, repConfig, repState) {
  5236.       return repState;
  5237.     };
  5238.  
  5239.     var RepresentApis = /*#__PURE__*/Object.freeze({
  5240.         __proto__: null,
  5241.         onLoad: onLoad$4,
  5242.         onUnload: onUnload$2,
  5243.         setValue: setValue$3,
  5244.         getValue: getValue$4,
  5245.         getState: getState$1
  5246.     });
  5247.  
  5248.     var events$5 = function (repConfig, repState) {
  5249.       var es = repConfig.resetOnDom ? [
  5250.         runOnAttached(function (comp, _se) {
  5251.           onLoad$4(comp, repConfig, repState);
  5252.         }),
  5253.         runOnDetached(function (comp, _se) {
  5254.           onUnload$2(comp, repConfig, repState);
  5255.         })
  5256.       ] : [loadEvent(repConfig, repState, onLoad$4)];
  5257.       return derive$3(es);
  5258.     };
  5259.  
  5260.     var ActiveRepresenting = /*#__PURE__*/Object.freeze({
  5261.         __proto__: null,
  5262.         events: events$5
  5263.     });
  5264.  
  5265.     var memory = function () {
  5266.       var data = Cell(null);
  5267.       var readState = function () {
  5268.         return {
  5269.           mode: 'memory',
  5270.           value: data.get()
  5271.         };
  5272.       };
  5273.       var isNotSet = function () {
  5274.         return data.get() === null;
  5275.       };
  5276.       var clear = function () {
  5277.         data.set(null);
  5278.       };
  5279.       return nu$2({
  5280.         set: data.set,
  5281.         get: data.get,
  5282.         isNotSet: isNotSet,
  5283.         clear: clear,
  5284.         readState: readState
  5285.       });
  5286.     };
  5287.     var manual = function () {
  5288.       var readState = noop;
  5289.       return nu$2({ readState: readState });
  5290.     };
  5291.     var dataset = function () {
  5292.       var dataByValue = Cell({});
  5293.       var dataByText = Cell({});
  5294.       var readState = function () {
  5295.         return {
  5296.           mode: 'dataset',
  5297.           dataByValue: dataByValue.get(),
  5298.           dataByText: dataByText.get()
  5299.         };
  5300.       };
  5301.       var clear = function () {
  5302.         dataByValue.set({});
  5303.         dataByText.set({});
  5304.       };
  5305.       var lookup = function (itemString) {
  5306.         return get$c(dataByValue.get(), itemString).orThunk(function () {
  5307.           return get$c(dataByText.get(), itemString);
  5308.         });
  5309.       };
  5310.       var update = function (items) {
  5311.         var currentDataByValue = dataByValue.get();
  5312.         var currentDataByText = dataByText.get();
  5313.         var newDataByValue = {};
  5314.         var newDataByText = {};
  5315.         each$1(items, function (item) {
  5316.           newDataByValue[item.value] = item;
  5317.           get$c(item, 'meta').each(function (meta) {
  5318.             get$c(meta, 'text').each(function (text) {
  5319.               newDataByText[text] = item;
  5320.             });
  5321.           });
  5322.         });
  5323.         dataByValue.set(__assign(__assign({}, currentDataByValue), newDataByValue));
  5324.         dataByText.set(__assign(__assign({}, currentDataByText), newDataByText));
  5325.       };
  5326.       return nu$2({
  5327.         readState: readState,
  5328.         lookup: lookup,
  5329.         update: update,
  5330.         clear: clear
  5331.       });
  5332.     };
  5333.     var init$4 = function (spec) {
  5334.       return spec.store.manager.state(spec);
  5335.     };
  5336.  
  5337.     var RepresentState = /*#__PURE__*/Object.freeze({
  5338.         __proto__: null,
  5339.         memory: memory,
  5340.         dataset: dataset,
  5341.         manual: manual,
  5342.         init: init$4
  5343.     });
  5344.  
  5345.     var setValue$2 = function (component, repConfig, repState, data) {
  5346.       var store = repConfig.store;
  5347.       repState.update([data]);
  5348.       store.setValue(component, data);
  5349.       repConfig.onSetValue(component, data);
  5350.     };
  5351.     var getValue$3 = function (component, repConfig, repState) {
  5352.       var store = repConfig.store;
  5353.       var key = store.getDataKey(component);
  5354.       return repState.lookup(key).getOrThunk(function () {
  5355.         return store.getFallbackEntry(key);
  5356.       });
  5357.     };
  5358.     var onLoad$3 = function (component, repConfig, repState) {
  5359.       var store = repConfig.store;
  5360.       store.initialValue.each(function (data) {
  5361.         setValue$2(component, repConfig, repState, data);
  5362.       });
  5363.     };
  5364.     var onUnload$1 = function (component, repConfig, repState) {
  5365.       repState.clear();
  5366.     };
  5367.     var DatasetStore = [
  5368.       option('initialValue'),
  5369.       required$1('getFallbackEntry'),
  5370.       required$1('getDataKey'),
  5371.       required$1('setValue'),
  5372.       output('manager', {
  5373.         setValue: setValue$2,
  5374.         getValue: getValue$3,
  5375.         onLoad: onLoad$3,
  5376.         onUnload: onUnload$1,
  5377.         state: dataset
  5378.       })
  5379.     ];
  5380.  
  5381.     var getValue$2 = function (component, repConfig, _repState) {
  5382.       return repConfig.store.getValue(component);
  5383.     };
  5384.     var setValue$1 = function (component, repConfig, _repState, data) {
  5385.       repConfig.store.setValue(component, data);
  5386.       repConfig.onSetValue(component, data);
  5387.     };
  5388.     var onLoad$2 = function (component, repConfig, _repState) {
  5389.       repConfig.store.initialValue.each(function (data) {
  5390.         repConfig.store.setValue(component, data);
  5391.       });
  5392.     };
  5393.     var ManualStore = [
  5394.       required$1('getValue'),
  5395.       defaulted('setValue', noop),
  5396.       option('initialValue'),
  5397.       output('manager', {
  5398.         setValue: setValue$1,
  5399.         getValue: getValue$2,
  5400.         onLoad: onLoad$2,
  5401.         onUnload: noop,
  5402.         state: NoState.init
  5403.       })
  5404.     ];
  5405.  
  5406.     var setValue = function (component, repConfig, repState, data) {
  5407.       repState.set(data);
  5408.       repConfig.onSetValue(component, data);
  5409.     };
  5410.     var getValue$1 = function (component, repConfig, repState) {
  5411.       return repState.get();
  5412.     };
  5413.     var onLoad$1 = function (component, repConfig, repState) {
  5414.       repConfig.store.initialValue.each(function (initVal) {
  5415.         if (repState.isNotSet()) {
  5416.           repState.set(initVal);
  5417.         }
  5418.       });
  5419.     };
  5420.     var onUnload = function (component, repConfig, repState) {
  5421.       repState.clear();
  5422.     };
  5423.     var MemoryStore = [
  5424.       option('initialValue'),
  5425.       output('manager', {
  5426.         setValue: setValue,
  5427.         getValue: getValue$1,
  5428.         onLoad: onLoad$1,
  5429.         onUnload: onUnload,
  5430.         state: memory
  5431.       })
  5432.     ];
  5433.  
  5434.     var RepresentSchema = [
  5435.       defaultedOf('store', { mode: 'memory' }, choose$1('mode', {
  5436.         memory: MemoryStore,
  5437.         manual: ManualStore,
  5438.         dataset: DatasetStore
  5439.       })),
  5440.       onHandler('onSetValue'),
  5441.       defaulted('resetOnDom', false)
  5442.     ];
  5443.  
  5444.     var Representing = create$5({
  5445.       fields: RepresentSchema,
  5446.       name: 'representing',
  5447.       active: ActiveRepresenting,
  5448.       apis: RepresentApis,
  5449.       extra: {
  5450.         setValueFrom: function (component, source) {
  5451.           var value = Representing.getValue(source);
  5452.           Representing.setValue(component, value);
  5453.         }
  5454.       },
  5455.       state: RepresentState
  5456.     });
  5457.  
  5458.     var api$1 = Dimension('width', function (element) {
  5459.       return element.dom.offsetWidth;
  5460.     });
  5461.     var set$4 = function (element, h) {
  5462.       return api$1.set(element, h);
  5463.     };
  5464.     var get$5 = function (element) {
  5465.       return api$1.get(element);
  5466.     };
  5467.  
  5468.     var r$1 = function (left, top) {
  5469.       var translate = function (x, y) {
  5470.         return r$1(left + x, top + y);
  5471.       };
  5472.       return {
  5473.         left: left,
  5474.         top: top,
  5475.         translate: translate
  5476.       };
  5477.     };
  5478.     var SugarPosition = r$1;
  5479.  
  5480.     var _sliderChangeEvent = 'slider.change.value';
  5481.     var sliderChangeEvent = constant$1(_sliderChangeEvent);
  5482.     var isTouchEvent = function (evt) {
  5483.       return evt.type.indexOf('touch') !== -1;
  5484.     };
  5485.     var getEventSource = function (simulatedEvent) {
  5486.       var evt = simulatedEvent.event.raw;
  5487.       if (isTouchEvent(evt)) {
  5488.         var touchEvent = evt;
  5489.         return touchEvent.touches !== undefined && touchEvent.touches.length === 1 ? Optional.some(touchEvent.touches[0]).map(function (t) {
  5490.           return SugarPosition(t.clientX, t.clientY);
  5491.         }) : Optional.none();
  5492.       } else {
  5493.         var mouseEvent = evt;
  5494.         return mouseEvent.clientX !== undefined ? Optional.some(mouseEvent).map(function (me) {
  5495.           return SugarPosition(me.clientX, me.clientY);
  5496.         }) : Optional.none();
  5497.       }
  5498.     };
  5499.  
  5500.     var t = 'top', r = 'right', b = 'bottom', l = 'left';
  5501.     var minX = function (detail) {
  5502.       return detail.model.minX;
  5503.     };
  5504.     var minY = function (detail) {
  5505.       return detail.model.minY;
  5506.     };
  5507.     var min1X = function (detail) {
  5508.       return detail.model.minX - 1;
  5509.     };
  5510.     var min1Y = function (detail) {
  5511.       return detail.model.minY - 1;
  5512.     };
  5513.     var maxX = function (detail) {
  5514.       return detail.model.maxX;
  5515.     };
  5516.     var maxY = function (detail) {
  5517.       return detail.model.maxY;
  5518.     };
  5519.     var max1X = function (detail) {
  5520.       return detail.model.maxX + 1;
  5521.     };
  5522.     var max1Y = function (detail) {
  5523.       return detail.model.maxY + 1;
  5524.     };
  5525.     var range$1 = function (detail, max, min) {
  5526.       return max(detail) - min(detail);
  5527.     };
  5528.     var xRange = function (detail) {
  5529.       return range$1(detail, maxX, minX);
  5530.     };
  5531.     var yRange = function (detail) {
  5532.       return range$1(detail, maxY, minY);
  5533.     };
  5534.     var halfX = function (detail) {
  5535.       return xRange(detail) / 2;
  5536.     };
  5537.     var halfY = function (detail) {
  5538.       return yRange(detail) / 2;
  5539.     };
  5540.     var step = function (detail) {
  5541.       return detail.stepSize;
  5542.     };
  5543.     var snap = function (detail) {
  5544.       return detail.snapToGrid;
  5545.     };
  5546.     var snapStart = function (detail) {
  5547.       return detail.snapStart;
  5548.     };
  5549.     var rounded = function (detail) {
  5550.       return detail.rounded;
  5551.     };
  5552.     var hasEdge = function (detail, edgeName) {
  5553.       return detail[edgeName + '-edge'] !== undefined;
  5554.     };
  5555.     var hasLEdge = function (detail) {
  5556.       return hasEdge(detail, l);
  5557.     };
  5558.     var hasREdge = function (detail) {
  5559.       return hasEdge(detail, r);
  5560.     };
  5561.     var hasTEdge = function (detail) {
  5562.       return hasEdge(detail, t);
  5563.     };
  5564.     var hasBEdge = function (detail) {
  5565.       return hasEdge(detail, b);
  5566.     };
  5567.     var currentValue = function (detail) {
  5568.       return detail.model.value.get();
  5569.     };
  5570.  
  5571.     var xValue = function (x) {
  5572.       return { x: x };
  5573.     };
  5574.     var yValue = function (y) {
  5575.       return { y: y };
  5576.     };
  5577.     var xyValue = function (x, y) {
  5578.       return {
  5579.         x: x,
  5580.         y: y
  5581.       };
  5582.     };
  5583.     var fireSliderChange$3 = function (component, value) {
  5584.       emitWith(component, sliderChangeEvent(), { value: value });
  5585.     };
  5586.     var setToTLEdgeXY = function (edge, detail) {
  5587.       fireSliderChange$3(edge, xyValue(min1X(detail), min1Y(detail)));
  5588.     };
  5589.     var setToTEdge = function (edge, detail) {
  5590.       fireSliderChange$3(edge, yValue(min1Y(detail)));
  5591.     };
  5592.     var setToTEdgeXY = function (edge, detail) {
  5593.       fireSliderChange$3(edge, xyValue(halfX(detail), min1Y(detail)));
  5594.     };
  5595.     var setToTREdgeXY = function (edge, detail) {
  5596.       fireSliderChange$3(edge, xyValue(max1X(detail), min1Y(detail)));
  5597.     };
  5598.     var setToREdge = function (edge, detail) {
  5599.       fireSliderChange$3(edge, xValue(max1X(detail)));
  5600.     };
  5601.     var setToREdgeXY = function (edge, detail) {
  5602.       fireSliderChange$3(edge, xyValue(max1X(detail), halfY(detail)));
  5603.     };
  5604.     var setToBREdgeXY = function (edge, detail) {
  5605.       fireSliderChange$3(edge, xyValue(max1X(detail), max1Y(detail)));
  5606.     };
  5607.     var setToBEdge = function (edge, detail) {
  5608.       fireSliderChange$3(edge, yValue(max1Y(detail)));
  5609.     };
  5610.     var setToBEdgeXY = function (edge, detail) {
  5611.       fireSliderChange$3(edge, xyValue(halfX(detail), max1Y(detail)));
  5612.     };
  5613.     var setToBLEdgeXY = function (edge, detail) {
  5614.       fireSliderChange$3(edge, xyValue(min1X(detail), max1Y(detail)));
  5615.     };
  5616.     var setToLEdge = function (edge, detail) {
  5617.       fireSliderChange$3(edge, xValue(min1X(detail)));
  5618.     };
  5619.     var setToLEdgeXY = function (edge, detail) {
  5620.       fireSliderChange$3(edge, xyValue(min1X(detail), halfY(detail)));
  5621.     };
  5622.  
  5623.     var reduceBy = function (value, min, max, step) {
  5624.       if (value < min) {
  5625.         return value;
  5626.       } else if (value > max) {
  5627.         return max;
  5628.       } else if (value === min) {
  5629.         return min - 1;
  5630.       } else {
  5631.         return Math.max(min, value - step);
  5632.       }
  5633.     };
  5634.     var increaseBy = function (value, min, max, step) {
  5635.       if (value > max) {
  5636.         return value;
  5637.       } else if (value < min) {
  5638.         return min;
  5639.       } else if (value === max) {
  5640.         return max + 1;
  5641.       } else {
  5642.         return Math.min(max, value + step);
  5643.       }
  5644.     };
  5645.     var capValue = function (value, min, max) {
  5646.       return Math.max(min, Math.min(max, value));
  5647.     };
  5648.     var snapValueOf = function (value, min, max, step, snapStart) {
  5649.       return snapStart.fold(function () {
  5650.         var initValue = value - min;
  5651.         var extraValue = Math.round(initValue / step) * step;
  5652.         return capValue(min + extraValue, min - 1, max + 1);
  5653.       }, function (start) {
  5654.         var remainder = (value - start) % step;
  5655.         var adjustment = Math.round(remainder / step);
  5656.         var rawSteps = Math.floor((value - start) / step);
  5657.         var maxSteps = Math.floor((max - start) / step);
  5658.         var numSteps = Math.min(maxSteps, rawSteps + adjustment);
  5659.         var r = start + numSteps * step;
  5660.         return Math.max(start, r);
  5661.       });
  5662.     };
  5663.     var findOffsetOf = function (value, min, max) {
  5664.       return Math.min(max, Math.max(value, min)) - min;
  5665.     };
  5666.     var findValueOf = function (args) {
  5667.       var min = args.min, max = args.max, range = args.range, value = args.value, step = args.step, snap = args.snap, snapStart = args.snapStart, rounded = args.rounded, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, minBound = args.minBound, maxBound = args.maxBound, screenRange = args.screenRange;
  5668.       var capMin = hasMinEdge ? min - 1 : min;
  5669.       var capMax = hasMaxEdge ? max + 1 : max;
  5670.       if (value < minBound) {
  5671.         return capMin;
  5672.       } else if (value > maxBound) {
  5673.         return capMax;
  5674.       } else {
  5675.         var offset = findOffsetOf(value, minBound, maxBound);
  5676.         var newValue = capValue(offset / screenRange * range + min, capMin, capMax);
  5677.         if (snap && newValue >= min && newValue <= max) {
  5678.           return snapValueOf(newValue, min, max, step, snapStart);
  5679.         } else if (rounded) {
  5680.           return Math.round(newValue);
  5681.         } else {
  5682.           return newValue;
  5683.         }
  5684.       }
  5685.     };
  5686.     var findOffsetOfValue$2 = function (args) {
  5687.       var min = args.min, max = args.max, range = args.range, value = args.value, hasMinEdge = args.hasMinEdge, hasMaxEdge = args.hasMaxEdge, maxBound = args.maxBound, maxOffset = args.maxOffset, centerMinEdge = args.centerMinEdge, centerMaxEdge = args.centerMaxEdge;
  5688.       if (value < min) {
  5689.         return hasMinEdge ? 0 : centerMinEdge;
  5690.       } else if (value > max) {
  5691.         return hasMaxEdge ? maxBound : centerMaxEdge;
  5692.       } else {
  5693.         return (value - min) / range * maxOffset;
  5694.       }
  5695.     };
  5696.  
  5697.     var top = 'top', right = 'right', bottom = 'bottom', left = 'left', width = 'width', height = 'height';
  5698.     var getBounds$1 = function (component) {
  5699.       return component.element.dom.getBoundingClientRect();
  5700.     };
  5701.     var getBoundsProperty = function (bounds, property) {
  5702.       return bounds[property];
  5703.     };
  5704.     var getMinXBounds = function (component) {
  5705.       var bounds = getBounds$1(component);
  5706.       return getBoundsProperty(bounds, left);
  5707.     };
  5708.     var getMaxXBounds = function (component) {
  5709.       var bounds = getBounds$1(component);
  5710.       return getBoundsProperty(bounds, right);
  5711.     };
  5712.     var getMinYBounds = function (component) {
  5713.       var bounds = getBounds$1(component);
  5714.       return getBoundsProperty(bounds, top);
  5715.     };
  5716.     var getMaxYBounds = function (component) {
  5717.       var bounds = getBounds$1(component);
  5718.       return getBoundsProperty(bounds, bottom);
  5719.     };
  5720.     var getXScreenRange = function (component) {
  5721.       var bounds = getBounds$1(component);
  5722.       return getBoundsProperty(bounds, width);
  5723.     };
  5724.     var getYScreenRange = function (component) {
  5725.       var bounds = getBounds$1(component);
  5726.       return getBoundsProperty(bounds, height);
  5727.     };
  5728.     var getCenterOffsetOf = function (componentMinEdge, componentMaxEdge, spectrumMinEdge) {
  5729.       return (componentMinEdge + componentMaxEdge) / 2 - spectrumMinEdge;
  5730.     };
  5731.     var getXCenterOffSetOf = function (component, spectrum) {
  5732.       var componentBounds = getBounds$1(component);
  5733.       var spectrumBounds = getBounds$1(spectrum);
  5734.       var componentMinEdge = getBoundsProperty(componentBounds, left);
  5735.       var componentMaxEdge = getBoundsProperty(componentBounds, right);
  5736.       var spectrumMinEdge = getBoundsProperty(spectrumBounds, left);
  5737.       return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);
  5738.     };
  5739.     var getYCenterOffSetOf = function (component, spectrum) {
  5740.       var componentBounds = getBounds$1(component);
  5741.       var spectrumBounds = getBounds$1(spectrum);
  5742.       var componentMinEdge = getBoundsProperty(componentBounds, top);
  5743.       var componentMaxEdge = getBoundsProperty(componentBounds, bottom);
  5744.       var spectrumMinEdge = getBoundsProperty(spectrumBounds, top);
  5745.       return getCenterOffsetOf(componentMinEdge, componentMaxEdge, spectrumMinEdge);
  5746.     };
  5747.  
  5748.     var fireSliderChange$2 = function (spectrum, value) {
  5749.       emitWith(spectrum, sliderChangeEvent(), { value: value });
  5750.     };
  5751.     var sliderValue$2 = function (x) {
  5752.       return { x: x };
  5753.     };
  5754.     var findValueOfOffset$1 = function (spectrum, detail, left) {
  5755.       var args = {
  5756.         min: minX(detail),
  5757.         max: maxX(detail),
  5758.         range: xRange(detail),
  5759.         value: left,
  5760.         step: step(detail),
  5761.         snap: snap(detail),
  5762.         snapStart: snapStart(detail),
  5763.         rounded: rounded(detail),
  5764.         hasMinEdge: hasLEdge(detail),
  5765.         hasMaxEdge: hasREdge(detail),
  5766.         minBound: getMinXBounds(spectrum),
  5767.         maxBound: getMaxXBounds(spectrum),
  5768.         screenRange: getXScreenRange(spectrum)
  5769.       };
  5770.       return findValueOf(args);
  5771.     };
  5772.     var setValueFrom$2 = function (spectrum, detail, value) {
  5773.       var xValue = findValueOfOffset$1(spectrum, detail, value);
  5774.       var sliderVal = sliderValue$2(xValue);
  5775.       fireSliderChange$2(spectrum, sliderVal);
  5776.       return xValue;
  5777.     };
  5778.     var setToMin$2 = function (spectrum, detail) {
  5779.       var min = minX(detail);
  5780.       fireSliderChange$2(spectrum, sliderValue$2(min));
  5781.     };
  5782.     var setToMax$2 = function (spectrum, detail) {
  5783.       var max = maxX(detail);
  5784.       fireSliderChange$2(spectrum, sliderValue$2(max));
  5785.     };
  5786.     var moveBy$2 = function (direction, spectrum, detail) {
  5787.       var f = direction > 0 ? increaseBy : reduceBy;
  5788.       var xValue = f(currentValue(detail).x, minX(detail), maxX(detail), step(detail));
  5789.       fireSliderChange$2(spectrum, sliderValue$2(xValue));
  5790.       return Optional.some(xValue);
  5791.     };
  5792.     var handleMovement$2 = function (direction) {
  5793.       return function (spectrum, detail) {
  5794.         return moveBy$2(direction, spectrum, detail).map(always);
  5795.       };
  5796.     };
  5797.     var getValueFromEvent$2 = function (simulatedEvent) {
  5798.       var pos = getEventSource(simulatedEvent);
  5799.       return pos.map(function (p) {
  5800.         return p.left;
  5801.       });
  5802.     };
  5803.     var findOffsetOfValue$1 = function (spectrum, detail, value, minEdge, maxEdge) {
  5804.       var minOffset = 0;
  5805.       var maxOffset = getXScreenRange(spectrum);
  5806.       var centerMinEdge = minEdge.bind(function (edge) {
  5807.         return Optional.some(getXCenterOffSetOf(edge, spectrum));
  5808.       }).getOr(minOffset);
  5809.       var centerMaxEdge = maxEdge.bind(function (edge) {
  5810.         return Optional.some(getXCenterOffSetOf(edge, spectrum));
  5811.       }).getOr(maxOffset);
  5812.       var args = {
  5813.         min: minX(detail),
  5814.         max: maxX(detail),
  5815.         range: xRange(detail),
  5816.         value: value,
  5817.         hasMinEdge: hasLEdge(detail),
  5818.         hasMaxEdge: hasREdge(detail),
  5819.         minBound: getMinXBounds(spectrum),
  5820.         minOffset: minOffset,
  5821.         maxBound: getMaxXBounds(spectrum),
  5822.         maxOffset: maxOffset,
  5823.         centerMinEdge: centerMinEdge,
  5824.         centerMaxEdge: centerMaxEdge
  5825.       };
  5826.       return findOffsetOfValue$2(args);
  5827.     };
  5828.     var findPositionOfValue$1 = function (slider, spectrum, value, minEdge, maxEdge, detail) {
  5829.       var offset = findOffsetOfValue$1(spectrum, detail, value, minEdge, maxEdge);
  5830.       return getMinXBounds(spectrum) - getMinXBounds(slider) + offset;
  5831.     };
  5832.     var setPositionFromValue$2 = function (slider, thumb, detail, edges) {
  5833.       var value = currentValue(detail);
  5834.       var pos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);
  5835.       var thumbRadius = get$5(thumb.element) / 2;
  5836.       set$5(thumb.element, 'left', pos - thumbRadius + 'px');
  5837.     };
  5838.     var onLeft$2 = handleMovement$2(-1);
  5839.     var onRight$2 = handleMovement$2(1);
  5840.     var onUp$2 = Optional.none;
  5841.     var onDown$2 = Optional.none;
  5842.     var edgeActions$2 = {
  5843.       'top-left': Optional.none(),
  5844.       'top': Optional.none(),
  5845.       'top-right': Optional.none(),
  5846.       'right': Optional.some(setToREdge),
  5847.       'bottom-right': Optional.none(),
  5848.       'bottom': Optional.none(),
  5849.       'bottom-left': Optional.none(),
  5850.       'left': Optional.some(setToLEdge)
  5851.     };
  5852.  
  5853.     var HorizontalModel = /*#__PURE__*/Object.freeze({
  5854.         __proto__: null,
  5855.         setValueFrom: setValueFrom$2,
  5856.         setToMin: setToMin$2,
  5857.         setToMax: setToMax$2,
  5858.         findValueOfOffset: findValueOfOffset$1,
  5859.         getValueFromEvent: getValueFromEvent$2,
  5860.         findPositionOfValue: findPositionOfValue$1,
  5861.         setPositionFromValue: setPositionFromValue$2,
  5862.         onLeft: onLeft$2,
  5863.         onRight: onRight$2,
  5864.         onUp: onUp$2,
  5865.         onDown: onDown$2,
  5866.         edgeActions: edgeActions$2
  5867.     });
  5868.  
  5869.     var fireSliderChange$1 = function (spectrum, value) {
  5870.       emitWith(spectrum, sliderChangeEvent(), { value: value });
  5871.     };
  5872.     var sliderValue$1 = function (y) {
  5873.       return { y: y };
  5874.     };
  5875.     var findValueOfOffset = function (spectrum, detail, top) {
  5876.       var args = {
  5877.         min: minY(detail),
  5878.         max: maxY(detail),
  5879.         range: yRange(detail),
  5880.         value: top,
  5881.         step: step(detail),
  5882.         snap: snap(detail),
  5883.         snapStart: snapStart(detail),
  5884.         rounded: rounded(detail),
  5885.         hasMinEdge: hasTEdge(detail),
  5886.         hasMaxEdge: hasBEdge(detail),
  5887.         minBound: getMinYBounds(spectrum),
  5888.         maxBound: getMaxYBounds(spectrum),
  5889.         screenRange: getYScreenRange(spectrum)
  5890.       };
  5891.       return findValueOf(args);
  5892.     };
  5893.     var setValueFrom$1 = function (spectrum, detail, value) {
  5894.       var yValue = findValueOfOffset(spectrum, detail, value);
  5895.       var sliderVal = sliderValue$1(yValue);
  5896.       fireSliderChange$1(spectrum, sliderVal);
  5897.       return yValue;
  5898.     };
  5899.     var setToMin$1 = function (spectrum, detail) {
  5900.       var min = minY(detail);
  5901.       fireSliderChange$1(spectrum, sliderValue$1(min));
  5902.     };
  5903.     var setToMax$1 = function (spectrum, detail) {
  5904.       var max = maxY(detail);
  5905.       fireSliderChange$1(spectrum, sliderValue$1(max));
  5906.     };
  5907.     var moveBy$1 = function (direction, spectrum, detail) {
  5908.       var f = direction > 0 ? increaseBy : reduceBy;
  5909.       var yValue = f(currentValue(detail).y, minY(detail), maxY(detail), step(detail));
  5910.       fireSliderChange$1(spectrum, sliderValue$1(yValue));
  5911.       return Optional.some(yValue);
  5912.     };
  5913.     var handleMovement$1 = function (direction) {
  5914.       return function (spectrum, detail) {
  5915.         return moveBy$1(direction, spectrum, detail).map(always);
  5916.       };
  5917.     };
  5918.     var getValueFromEvent$1 = function (simulatedEvent) {
  5919.       var pos = getEventSource(simulatedEvent);
  5920.       return pos.map(function (p) {
  5921.         return p.top;
  5922.       });
  5923.     };
  5924.     var findOffsetOfValue = function (spectrum, detail, value, minEdge, maxEdge) {
  5925.       var minOffset = 0;
  5926.       var maxOffset = getYScreenRange(spectrum);
  5927.       var centerMinEdge = minEdge.bind(function (edge) {
  5928.         return Optional.some(getYCenterOffSetOf(edge, spectrum));
  5929.       }).getOr(minOffset);
  5930.       var centerMaxEdge = maxEdge.bind(function (edge) {
  5931.         return Optional.some(getYCenterOffSetOf(edge, spectrum));
  5932.       }).getOr(maxOffset);
  5933.       var args = {
  5934.         min: minY(detail),
  5935.         max: maxY(detail),
  5936.         range: yRange(detail),
  5937.         value: value,
  5938.         hasMinEdge: hasTEdge(detail),
  5939.         hasMaxEdge: hasBEdge(detail),
  5940.         minBound: getMinYBounds(spectrum),
  5941.         minOffset: minOffset,
  5942.         maxBound: getMaxYBounds(spectrum),
  5943.         maxOffset: maxOffset,
  5944.         centerMinEdge: centerMinEdge,
  5945.         centerMaxEdge: centerMaxEdge
  5946.       };
  5947.       return findOffsetOfValue$2(args);
  5948.     };
  5949.     var findPositionOfValue = function (slider, spectrum, value, minEdge, maxEdge, detail) {
  5950.       var offset = findOffsetOfValue(spectrum, detail, value, minEdge, maxEdge);
  5951.       return getMinYBounds(spectrum) - getMinYBounds(slider) + offset;
  5952.     };
  5953.     var setPositionFromValue$1 = function (slider, thumb, detail, edges) {
  5954.       var value = currentValue(detail);
  5955.       var pos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);
  5956.       var thumbRadius = get$7(thumb.element) / 2;
  5957.       set$5(thumb.element, 'top', pos - thumbRadius + 'px');
  5958.     };
  5959.     var onLeft$1 = Optional.none;
  5960.     var onRight$1 = Optional.none;
  5961.     var onUp$1 = handleMovement$1(-1);
  5962.     var onDown$1 = handleMovement$1(1);
  5963.     var edgeActions$1 = {
  5964.       'top-left': Optional.none(),
  5965.       'top': Optional.some(setToTEdge),
  5966.       'top-right': Optional.none(),
  5967.       'right': Optional.none(),
  5968.       'bottom-right': Optional.none(),
  5969.       'bottom': Optional.some(setToBEdge),
  5970.       'bottom-left': Optional.none(),
  5971.       'left': Optional.none()
  5972.     };
  5973.  
  5974.     var VerticalModel = /*#__PURE__*/Object.freeze({
  5975.         __proto__: null,
  5976.         setValueFrom: setValueFrom$1,
  5977.         setToMin: setToMin$1,
  5978.         setToMax: setToMax$1,
  5979.         findValueOfOffset: findValueOfOffset,
  5980.         getValueFromEvent: getValueFromEvent$1,
  5981.         findPositionOfValue: findPositionOfValue,
  5982.         setPositionFromValue: setPositionFromValue$1,
  5983.         onLeft: onLeft$1,
  5984.         onRight: onRight$1,
  5985.         onUp: onUp$1,
  5986.         onDown: onDown$1,
  5987.         edgeActions: edgeActions$1
  5988.     });
  5989.  
  5990.     var fireSliderChange = function (spectrum, value) {
  5991.       emitWith(spectrum, sliderChangeEvent(), { value: value });
  5992.     };
  5993.     var sliderValue = function (x, y) {
  5994.       return {
  5995.         x: x,
  5996.         y: y
  5997.       };
  5998.     };
  5999.     var setValueFrom = function (spectrum, detail, value) {
  6000.       var xValue = findValueOfOffset$1(spectrum, detail, value.left);
  6001.       var yValue = findValueOfOffset(spectrum, detail, value.top);
  6002.       var val = sliderValue(xValue, yValue);
  6003.       fireSliderChange(spectrum, val);
  6004.       return val;
  6005.     };
  6006.     var moveBy = function (direction, isVerticalMovement, spectrum, detail) {
  6007.       var f = direction > 0 ? increaseBy : reduceBy;
  6008.       var xValue = isVerticalMovement ? currentValue(detail).x : f(currentValue(detail).x, minX(detail), maxX(detail), step(detail));
  6009.       var yValue = !isVerticalMovement ? currentValue(detail).y : f(currentValue(detail).y, minY(detail), maxY(detail), step(detail));
  6010.       fireSliderChange(spectrum, sliderValue(xValue, yValue));
  6011.       return Optional.some(xValue);
  6012.     };
  6013.     var handleMovement = function (direction, isVerticalMovement) {
  6014.       return function (spectrum, detail) {
  6015.         return moveBy(direction, isVerticalMovement, spectrum, detail).map(always);
  6016.       };
  6017.     };
  6018.     var setToMin = function (spectrum, detail) {
  6019.       var mX = minX(detail);
  6020.       var mY = minY(detail);
  6021.       fireSliderChange(spectrum, sliderValue(mX, mY));
  6022.     };
  6023.     var setToMax = function (spectrum, detail) {
  6024.       var mX = maxX(detail);
  6025.       var mY = maxY(detail);
  6026.       fireSliderChange(spectrum, sliderValue(mX, mY));
  6027.     };
  6028.     var getValueFromEvent = function (simulatedEvent) {
  6029.       return getEventSource(simulatedEvent);
  6030.     };
  6031.     var setPositionFromValue = function (slider, thumb, detail, edges) {
  6032.       var value = currentValue(detail);
  6033.       var xPos = findPositionOfValue$1(slider, edges.getSpectrum(slider), value.x, edges.getLeftEdge(slider), edges.getRightEdge(slider), detail);
  6034.       var yPos = findPositionOfValue(slider, edges.getSpectrum(slider), value.y, edges.getTopEdge(slider), edges.getBottomEdge(slider), detail);
  6035.       var thumbXRadius = get$5(thumb.element) / 2;
  6036.       var thumbYRadius = get$7(thumb.element) / 2;
  6037.       set$5(thumb.element, 'left', xPos - thumbXRadius + 'px');
  6038.       set$5(thumb.element, 'top', yPos - thumbYRadius + 'px');
  6039.     };
  6040.     var onLeft = handleMovement(-1, false);
  6041.     var onRight = handleMovement(1, false);
  6042.     var onUp = handleMovement(-1, true);
  6043.     var onDown = handleMovement(1, true);
  6044.     var edgeActions = {
  6045.       'top-left': Optional.some(setToTLEdgeXY),
  6046.       'top': Optional.some(setToTEdgeXY),
  6047.       'top-right': Optional.some(setToTREdgeXY),
  6048.       'right': Optional.some(setToREdgeXY),
  6049.       'bottom-right': Optional.some(setToBREdgeXY),
  6050.       'bottom': Optional.some(setToBEdgeXY),
  6051.       'bottom-left': Optional.some(setToBLEdgeXY),
  6052.       'left': Optional.some(setToLEdgeXY)
  6053.     };
  6054.  
  6055.     var TwoDModel = /*#__PURE__*/Object.freeze({
  6056.         __proto__: null,
  6057.         setValueFrom: setValueFrom,
  6058.         setToMin: setToMin,
  6059.         setToMax: setToMax,
  6060.         getValueFromEvent: getValueFromEvent,
  6061.         setPositionFromValue: setPositionFromValue,
  6062.         onLeft: onLeft,
  6063.         onRight: onRight,
  6064.         onUp: onUp,
  6065.         onDown: onDown,
  6066.         edgeActions: edgeActions
  6067.     });
  6068.  
  6069.     var SliderSchema = [
  6070.       defaulted('stepSize', 1),
  6071.       defaulted('onChange', noop),
  6072.       defaulted('onChoose', noop),
  6073.       defaulted('onInit', noop),
  6074.       defaulted('onDragStart', noop),
  6075.       defaulted('onDragEnd', noop),
  6076.       defaulted('snapToGrid', false),
  6077.       defaulted('rounded', true),
  6078.       option('snapStart'),
  6079.       requiredOf('model', choose$1('mode', {
  6080.         x: [
  6081.           defaulted('minX', 0),
  6082.           defaulted('maxX', 100),
  6083.           customField('value', function (spec) {
  6084.             return Cell(spec.mode.minX);
  6085.           }),
  6086.           required$1('getInitialValue'),
  6087.           output('manager', HorizontalModel)
  6088.         ],
  6089.         y: [
  6090.           defaulted('minY', 0),
  6091.           defaulted('maxY', 100),
  6092.           customField('value', function (spec) {
  6093.             return Cell(spec.mode.minY);
  6094.           }),
  6095.           required$1('getInitialValue'),
  6096.           output('manager', VerticalModel)
  6097.         ],
  6098.         xy: [
  6099.           defaulted('minX', 0),
  6100.           defaulted('maxX', 100),
  6101.           defaulted('minY', 0),
  6102.           defaulted('maxY', 100),
  6103.           customField('value', function (spec) {
  6104.             return Cell({
  6105.               x: spec.mode.minX,
  6106.               y: spec.mode.minY
  6107.             });
  6108.           }),
  6109.           required$1('getInitialValue'),
  6110.           output('manager', TwoDModel)
  6111.         ]
  6112.       })),
  6113.       field$1('sliderBehaviours', [
  6114.         Keying,
  6115.         Representing
  6116.       ]),
  6117.       customField('mouseIsDown', function () {
  6118.         return Cell(false);
  6119.       })
  6120.     ];
  6121.  
  6122.     var mouseReleased = constant$1('mouse.released');
  6123.  
  6124.     var sketch$9 = function (detail, components, _spec, _externals) {
  6125.       var _a;
  6126.       var getThumb = function (component) {
  6127.         return getPartOrDie(component, detail, 'thumb');
  6128.       };
  6129.       var getSpectrum = function (component) {
  6130.         return getPartOrDie(component, detail, 'spectrum');
  6131.       };
  6132.       var getLeftEdge = function (component) {
  6133.         return getPart(component, detail, 'left-edge');
  6134.       };
  6135.       var getRightEdge = function (component) {
  6136.         return getPart(component, detail, 'right-edge');
  6137.       };
  6138.       var getTopEdge = function (component) {
  6139.         return getPart(component, detail, 'top-edge');
  6140.       };
  6141.       var getBottomEdge = function (component) {
  6142.         return getPart(component, detail, 'bottom-edge');
  6143.       };
  6144.       var modelDetail = detail.model;
  6145.       var model = modelDetail.manager;
  6146.       var refresh = function (slider, thumb) {
  6147.         model.setPositionFromValue(slider, thumb, detail, {
  6148.           getLeftEdge: getLeftEdge,
  6149.           getRightEdge: getRightEdge,
  6150.           getTopEdge: getTopEdge,
  6151.           getBottomEdge: getBottomEdge,
  6152.           getSpectrum: getSpectrum
  6153.         });
  6154.       };
  6155.       var setValue = function (slider, newValue) {
  6156.         modelDetail.value.set(newValue);
  6157.         var thumb = getThumb(slider);
  6158.         refresh(slider, thumb);
  6159.       };
  6160.       var changeValue = function (slider, newValue) {
  6161.         setValue(slider, newValue);
  6162.         var thumb = getThumb(slider);
  6163.         detail.onChange(slider, thumb, newValue);
  6164.         return Optional.some(true);
  6165.       };
  6166.       var resetToMin = function (slider) {
  6167.         model.setToMin(slider, detail);
  6168.       };
  6169.       var resetToMax = function (slider) {
  6170.         model.setToMax(slider, detail);
  6171.       };
  6172.       var choose = function (slider) {
  6173.         var fireOnChoose = function () {
  6174.           getPart(slider, detail, 'thumb').each(function (thumb) {
  6175.             var value = modelDetail.value.get();
  6176.             detail.onChoose(slider, thumb, value);
  6177.           });
  6178.         };
  6179.         var wasDown = detail.mouseIsDown.get();
  6180.         detail.mouseIsDown.set(false);
  6181.         if (wasDown) {
  6182.           fireOnChoose();
  6183.         }
  6184.       };
  6185.       var onDragStart = function (slider, simulatedEvent) {
  6186.         simulatedEvent.stop();
  6187.         detail.mouseIsDown.set(true);
  6188.         detail.onDragStart(slider, getThumb(slider));
  6189.       };
  6190.       var onDragEnd = function (slider, simulatedEvent) {
  6191.         simulatedEvent.stop();
  6192.         detail.onDragEnd(slider, getThumb(slider));
  6193.         choose(slider);
  6194.       };
  6195.       return {
  6196.         uid: detail.uid,
  6197.         dom: detail.dom,
  6198.         components: components,
  6199.         behaviours: augment(detail.sliderBehaviours, [
  6200.           Keying.config({
  6201.             mode: 'special',
  6202.             focusIn: function (slider) {
  6203.               return getPart(slider, detail, 'spectrum').map(Keying.focusIn).map(always);
  6204.             }
  6205.           }),
  6206.           Representing.config({
  6207.             store: {
  6208.               mode: 'manual',
  6209.               getValue: function (_) {
  6210.                 return modelDetail.value.get();
  6211.               }
  6212.             }
  6213.           }),
  6214.           Receiving.config({ channels: (_a = {}, _a[mouseReleased()] = { onReceive: choose }, _a) })
  6215.         ]),
  6216.         events: derive$3([
  6217.           run(sliderChangeEvent(), function (slider, simulatedEvent) {
  6218.             changeValue(slider, simulatedEvent.event.value);
  6219.           }),
  6220.           runOnAttached(function (slider, _simulatedEvent) {
  6221.             var getInitial = modelDetail.getInitialValue();
  6222.             modelDetail.value.set(getInitial);
  6223.             var thumb = getThumb(slider);
  6224.             refresh(slider, thumb);
  6225.             var spectrum = getSpectrum(slider);
  6226.             detail.onInit(slider, thumb, spectrum, modelDetail.value.get());
  6227.           }),
  6228.           run(touchstart(), onDragStart),
  6229.           run(touchend(), onDragEnd),
  6230.           run(mousedown(), onDragStart),
  6231.           run(mouseup(), onDragEnd)
  6232.         ]),
  6233.         apis: {
  6234.           resetToMin: resetToMin,
  6235.           resetToMax: resetToMax,
  6236.           setValue: setValue,
  6237.           refresh: refresh
  6238.         },
  6239.         domModification: { styles: { position: 'relative' } }
  6240.       };
  6241.     };
  6242.  
  6243.     var Slider = composite({
  6244.       name: 'Slider',
  6245.       configFields: SliderSchema,
  6246.       partFields: SliderParts,
  6247.       factory: sketch$9,
  6248.       apis: {
  6249.         setValue: function (apis, slider, value) {
  6250.           apis.setValue(slider, value);
  6251.         },
  6252.         resetToMin: function (apis, slider) {
  6253.           apis.resetToMin(slider);
  6254.         },
  6255.         resetToMax: function (apis, slider) {
  6256.           apis.resetToMax(slider);
  6257.         },
  6258.         refresh: function (apis, slider) {
  6259.           apis.refresh(slider);
  6260.         }
  6261.       }
  6262.     });
  6263.  
  6264.     var button = function (realm, clazz, makeItems, editor) {
  6265.       return forToolbar(clazz, function () {
  6266.         var items = makeItems();
  6267.         realm.setContextToolbar([{
  6268.             label: clazz + ' group',
  6269.             items: items
  6270.           }]);
  6271.       }, {}, editor);
  6272.     };
  6273.  
  6274.     var BLACK = -1;
  6275.     var makeSlider$1 = function (spec$1) {
  6276.       var getColor = function (hue) {
  6277.         if (hue < 0) {
  6278.           return 'black';
  6279.         } else if (hue > 360) {
  6280.           return 'white';
  6281.         } else {
  6282.           return 'hsl(' + hue + ', 100%, 50%)';
  6283.         }
  6284.       };
  6285.       var onInit = function (slider, thumb, spectrum, value) {
  6286.         var color = getColor(value.x());
  6287.         set$5(thumb.element, 'background-color', color);
  6288.       };
  6289.       var onChange = function (slider, thumb, value) {
  6290.         var color = getColor(value.x());
  6291.         set$5(thumb.element, 'background-color', color);
  6292.         spec$1.onChange(slider, thumb, color);
  6293.       };
  6294.       return Slider.sketch({
  6295.         dom: dom$1('<div class="${prefix}-slider ${prefix}-hue-slider-container"></div>'),
  6296.         components: [
  6297.           Slider.parts['left-edge'](spec('<div class="${prefix}-hue-slider-black"></div>')),
  6298.           Slider.parts.spectrum({
  6299.             dom: dom$1('<div class="${prefix}-slider-gradient-container"></div>'),
  6300.             components: [spec('<div class="${prefix}-slider-gradient"></div>')],
  6301.             behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })])
  6302.           }),
  6303.           Slider.parts['right-edge'](spec('<div class="${prefix}-hue-slider-white"></div>')),
  6304.           Slider.parts.thumb({
  6305.             dom: dom$1('<div class="${prefix}-slider-thumb"></div>'),
  6306.             behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })])
  6307.           })
  6308.         ],
  6309.         onChange: onChange,
  6310.         onDragStart: function (slider, thumb) {
  6311.           Toggling.on(thumb);
  6312.         },
  6313.         onDragEnd: function (slider, thumb) {
  6314.           Toggling.off(thumb);
  6315.         },
  6316.         onInit: onInit,
  6317.         stepSize: 10,
  6318.         model: {
  6319.           mode: 'x',
  6320.           minX: 0,
  6321.           maxX: 360,
  6322.           getInitialValue: function () {
  6323.             return { x: spec$1.getInitialValue() };
  6324.           }
  6325.         },
  6326.         sliderBehaviours: derive$2([orientation(Slider.refresh)])
  6327.       });
  6328.     };
  6329.     var makeItems$1 = function (spec) {
  6330.       return [makeSlider$1(spec)];
  6331.     };
  6332.     var sketch$8 = function (realm, editor) {
  6333.       var spec = {
  6334.         onChange: function (slider, thumb, color) {
  6335.           editor.undoManager.transact(function () {
  6336.             editor.formatter.apply('forecolor', { value: color });
  6337.             editor.nodeChanged();
  6338.           });
  6339.         },
  6340.         getInitialValue: constant$1(BLACK)
  6341.       };
  6342.       return button(realm, 'color-levels', function () {
  6343.         return makeItems$1(spec);
  6344.       }, editor);
  6345.     };
  6346.  
  6347.     var candidatesArray = [
  6348.       '9px',
  6349.       '10px',
  6350.       '11px',
  6351.       '12px',
  6352.       '14px',
  6353.       '16px',
  6354.       '18px',
  6355.       '20px',
  6356.       '24px',
  6357.       '32px',
  6358.       '36px'
  6359.     ];
  6360.     var defaultSize = 'medium';
  6361.     var defaultIndex = 2;
  6362.     var indexToSize = function (index) {
  6363.       return Optional.from(candidatesArray[index]);
  6364.     };
  6365.     var sizeToIndex = function (size) {
  6366.       return findIndex$1(candidatesArray, function (v) {
  6367.         return v === size;
  6368.       });
  6369.     };
  6370.     var getRawOrComputed = function (isRoot, rawStart) {
  6371.       var optStart = isElement(rawStart) ? Optional.some(rawStart) : parent(rawStart).filter(isElement);
  6372.       return optStart.map(function (start) {
  6373.         var inline = closest$2(start, function (elem) {
  6374.           return getRaw(elem, 'font-size').isSome();
  6375.         }, isRoot).bind(function (elem) {
  6376.           return getRaw(elem, 'font-size');
  6377.         });
  6378.         return inline.getOrThunk(function () {
  6379.           return get$8(start, 'font-size');
  6380.         });
  6381.       }).getOr('');
  6382.     };
  6383.     var getSize = function (editor) {
  6384.       var node = editor.selection.getStart();
  6385.       var elem = SugarElement.fromDom(node);
  6386.       var root = SugarElement.fromDom(editor.getBody());
  6387.       var isRoot = function (e) {
  6388.         return eq(root, e);
  6389.       };
  6390.       var elemSize = getRawOrComputed(isRoot, elem);
  6391.       return find$2(candidatesArray, function (size) {
  6392.         return elemSize === size;
  6393.       }).getOr(defaultSize);
  6394.     };
  6395.     var applySize = function (editor, value) {
  6396.       var currentValue = getSize(editor);
  6397.       if (currentValue !== value) {
  6398.         editor.execCommand('fontSize', false, value);
  6399.       }
  6400.     };
  6401.     var get$4 = function (editor) {
  6402.       var size = getSize(editor);
  6403.       return sizeToIndex(size).getOr(defaultIndex);
  6404.     };
  6405.     var apply = function (editor, index) {
  6406.       indexToSize(index).each(function (size) {
  6407.         applySize(editor, size);
  6408.       });
  6409.     };
  6410.     var candidates = constant$1(candidatesArray);
  6411.  
  6412.     var schema$9 = objOfOnly([
  6413.       required$1('getInitialValue'),
  6414.       required$1('onChange'),
  6415.       required$1('category'),
  6416.       required$1('sizes')
  6417.     ]);
  6418.     var sketch$7 = function (rawSpec) {
  6419.       var spec$1 = asRawOrDie$1('SizeSlider', schema$9, rawSpec);
  6420.       var isValidValue = function (valueIndex) {
  6421.         return valueIndex >= 0 && valueIndex < spec$1.sizes.length;
  6422.       };
  6423.       var onChange = function (slider, thumb, valueIndex) {
  6424.         var index = valueIndex.x();
  6425.         if (isValidValue(index)) {
  6426.           spec$1.onChange(index);
  6427.         }
  6428.       };
  6429.       return Slider.sketch({
  6430.         dom: {
  6431.           tag: 'div',
  6432.           classes: [
  6433.             resolve('slider-' + spec$1.category + '-size-container'),
  6434.             resolve('slider'),
  6435.             resolve('slider-size-container')
  6436.           ]
  6437.         },
  6438.         onChange: onChange,
  6439.         onDragStart: function (slider, thumb) {
  6440.           Toggling.on(thumb);
  6441.         },
  6442.         onDragEnd: function (slider, thumb) {
  6443.           Toggling.off(thumb);
  6444.         },
  6445.         model: {
  6446.           mode: 'x',
  6447.           minX: 0,
  6448.           maxX: spec$1.sizes.length - 1,
  6449.           getInitialValue: function () {
  6450.             return { x: spec$1.getInitialValue() };
  6451.           }
  6452.         },
  6453.         stepSize: 1,
  6454.         snapToGrid: true,
  6455.         sliderBehaviours: derive$2([orientation(Slider.refresh)]),
  6456.         components: [
  6457.           Slider.parts.spectrum({
  6458.             dom: dom$1('<div class="${prefix}-slider-size-container"></div>'),
  6459.             components: [spec('<div class="${prefix}-slider-size-line"></div>')]
  6460.           }),
  6461.           Slider.parts.thumb({
  6462.             dom: dom$1('<div class="${prefix}-slider-thumb"></div>'),
  6463.             behaviours: derive$2([Toggling.config({ toggleClass: resolve('thumb-active') })])
  6464.           })
  6465.         ]
  6466.       });
  6467.     };
  6468.  
  6469.     var sizes = candidates();
  6470.     var makeSlider = function (spec) {
  6471.       return sketch$7({
  6472.         onChange: spec.onChange,
  6473.         sizes: sizes,
  6474.         category: 'font',
  6475.         getInitialValue: spec.getInitialValue
  6476.       });
  6477.     };
  6478.     var makeItems = function (spec$1) {
  6479.       return [
  6480.         spec('<span class="${prefix}-toolbar-button ${prefix}-icon-small-font ${prefix}-icon"></span>'),
  6481.         makeSlider(spec$1),
  6482.         spec('<span class="${prefix}-toolbar-button ${prefix}-icon-large-font ${prefix}-icon"></span>')
  6483.       ];
  6484.     };
  6485.     var sketch$6 = function (realm, editor) {
  6486.       var spec = {
  6487.         onChange: function (value) {
  6488.           apply(editor, value);
  6489.         },
  6490.         getInitialValue: function () {
  6491.           return get$4(editor);
  6492.         }
  6493.       };
  6494.       return button(realm, 'font-size', function () {
  6495.         return makeItems(spec);
  6496.       }, editor);
  6497.     };
  6498.  
  6499.     var record = function (spec) {
  6500.       var uid = isSketchSpec$1(spec) && hasNonNullableKey(spec, 'uid') ? spec.uid : generate$2('memento');
  6501.       var get = function (anyInSystem) {
  6502.         return anyInSystem.getSystem().getByUid(uid).getOrDie();
  6503.       };
  6504.       var getOpt = function (anyInSystem) {
  6505.         return anyInSystem.getSystem().getByUid(uid).toOptional();
  6506.       };
  6507.       var asSpec = function () {
  6508.         return __assign(__assign({}, spec), { uid: uid });
  6509.       };
  6510.       return {
  6511.         get: get,
  6512.         getOpt: getOpt,
  6513.         asSpec: asSpec
  6514.       };
  6515.     };
  6516.  
  6517.     var exports$1 = {}, module = { exports: exports$1 };
  6518.     (function (define, exports, module, require) {
  6519.       (function (global, factory) {
  6520.         typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.EphoxContactWrapper = factory());
  6521.       }(this, function () {
  6522.         var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
  6523.         var promise = { exports: {} };
  6524.         (function (module) {
  6525.           (function (root) {
  6526.             var setTimeoutFunc = setTimeout;
  6527.             function noop() {
  6528.             }
  6529.             function bind(fn, thisArg) {
  6530.               return function () {
  6531.                 fn.apply(thisArg, arguments);
  6532.               };
  6533.             }
  6534.             function Promise(fn) {
  6535.               if (typeof this !== 'object')
  6536.                 throw new TypeError('Promises must be constructed via new');
  6537.               if (typeof fn !== 'function')
  6538.                 throw new TypeError('not a function');
  6539.               this._state = 0;
  6540.               this._handled = false;
  6541.               this._value = undefined;
  6542.               this._deferreds = [];
  6543.               doResolve(fn, this);
  6544.             }
  6545.             function handle(self, deferred) {
  6546.               while (self._state === 3) {
  6547.                 self = self._value;
  6548.               }
  6549.               if (self._state === 0) {
  6550.                 self._deferreds.push(deferred);
  6551.                 return;
  6552.               }
  6553.               self._handled = true;
  6554.               Promise._immediateFn(function () {
  6555.                 var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
  6556.                 if (cb === null) {
  6557.                   (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
  6558.                   return;
  6559.                 }
  6560.                 var ret;
  6561.                 try {
  6562.                   ret = cb(self._value);
  6563.                 } catch (e) {
  6564.                   reject(deferred.promise, e);
  6565.                   return;
  6566.                 }
  6567.                 resolve(deferred.promise, ret);
  6568.               });
  6569.             }
  6570.             function resolve(self, newValue) {
  6571.               try {
  6572.                 if (newValue === self)
  6573.                   throw new TypeError('A promise cannot be resolved with itself.');
  6574.                 if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) {
  6575.                   var then = newValue.then;
  6576.                   if (newValue instanceof Promise) {
  6577.                     self._state = 3;
  6578.                     self._value = newValue;
  6579.                     finale(self);
  6580.                     return;
  6581.                   } else if (typeof then === 'function') {
  6582.                     doResolve(bind(then, newValue), self);
  6583.                     return;
  6584.                   }
  6585.                 }
  6586.                 self._state = 1;
  6587.                 self._value = newValue;
  6588.                 finale(self);
  6589.               } catch (e) {
  6590.                 reject(self, e);
  6591.               }
  6592.             }
  6593.             function reject(self, newValue) {
  6594.               self._state = 2;
  6595.               self._value = newValue;
  6596.               finale(self);
  6597.             }
  6598.             function finale(self) {
  6599.               if (self._state === 2 && self._deferreds.length === 0) {
  6600.                 Promise._immediateFn(function () {
  6601.                   if (!self._handled) {
  6602.                     Promise._unhandledRejectionFn(self._value);
  6603.                   }
  6604.                 });
  6605.               }
  6606.               for (var i = 0, len = self._deferreds.length; i < len; i++) {
  6607.                 handle(self, self._deferreds[i]);
  6608.               }
  6609.               self._deferreds = null;
  6610.             }
  6611.             function Handler(onFulfilled, onRejected, promise) {
  6612.               this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
  6613.               this.onRejected = typeof onRejected === 'function' ? onRejected : null;
  6614.               this.promise = promise;
  6615.             }
  6616.             function doResolve(fn, self) {
  6617.               var done = false;
  6618.               try {
  6619.                 fn(function (value) {
  6620.                   if (done)
  6621.                     return;
  6622.                   done = true;
  6623.                   resolve(self, value);
  6624.                 }, function (reason) {
  6625.                   if (done)
  6626.                     return;
  6627.                   done = true;
  6628.                   reject(self, reason);
  6629.                 });
  6630.               } catch (ex) {
  6631.                 if (done)
  6632.                   return;
  6633.                 done = true;
  6634.                 reject(self, ex);
  6635.               }
  6636.             }
  6637.             Promise.prototype['catch'] = function (onRejected) {
  6638.               return this.then(null, onRejected);
  6639.             };
  6640.             Promise.prototype.then = function (onFulfilled, onRejected) {
  6641.               var prom = new this.constructor(noop);
  6642.               handle(this, new Handler(onFulfilled, onRejected, prom));
  6643.               return prom;
  6644.             };
  6645.             Promise.all = function (arr) {
  6646.               var args = Array.prototype.slice.call(arr);
  6647.               return new Promise(function (resolve, reject) {
  6648.                 if (args.length === 0)
  6649.                   return resolve([]);
  6650.                 var remaining = args.length;
  6651.                 function res(i, val) {
  6652.                   try {
  6653.                     if (val && (typeof val === 'object' || typeof val === 'function')) {
  6654.                       var then = val.then;
  6655.                       if (typeof then === 'function') {
  6656.                         then.call(val, function (val) {
  6657.                           res(i, val);
  6658.                         }, reject);
  6659.                         return;
  6660.                       }
  6661.                     }
  6662.                     args[i] = val;
  6663.                     if (--remaining === 0) {
  6664.                       resolve(args);
  6665.                     }
  6666.                   } catch (ex) {
  6667.                     reject(ex);
  6668.                   }
  6669.                 }
  6670.                 for (var i = 0; i < args.length; i++) {
  6671.                   res(i, args[i]);
  6672.                 }
  6673.               });
  6674.             };
  6675.             Promise.resolve = function (value) {
  6676.               if (value && typeof value === 'object' && value.constructor === Promise) {
  6677.                 return value;
  6678.               }
  6679.               return new Promise(function (resolve) {
  6680.                 resolve(value);
  6681.               });
  6682.             };
  6683.             Promise.reject = function (value) {
  6684.               return new Promise(function (resolve, reject) {
  6685.                 reject(value);
  6686.               });
  6687.             };
  6688.             Promise.race = function (values) {
  6689.               return new Promise(function (resolve, reject) {
  6690.                 for (var i = 0, len = values.length; i < len; i++) {
  6691.                   values[i].then(resolve, reject);
  6692.                 }
  6693.               });
  6694.             };
  6695.             Promise._immediateFn = typeof setImmediate === 'function' ? function (fn) {
  6696.               setImmediate(fn);
  6697.             } : function (fn) {
  6698.               setTimeoutFunc(fn, 0);
  6699.             };
  6700.             Promise._unhandledRejectionFn = function _unhandledRejectionFn(err) {
  6701.               if (typeof console !== 'undefined' && console) {
  6702.                 console.warn('Possible Unhandled Promise Rejection:', err);
  6703.               }
  6704.             };
  6705.             Promise._setImmediateFn = function _setImmediateFn(fn) {
  6706.               Promise._immediateFn = fn;
  6707.             };
  6708.             Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) {
  6709.               Promise._unhandledRejectionFn = fn;
  6710.             };
  6711.             if (module.exports) {
  6712.               module.exports = Promise;
  6713.             } else if (!root.Promise) {
  6714.               root.Promise = Promise;
  6715.             }
  6716.           }(commonjsGlobal));
  6717.         }(promise));
  6718.         var promisePolyfill = promise.exports;
  6719.         var Global = function () {
  6720.           if (typeof window !== 'undefined') {
  6721.             return window;
  6722.           } else {
  6723.             return Function('return this;')();
  6724.           }
  6725.         }();
  6726.         var promisePolyfill_1 = { boltExport: Global.Promise || promisePolyfill };
  6727.         return promisePolyfill_1;
  6728.       }));
  6729.     }(undefined, exports$1, module));
  6730.     var Promise$1 = module.exports.boltExport;
  6731.  
  6732.     var blobToDataUri = function (blob) {
  6733.       return new Promise$1(function (resolve) {
  6734.         var reader = new FileReader();
  6735.         reader.onloadend = function () {
  6736.           resolve(reader.result);
  6737.         };
  6738.         reader.readAsDataURL(blob);
  6739.       });
  6740.     };
  6741.     var blobToBase64$1 = function (blob) {
  6742.       return blobToDataUri(blob).then(function (dataUri) {
  6743.         return dataUri.split(',')[1];
  6744.       });
  6745.     };
  6746.  
  6747.     var blobToBase64 = function (blob) {
  6748.       return blobToBase64$1(blob);
  6749.     };
  6750.  
  6751.     var addImage = function (editor, blob) {
  6752.       blobToBase64(blob).then(function (base64) {
  6753.         editor.undoManager.transact(function () {
  6754.           var cache = editor.editorUpload.blobCache;
  6755.           var info = cache.create(generate$4('mceu'), blob, base64);
  6756.           cache.add(info);
  6757.           var img = editor.dom.createHTML('img', { src: info.blobUri() });
  6758.           editor.insertContent(img);
  6759.         });
  6760.       });
  6761.     };
  6762.     var extractBlob = function (simulatedEvent) {
  6763.       var event = simulatedEvent.event.raw;
  6764.       var files = event.target.files || event.dataTransfer.files;
  6765.       return Optional.from(files[0]);
  6766.     };
  6767.     var sketch$5 = function (editor) {
  6768.       var pickerDom = {
  6769.         tag: 'input',
  6770.         attributes: {
  6771.           accept: 'image/*',
  6772.           type: 'file',
  6773.           title: ''
  6774.         },
  6775.         styles: {
  6776.           visibility: 'hidden',
  6777.           position: 'absolute'
  6778.         }
  6779.       };
  6780.       var memPicker = record({
  6781.         dom: pickerDom,
  6782.         events: derive$3([
  6783.           cutter(click()),
  6784.           run(change(), function (picker, simulatedEvent) {
  6785.             extractBlob(simulatedEvent).each(function (blob) {
  6786.               addImage(editor, blob);
  6787.             });
  6788.           })
  6789.         ])
  6790.       });
  6791.       return Button.sketch({
  6792.         dom: getToolbarIconButton('image', editor),
  6793.         components: [memPicker.asSpec()],
  6794.         action: function (button) {
  6795.           var picker = memPicker.get(button);
  6796.           picker.element.dom.click();
  6797.         }
  6798.       });
  6799.     };
  6800.  
  6801.     var get$3 = function (element) {
  6802.       return element.dom.textContent;
  6803.     };
  6804.     var set$3 = function (element, value) {
  6805.       element.dom.textContent = value;
  6806.     };
  6807.  
  6808.     var isNotEmpty = function (val) {
  6809.       return val.length > 0;
  6810.     };
  6811.     var defaultToEmpty = function (str) {
  6812.       return str === undefined || str === null ? '' : str;
  6813.     };
  6814.     var noLink = function (editor) {
  6815.       var text = editor.selection.getContent({ format: 'text' });
  6816.       return {
  6817.         url: '',
  6818.         text: text,
  6819.         title: '',
  6820.         target: '',
  6821.         link: Optional.none()
  6822.       };
  6823.     };
  6824.     var fromLink = function (link) {
  6825.       var text = get$3(link);
  6826.       var url = get$b(link, 'href');
  6827.       var title = get$b(link, 'title');
  6828.       var target = get$b(link, 'target');
  6829.       return {
  6830.         url: defaultToEmpty(url),
  6831.         text: text !== url ? defaultToEmpty(text) : '',
  6832.         title: defaultToEmpty(title),
  6833.         target: defaultToEmpty(target),
  6834.         link: Optional.some(link)
  6835.       };
  6836.     };
  6837.     var getInfo = function (editor) {
  6838.       return query(editor).fold(function () {
  6839.         return noLink(editor);
  6840.       }, function (link) {
  6841.         return fromLink(link);
  6842.       });
  6843.     };
  6844.     var wasSimple = function (link) {
  6845.       var prevHref = get$b(link, 'href');
  6846.       var prevText = get$3(link);
  6847.       return prevHref === prevText;
  6848.     };
  6849.     var getTextToApply = function (link, url, info) {
  6850.       return info.text.toOptional().filter(isNotEmpty).fold(function () {
  6851.         return wasSimple(link) ? Optional.some(url) : Optional.none();
  6852.       }, Optional.some);
  6853.     };
  6854.     var unlinkIfRequired = function (editor, info) {
  6855.       var activeLink = info.link.bind(identity);
  6856.       activeLink.each(function (_link) {
  6857.         editor.execCommand('unlink');
  6858.       });
  6859.     };
  6860.     var getAttrs = function (url, info) {
  6861.       var attrs = {};
  6862.       attrs.href = url;
  6863.       info.title.toOptional().filter(isNotEmpty).each(function (title) {
  6864.         attrs.title = title;
  6865.       });
  6866.       info.target.toOptional().filter(isNotEmpty).each(function (target) {
  6867.         attrs.target = target;
  6868.       });
  6869.       return attrs;
  6870.     };
  6871.     var applyInfo = function (editor, info) {
  6872.       info.url.toOptional().filter(isNotEmpty).fold(function () {
  6873.         unlinkIfRequired(editor, info);
  6874.       }, function (url) {
  6875.         var attrs = getAttrs(url, info);
  6876.         var activeLink = info.link.bind(identity);
  6877.         activeLink.fold(function () {
  6878.           var text = info.text.toOptional().filter(isNotEmpty).getOr(url);
  6879.           editor.insertContent(editor.dom.createHTML('a', attrs, editor.dom.encode(text)));
  6880.         }, function (link) {
  6881.           var text = getTextToApply(link, url, info);
  6882.           setAll$1(link, attrs);
  6883.           text.each(function (newText) {
  6884.             set$3(link, newText);
  6885.           });
  6886.         });
  6887.       });
  6888.     };
  6889.     var query = function (editor) {
  6890.       var start = SugarElement.fromDom(editor.selection.getStart());
  6891.       return closest$1(start, 'a');
  6892.     };
  6893.  
  6894.     var platform = detect$1();
  6895.     var preserve$1 = function (f, editor) {
  6896.       var rng = editor.selection.getRng();
  6897.       f();
  6898.       editor.selection.setRng(rng);
  6899.     };
  6900.     var forAndroid = function (editor, f) {
  6901.       var wrapper = platform.os.isAndroid() ? preserve$1 : apply$1;
  6902.       wrapper(f, editor);
  6903.     };
  6904.  
  6905.     var events$4 = function (name, eventHandlers) {
  6906.       var events = derive$3(eventHandlers);
  6907.       return create$5({
  6908.         fields: [required$1('enabled')],
  6909.         name: name,
  6910.         active: { events: constant$1(events) }
  6911.       });
  6912.     };
  6913.     var config = function (name, eventHandlers) {
  6914.       var me = events$4(name, eventHandlers);
  6915.       return {
  6916.         key: name,
  6917.         value: {
  6918.           config: {},
  6919.           me: me,
  6920.           configAsRaw: constant$1({}),
  6921.           initialConfig: {},
  6922.           state: NoState
  6923.         }
  6924.       };
  6925.     };
  6926.  
  6927.     var getCurrent = function (component, composeConfig, _composeState) {
  6928.       return composeConfig.find(component);
  6929.     };
  6930.  
  6931.     var ComposeApis = /*#__PURE__*/Object.freeze({
  6932.         __proto__: null,
  6933.         getCurrent: getCurrent
  6934.     });
  6935.  
  6936.     var ComposeSchema = [required$1('find')];
  6937.  
  6938.     var Composing = create$5({
  6939.       fields: ComposeSchema,
  6940.       name: 'composing',
  6941.       apis: ComposeApis
  6942.     });
  6943.  
  6944.     var factory$4 = function (detail) {
  6945.       var _a = detail.dom, attributes = _a.attributes, domWithoutAttributes = __rest(_a, ['attributes']);
  6946.       return {
  6947.         uid: detail.uid,
  6948.         dom: __assign({
  6949.           tag: 'div',
  6950.           attributes: __assign({ role: 'presentation' }, attributes)
  6951.         }, domWithoutAttributes),
  6952.         components: detail.components,
  6953.         behaviours: get$6(detail.containerBehaviours),
  6954.         events: detail.events,
  6955.         domModification: detail.domModification,
  6956.         eventOrder: detail.eventOrder
  6957.       };
  6958.     };
  6959.     var Container = single({
  6960.       name: 'Container',
  6961.       factory: factory$4,
  6962.       configFields: [
  6963.         defaulted('components', []),
  6964.         field$1('containerBehaviours', []),
  6965.         defaulted('events', {}),
  6966.         defaulted('domModification', {}),
  6967.         defaulted('eventOrder', {})
  6968.       ]
  6969.     });
  6970.  
  6971.     var factory$3 = function (detail) {
  6972.       return {
  6973.         uid: detail.uid,
  6974.         dom: detail.dom,
  6975.         behaviours: SketchBehaviours.augment(detail.dataBehaviours, [
  6976.           Representing.config({
  6977.             store: {
  6978.               mode: 'memory',
  6979.               initialValue: detail.getInitialValue()
  6980.             }
  6981.           }),
  6982.           Composing.config({ find: Optional.some })
  6983.         ]),
  6984.         events: derive$3([runOnAttached(function (component, _simulatedEvent) {
  6985.             Representing.setValue(component, detail.getInitialValue());
  6986.           })])
  6987.       };
  6988.     };
  6989.     var DataField = single({
  6990.       name: 'DataField',
  6991.       factory: factory$3,
  6992.       configFields: [
  6993.         required$1('uid'),
  6994.         required$1('dom'),
  6995.         required$1('getInitialValue'),
  6996.         SketchBehaviours.field('dataBehaviours', [
  6997.           Representing,
  6998.           Composing
  6999.         ])
  7000.       ]
  7001.     });
  7002.  
  7003.     var get$2 = function (element) {
  7004.       return element.dom.value;
  7005.     };
  7006.     var set$2 = function (element, value) {
  7007.       if (value === undefined) {
  7008.         throw new Error('Value.set was undefined');
  7009.       }
  7010.       element.dom.value = value;
  7011.     };
  7012.  
  7013.     var schema$8 = constant$1([
  7014.       option('data'),
  7015.       defaulted('inputAttributes', {}),
  7016.       defaulted('inputStyles', {}),
  7017.       defaulted('tag', 'input'),
  7018.       defaulted('inputClasses', []),
  7019.       onHandler('onSetValue'),
  7020.       defaulted('styles', {}),
  7021.       defaulted('eventOrder', {}),
  7022.       field$1('inputBehaviours', [
  7023.         Representing,
  7024.         Focusing
  7025.       ]),
  7026.       defaulted('selectOnFocus', true)
  7027.     ]);
  7028.     var focusBehaviours = function (detail) {
  7029.       return derive$2([Focusing.config({
  7030.           onFocus: !detail.selectOnFocus ? noop : function (component) {
  7031.             var input = component.element;
  7032.             var value = get$2(input);
  7033.             input.dom.setSelectionRange(0, value.length);
  7034.           }
  7035.         })]);
  7036.     };
  7037.     var behaviours = function (detail) {
  7038.       return __assign(__assign({}, focusBehaviours(detail)), augment(detail.inputBehaviours, [Representing.config({
  7039.           store: __assign(__assign({ mode: 'manual' }, detail.data.map(function (data) {
  7040.             return { initialValue: data };
  7041.           }).getOr({})), {
  7042.             getValue: function (input) {
  7043.               return get$2(input.element);
  7044.             },
  7045.             setValue: function (input, data) {
  7046.               var current = get$2(input.element);
  7047.               if (current !== data) {
  7048.                 set$2(input.element, data);
  7049.               }
  7050.             }
  7051.           }),
  7052.           onSetValue: detail.onSetValue
  7053.         })]));
  7054.     };
  7055.     var dom = function (detail) {
  7056.       return {
  7057.         tag: detail.tag,
  7058.         attributes: __assign({ type: 'text' }, detail.inputAttributes),
  7059.         styles: detail.inputStyles,
  7060.         classes: detail.inputClasses
  7061.       };
  7062.     };
  7063.  
  7064.     var factory$2 = function (detail, _spec) {
  7065.       return {
  7066.         uid: detail.uid,
  7067.         dom: dom(detail),
  7068.         components: [],
  7069.         behaviours: behaviours(detail),
  7070.         eventOrder: detail.eventOrder
  7071.       };
  7072.     };
  7073.     var Input = single({
  7074.       name: 'Input',
  7075.       configFields: schema$8(),
  7076.       factory: factory$2
  7077.     });
  7078.  
  7079.     var exhibit$2 = function (base, tabConfig) {
  7080.       return nu$3({
  7081.         attributes: wrapAll([{
  7082.             key: tabConfig.tabAttr,
  7083.             value: 'true'
  7084.           }])
  7085.       });
  7086.     };
  7087.  
  7088.     var ActiveTabstopping = /*#__PURE__*/Object.freeze({
  7089.         __proto__: null,
  7090.         exhibit: exhibit$2
  7091.     });
  7092.  
  7093.     var TabstopSchema = [defaulted('tabAttr', 'data-alloy-tabstop')];
  7094.  
  7095.     var Tabstopping = create$5({
  7096.       fields: TabstopSchema,
  7097.       name: 'tabstopping',
  7098.       active: ActiveTabstopping
  7099.     });
  7100.  
  7101.     var global$3 = tinymce.util.Tools.resolve('tinymce.util.I18n');
  7102.  
  7103.     var clearInputBehaviour = 'input-clearing';
  7104.     var field = function (name, placeholder) {
  7105.       var inputSpec = record(Input.sketch({
  7106.         inputAttributes: { placeholder: global$3.translate(placeholder) },
  7107.         onSetValue: function (input, _data) {
  7108.           emit(input, input$1());
  7109.         },
  7110.         inputBehaviours: derive$2([
  7111.           Composing.config({ find: Optional.some }),
  7112.           Tabstopping.config({}),
  7113.           Keying.config({ mode: 'execution' })
  7114.         ]),
  7115.         selectOnFocus: false
  7116.       }));
  7117.       var buttonSpec = record(Button.sketch({
  7118.         dom: dom$1('<button class="${prefix}-input-container-x ${prefix}-icon-cancel-circle ${prefix}-icon"></button>'),
  7119.         action: function (button) {
  7120.           var input = inputSpec.get(button);
  7121.           Representing.setValue(input, '');
  7122.         }
  7123.       }));
  7124.       return {
  7125.         name: name,
  7126.         spec: Container.sketch({
  7127.           dom: dom$1('<div class="${prefix}-input-container"></div>'),
  7128.           components: [
  7129.             inputSpec.asSpec(),
  7130.             buttonSpec.asSpec()
  7131.           ],
  7132.           containerBehaviours: derive$2([
  7133.             Toggling.config({ toggleClass: resolve('input-container-empty') }),
  7134.             Composing.config({
  7135.               find: function (comp) {
  7136.                 return Optional.some(inputSpec.get(comp));
  7137.               }
  7138.             }),
  7139.             config(clearInputBehaviour, [run(input$1(), function (iContainer) {
  7140.                 var input = inputSpec.get(iContainer);
  7141.                 var val = Representing.getValue(input);
  7142.                 var f = val.length > 0 ? Toggling.off : Toggling.on;
  7143.                 f(iContainer);
  7144.               })])
  7145.           ])
  7146.         })
  7147.       };
  7148.     };
  7149.     var hidden = function (name) {
  7150.       return {
  7151.         name: name,
  7152.         spec: DataField.sketch({
  7153.           dom: {
  7154.             tag: 'span',
  7155.             styles: { display: 'none' }
  7156.           },
  7157.           getInitialValue: function () {
  7158.             return Optional.none();
  7159.           }
  7160.         })
  7161.       };
  7162.     };
  7163.  
  7164.     var nativeDisabled = [
  7165.       'input',
  7166.       'button',
  7167.       'textarea',
  7168.       'select'
  7169.     ];
  7170.     var onLoad = function (component, disableConfig, disableState) {
  7171.       var f = disableConfig.disabled() ? disable : enable;
  7172.       f(component, disableConfig);
  7173.     };
  7174.     var hasNative = function (component, config) {
  7175.       return config.useNative === true && contains$1(nativeDisabled, name$1(component.element));
  7176.     };
  7177.     var nativeIsDisabled = function (component) {
  7178.       return has$1(component.element, 'disabled');
  7179.     };
  7180.     var nativeDisable = function (component) {
  7181.       set$8(component.element, 'disabled', 'disabled');
  7182.     };
  7183.     var nativeEnable = function (component) {
  7184.       remove$6(component.element, 'disabled');
  7185.     };
  7186.     var ariaIsDisabled = function (component) {
  7187.       return get$b(component.element, 'aria-disabled') === 'true';
  7188.     };
  7189.     var ariaDisable = function (component) {
  7190.       set$8(component.element, 'aria-disabled', 'true');
  7191.     };
  7192.     var ariaEnable = function (component) {
  7193.       set$8(component.element, 'aria-disabled', 'false');
  7194.     };
  7195.     var disable = function (component, disableConfig, _disableState) {
  7196.       disableConfig.disableClass.each(function (disableClass) {
  7197.         add$1(component.element, disableClass);
  7198.       });
  7199.       var f = hasNative(component, disableConfig) ? nativeDisable : ariaDisable;
  7200.       f(component);
  7201.       disableConfig.onDisabled(component);
  7202.     };
  7203.     var enable = function (component, disableConfig, _disableState) {
  7204.       disableConfig.disableClass.each(function (disableClass) {
  7205.         remove$3(component.element, disableClass);
  7206.       });
  7207.       var f = hasNative(component, disableConfig) ? nativeEnable : ariaEnable;
  7208.       f(component);
  7209.       disableConfig.onEnabled(component);
  7210.     };
  7211.     var isDisabled = function (component, disableConfig) {
  7212.       return hasNative(component, disableConfig) ? nativeIsDisabled(component) : ariaIsDisabled(component);
  7213.     };
  7214.     var set$1 = function (component, disableConfig, disableState, disabled) {
  7215.       var f = disabled ? disable : enable;
  7216.       f(component, disableConfig);
  7217.     };
  7218.  
  7219.     var DisableApis = /*#__PURE__*/Object.freeze({
  7220.         __proto__: null,
  7221.         enable: enable,
  7222.         disable: disable,
  7223.         isDisabled: isDisabled,
  7224.         onLoad: onLoad,
  7225.         set: set$1
  7226.     });
  7227.  
  7228.     var exhibit$1 = function (base, disableConfig) {
  7229.       return nu$3({ classes: disableConfig.disabled() ? disableConfig.disableClass.toArray() : [] });
  7230.     };
  7231.     var events$3 = function (disableConfig, disableState) {
  7232.       return derive$3([
  7233.         abort(execute$5(), function (component, _simulatedEvent) {
  7234.           return isDisabled(component, disableConfig);
  7235.         }),
  7236.         loadEvent(disableConfig, disableState, onLoad)
  7237.       ]);
  7238.     };
  7239.  
  7240.     var ActiveDisable = /*#__PURE__*/Object.freeze({
  7241.         __proto__: null,
  7242.         exhibit: exhibit$1,
  7243.         events: events$3
  7244.     });
  7245.  
  7246.     var DisableSchema = [
  7247.       defaultedFunction('disabled', never),
  7248.       defaulted('useNative', true),
  7249.       option('disableClass'),
  7250.       onHandler('onDisabled'),
  7251.       onHandler('onEnabled')
  7252.     ];
  7253.  
  7254.     var Disabling = create$5({
  7255.       fields: DisableSchema,
  7256.       name: 'disabling',
  7257.       active: ActiveDisable,
  7258.       apis: DisableApis
  7259.     });
  7260.  
  7261.     var owner$1 = 'form';
  7262.     var schema$7 = [field$1('formBehaviours', [Representing])];
  7263.     var getPartName = function (name) {
  7264.       return '<alloy.field.' + name + '>';
  7265.     };
  7266.     var sketch$4 = function (fSpec) {
  7267.       var parts = function () {
  7268.         var record = [];
  7269.         var field = function (name, config) {
  7270.           record.push(name);
  7271.           return generateOne(owner$1, getPartName(name), config);
  7272.         };
  7273.         return {
  7274.           field: field,
  7275.           record: constant$1(record)
  7276.         };
  7277.       }();
  7278.       var spec = fSpec(parts);
  7279.       var partNames = parts.record();
  7280.       var fieldParts = map$2(partNames, function (n) {
  7281.         return required({
  7282.           name: n,
  7283.           pname: getPartName(n)
  7284.         });
  7285.       });
  7286.       return composite$1(owner$1, schema$7, fieldParts, make$4, spec);
  7287.     };
  7288.     var toResult = function (o, e) {
  7289.       return o.fold(function () {
  7290.         return Result.error(e);
  7291.       }, Result.value);
  7292.     };
  7293.     var make$4 = function (detail, components) {
  7294.       return {
  7295.         uid: detail.uid,
  7296.         dom: detail.dom,
  7297.         components: components,
  7298.         behaviours: augment(detail.formBehaviours, [Representing.config({
  7299.             store: {
  7300.               mode: 'manual',
  7301.               getValue: function (form) {
  7302.                 var resPs = getAllParts(form, detail);
  7303.                 return map$1(resPs, function (resPThunk, pName) {
  7304.                   return resPThunk().bind(function (v) {
  7305.                     var opt = Composing.getCurrent(v);
  7306.                     return toResult(opt, new Error('Cannot find a current component to extract the value from for form part \'' + pName + '\': ' + element(v.element)));
  7307.                   }).map(Representing.getValue);
  7308.                 });
  7309.               },
  7310.               setValue: function (form, values) {
  7311.                 each(values, function (newValue, key) {
  7312.                   getPart(form, detail, key).each(function (wrapper) {
  7313.                     Composing.getCurrent(wrapper).each(function (field) {
  7314.                       Representing.setValue(field, newValue);
  7315.                     });
  7316.                   });
  7317.                 });
  7318.               }
  7319.             }
  7320.           })]),
  7321.         apis: {
  7322.           getField: function (form, key) {
  7323.             return getPart(form, detail, key).bind(Composing.getCurrent);
  7324.           }
  7325.         }
  7326.       };
  7327.     };
  7328.     var Form = {
  7329.       getField: makeApi(function (apis, component, key) {
  7330.         return apis.getField(component, key);
  7331.       }),
  7332.       sketch: sketch$4
  7333.     };
  7334.  
  7335.     var SWIPING_LEFT = 1;
  7336.     var SWIPING_RIGHT = -1;
  7337.     var SWIPING_NONE = 0;
  7338.     var init$3 = function (xValue) {
  7339.       return {
  7340.         xValue: xValue,
  7341.         points: []
  7342.       };
  7343.     };
  7344.     var move = function (model, xValue) {
  7345.       if (xValue === model.xValue) {
  7346.         return model;
  7347.       }
  7348.       var currentDirection = xValue - model.xValue > 0 ? SWIPING_LEFT : SWIPING_RIGHT;
  7349.       var newPoint = {
  7350.         direction: currentDirection,
  7351.         xValue: xValue
  7352.       };
  7353.       var priorPoints = function () {
  7354.         if (model.points.length === 0) {
  7355.           return [];
  7356.         } else {
  7357.           var prev = model.points[model.points.length - 1];
  7358.           return prev.direction === currentDirection ? model.points.slice(0, model.points.length - 1) : model.points;
  7359.         }
  7360.       }();
  7361.       return {
  7362.         xValue: xValue,
  7363.         points: priorPoints.concat([newPoint])
  7364.       };
  7365.     };
  7366.     var complete = function (model) {
  7367.       if (model.points.length === 0) {
  7368.         return SWIPING_NONE;
  7369.       } else {
  7370.         var firstDirection = model.points[0].direction;
  7371.         var lastDirection = model.points[model.points.length - 1].direction;
  7372.         return firstDirection === SWIPING_RIGHT && lastDirection === SWIPING_RIGHT ? SWIPING_RIGHT : firstDirection === SWIPING_LEFT && lastDirection === SWIPING_LEFT ? SWIPING_LEFT : SWIPING_NONE;
  7373.       }
  7374.     };
  7375.  
  7376.     var sketch$3 = function (rawSpec) {
  7377.       var navigateEvent = 'navigateEvent';
  7378.       var wrapperAdhocEvents = 'serializer-wrapper-events';
  7379.       var formAdhocEvents = 'form-events';
  7380.       var schema = objOf([
  7381.         required$1('fields'),
  7382.         defaulted('maxFieldIndex', rawSpec.fields.length - 1),
  7383.         required$1('onExecute'),
  7384.         required$1('getInitialValue'),
  7385.         customField('state', function () {
  7386.           return {
  7387.             dialogSwipeState: value(),
  7388.             currentScreen: Cell(0)
  7389.           };
  7390.         })
  7391.       ]);
  7392.       var spec$1 = asRawOrDie$1('SerialisedDialog', schema, rawSpec);
  7393.       var navigationButton = function (direction, directionName, enabled) {
  7394.         return Button.sketch({
  7395.           dom: dom$1('<span class="${prefix}-icon-' + directionName + ' ${prefix}-icon"></span>'),
  7396.           action: function (button) {
  7397.             emitWith(button, navigateEvent, { direction: direction });
  7398.           },
  7399.           buttonBehaviours: derive$2([Disabling.config({
  7400.               disableClass: resolve('toolbar-navigation-disabled'),
  7401.               disabled: function () {
  7402.                 return !enabled;
  7403.               }
  7404.             })])
  7405.         });
  7406.       };
  7407.       var reposition = function (dialog, message) {
  7408.         descendant(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) {
  7409.           set$5(parent, 'left', -spec$1.state.currentScreen.get() * message.width + 'px');
  7410.         });
  7411.       };
  7412.       var navigate = function (dialog, direction) {
  7413.         var screens = descendants(dialog.element, '.' + resolve('serialised-dialog-screen'));
  7414.         descendant(dialog.element, '.' + resolve('serialised-dialog-chain')).each(function (parent) {
  7415.           if (spec$1.state.currentScreen.get() + direction >= 0 && spec$1.state.currentScreen.get() + direction < screens.length) {
  7416.             getRaw(parent, 'left').each(function (left) {
  7417.               var currentLeft = parseInt(left, 10);
  7418.               var w = get$5(screens[0]);
  7419.               set$5(parent, 'left', currentLeft - direction * w + 'px');
  7420.             });
  7421.             spec$1.state.currentScreen.set(spec$1.state.currentScreen.get() + direction);
  7422.           }
  7423.         });
  7424.       };
  7425.       var focusInput = function (dialog) {
  7426.         var inputs = descendants(dialog.element, 'input');
  7427.         var optInput = Optional.from(inputs[spec$1.state.currentScreen.get()]);
  7428.         optInput.each(function (input) {
  7429.           dialog.getSystem().getByDom(input).each(function (inputComp) {
  7430.             dispatchFocus(dialog, inputComp.element);
  7431.           });
  7432.         });
  7433.         var dotitems = memDots.get(dialog);
  7434.         Highlighting.highlightAt(dotitems, spec$1.state.currentScreen.get());
  7435.       };
  7436.       var resetState = function () {
  7437.         spec$1.state.currentScreen.set(0);
  7438.         spec$1.state.dialogSwipeState.clear();
  7439.       };
  7440.       var memForm = record(Form.sketch(function (parts) {
  7441.         return {
  7442.           dom: dom$1('<div class="${prefix}-serialised-dialog"></div>'),
  7443.           components: [Container.sketch({
  7444.               dom: dom$1('<div class="${prefix}-serialised-dialog-chain" style="left: 0px; position: absolute;"></div>'),
  7445.               components: map$2(spec$1.fields, function (field, i) {
  7446.                 return i <= spec$1.maxFieldIndex ? Container.sketch({
  7447.                   dom: dom$1('<div class="${prefix}-serialised-dialog-screen"></div>'),
  7448.                   components: [
  7449.                     navigationButton(-1, 'previous', i > 0),
  7450.                     parts.field(field.name, field.spec),
  7451.                     navigationButton(+1, 'next', i < spec$1.maxFieldIndex)
  7452.                   ]
  7453.                 }) : parts.field(field.name, field.spec);
  7454.               })
  7455.             })],
  7456.           formBehaviours: derive$2([
  7457.             orientation(function (dialog, message) {
  7458.               reposition(dialog, message);
  7459.             }),
  7460.             Keying.config({
  7461.               mode: 'special',
  7462.               focusIn: function (dialog, _specialInfo) {
  7463.                 focusInput(dialog);
  7464.               },
  7465.               onTab: function (dialog, _specialInfo) {
  7466.                 navigate(dialog, +1);
  7467.                 return Optional.some(true);
  7468.               },
  7469.               onShiftTab: function (dialog, _specialInfo) {
  7470.                 navigate(dialog, -1);
  7471.                 return Optional.some(true);
  7472.               }
  7473.             }),
  7474.             config(formAdhocEvents, [
  7475.               runOnAttached(function (dialog, _simulatedEvent) {
  7476.                 resetState();
  7477.                 var dotitems = memDots.get(dialog);
  7478.                 Highlighting.highlightFirst(dotitems);
  7479.                 spec$1.getInitialValue(dialog).each(function (v) {
  7480.                   Representing.setValue(dialog, v);
  7481.                 });
  7482.               }),
  7483.               runOnExecute(spec$1.onExecute),
  7484.               run(transitionend(), function (dialog, simulatedEvent) {
  7485.                 var event = simulatedEvent.event;
  7486.                 if (event.raw.propertyName === 'left') {
  7487.                   focusInput(dialog);
  7488.                 }
  7489.               }),
  7490.               run(navigateEvent, function (dialog, simulatedEvent) {
  7491.                 var event = simulatedEvent.event;
  7492.                 var direction = event.direction;
  7493.                 navigate(dialog, direction);
  7494.               })
  7495.             ])
  7496.           ])
  7497.         };
  7498.       }));
  7499.       var memDots = record({
  7500.         dom: dom$1('<div class="${prefix}-dot-container"></div>'),
  7501.         behaviours: derive$2([Highlighting.config({
  7502.             highlightClass: resolve('dot-active'),
  7503.             itemClass: resolve('dot-item')
  7504.           })]),
  7505.         components: bind$3(spec$1.fields, function (_f, i) {
  7506.           return i <= spec$1.maxFieldIndex ? [spec('<div class="${prefix}-dot-item ${prefix}-icon-full-dot ${prefix}-icon"></div>')] : [];
  7507.         })
  7508.       });
  7509.       return {
  7510.         dom: dom$1('<div class="${prefix}-serializer-wrapper"></div>'),
  7511.         components: [
  7512.           memForm.asSpec(),
  7513.           memDots.asSpec()
  7514.         ],
  7515.         behaviours: derive$2([
  7516.           Keying.config({
  7517.             mode: 'special',
  7518.             focusIn: function (wrapper) {
  7519.               var form = memForm.get(wrapper);
  7520.               Keying.focusIn(form);
  7521.             }
  7522.           }),
  7523.           config(wrapperAdhocEvents, [
  7524.             run(touchstart(), function (_wrapper, simulatedEvent) {
  7525.               var event = simulatedEvent.event;
  7526.               spec$1.state.dialogSwipeState.set(init$3(event.raw.touches[0].clientX));
  7527.             }),
  7528.             run(touchmove(), function (_wrapper, simulatedEvent) {
  7529.               var event = simulatedEvent.event;
  7530.               spec$1.state.dialogSwipeState.on(function (state) {
  7531.                 simulatedEvent.event.prevent();
  7532.                 spec$1.state.dialogSwipeState.set(move(state, event.raw.touches[0].clientX));
  7533.               });
  7534.             }),
  7535.             run(touchend(), function (wrapper, _simulatedEvent) {
  7536.               spec$1.state.dialogSwipeState.on(function (state) {
  7537.                 var dialog = memForm.get(wrapper);
  7538.                 var direction = -1 * complete(state);
  7539.                 navigate(dialog, direction);
  7540.               });
  7541.             })
  7542.           ])
  7543.         ])
  7544.       };
  7545.     };
  7546.  
  7547.     var getGroups = cached(function (realm, editor) {
  7548.       return [{
  7549.           label: 'the link group',
  7550.           items: [sketch$3({
  7551.               fields: [
  7552.                 field('url', 'Type or paste URL'),
  7553.                 field('text', 'Link text'),
  7554.                 field('title', 'Link title'),
  7555.                 field('target', 'Link target'),
  7556.                 hidden('link')
  7557.               ],
  7558.               maxFieldIndex: [
  7559.                 'url',
  7560.                 'text',
  7561.                 'title',
  7562.                 'target'
  7563.               ].length - 1,
  7564.               getInitialValue: function () {
  7565.                 return Optional.some(getInfo(editor));
  7566.               },
  7567.               onExecute: function (dialog, _simulatedEvent) {
  7568.                 var info = Representing.getValue(dialog);
  7569.                 applyInfo(editor, info);
  7570.                 realm.restoreToolbar();
  7571.                 editor.focus();
  7572.               }
  7573.             })]
  7574.         }];
  7575.     });
  7576.     var sketch$2 = function (realm, editor) {
  7577.       return forToolbarStateAction(editor, 'link', 'link', function () {
  7578.         var groups = getGroups(realm, editor);
  7579.         realm.setContextToolbar(groups);
  7580.         forAndroid(editor, function () {
  7581.           realm.focusToolbar();
  7582.         });
  7583.         query(editor).each(function (link) {
  7584.           editor.selection.select(link.dom);
  7585.         });
  7586.       });
  7587.     };
  7588.  
  7589.     var isRecursive = function (component, originator, target) {
  7590.       return eq(originator, component.element) && !eq(originator, target);
  7591.     };
  7592.     var events$2 = derive$3([can(focus$4(), function (component, simulatedEvent) {
  7593.         var event = simulatedEvent.event;
  7594.         var originator = event.originator;
  7595.         var target = event.target;
  7596.         if (isRecursive(component, originator, target)) {
  7597.           console.warn(focus$4() + ' did not get interpreted by the desired target. ' + '\nOriginator: ' + element(originator) + '\nTarget: ' + element(target) + '\nCheck the ' + focus$4() + ' event handlers');
  7598.           return false;
  7599.         } else {
  7600.           return true;
  7601.         }
  7602.       })]);
  7603.  
  7604.     var DefaultEvents = /*#__PURE__*/Object.freeze({
  7605.         __proto__: null,
  7606.         events: events$2
  7607.     });
  7608.  
  7609.     var make$3 = identity;
  7610.  
  7611.     var NoContextApi = function (getComp) {
  7612.       var getMessage = function (event) {
  7613.         return 'The component must be in a context to execute: ' + event + (getComp ? '\n' + element(getComp().element) + ' is not in context.' : '');
  7614.       };
  7615.       var fail = function (event) {
  7616.         return function () {
  7617.           throw new Error(getMessage(event));
  7618.         };
  7619.       };
  7620.       var warn = function (event) {
  7621.         return function () {
  7622.           console.warn(getMessage(event));
  7623.         };
  7624.       };
  7625.       return {
  7626.         debugInfo: constant$1('fake'),
  7627.         triggerEvent: warn('triggerEvent'),
  7628.         triggerFocus: warn('triggerFocus'),
  7629.         triggerEscape: warn('triggerEscape'),
  7630.         broadcast: warn('broadcast'),
  7631.         broadcastOn: warn('broadcastOn'),
  7632.         broadcastEvent: warn('broadcastEvent'),
  7633.         build: fail('build'),
  7634.         addToWorld: fail('addToWorld'),
  7635.         removeFromWorld: fail('removeFromWorld'),
  7636.         addToGui: fail('addToGui'),
  7637.         removeFromGui: fail('removeFromGui'),
  7638.         getByUid: fail('getByUid'),
  7639.         getByDom: fail('getByDom'),
  7640.         isConnected: never
  7641.       };
  7642.     };
  7643.     var singleton = NoContextApi();
  7644.  
  7645.     var generateFrom$1 = function (spec, all) {
  7646.       var schema = map$2(all, function (a) {
  7647.         return optionObjOf(a.name(), [
  7648.           required$1('config'),
  7649.           defaulted('state', NoState)
  7650.         ]);
  7651.       });
  7652.       var validated = asRaw('component.behaviours', objOf(schema), spec.behaviours).fold(function (errInfo) {
  7653.         throw new Error(formatError(errInfo) + '\nComplete spec:\n' + JSON.stringify(spec, null, 2));
  7654.       }, identity);
  7655.       return {
  7656.         list: all,
  7657.         data: map$1(validated, function (optBlobThunk) {
  7658.           var output = optBlobThunk.map(function (blob) {
  7659.             return {
  7660.               config: blob.config,
  7661.               state: blob.state.init(blob.config)
  7662.             };
  7663.           });
  7664.           return constant$1(output);
  7665.         })
  7666.       };
  7667.     };
  7668.     var getBehaviours$1 = function (bData) {
  7669.       return bData.list;
  7670.     };
  7671.     var getData = function (bData) {
  7672.       return bData.data;
  7673.     };
  7674.  
  7675.     var byInnerKey = function (data, tuple) {
  7676.       var r = {};
  7677.       each(data, function (detail, key) {
  7678.         each(detail, function (value, indexKey) {
  7679.           var chain = get$c(r, indexKey).getOr([]);
  7680.           r[indexKey] = chain.concat([tuple(key, value)]);
  7681.         });
  7682.       });
  7683.       return r;
  7684.     };
  7685.  
  7686.     var combine$1 = function (info, baseMod, behaviours, base) {
  7687.       var modsByBehaviour = __assign({}, baseMod);
  7688.       each$1(behaviours, function (behaviour) {
  7689.         modsByBehaviour[behaviour.name()] = behaviour.exhibit(info, base);
  7690.       });
  7691.       var byAspect = byInnerKey(modsByBehaviour, function (name, modification) {
  7692.         return {
  7693.           name: name,
  7694.           modification: modification
  7695.         };
  7696.       });
  7697.       var combineObjects = function (objects) {
  7698.         return foldr(objects, function (b, a) {
  7699.           return __assign(__assign({}, a.modification), b);
  7700.         }, {});
  7701.       };
  7702.       var combinedClasses = foldr(byAspect.classes, function (b, a) {
  7703.         return a.modification.concat(b);
  7704.       }, []);
  7705.       var combinedAttributes = combineObjects(byAspect.attributes);
  7706.       var combinedStyles = combineObjects(byAspect.styles);
  7707.       return nu$3({
  7708.         classes: combinedClasses,
  7709.         attributes: combinedAttributes,
  7710.         styles: combinedStyles
  7711.       });
  7712.     };
  7713.  
  7714.     var sortKeys = function (label, keyName, array, order) {
  7715.       try {
  7716.         var sorted = sort(array, function (a, b) {
  7717.           var aKey = a[keyName];
  7718.           var bKey = b[keyName];
  7719.           var aIndex = order.indexOf(aKey);
  7720.           var bIndex = order.indexOf(bKey);
  7721.           if (aIndex === -1) {
  7722.             throw new Error('The ordering for ' + label + ' does not have an entry for ' + aKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2));
  7723.           }
  7724.           if (bIndex === -1) {
  7725.             throw new Error('The ordering for ' + label + ' does not have an entry for ' + bKey + '.\nOrder specified: ' + JSON.stringify(order, null, 2));
  7726.           }
  7727.           if (aIndex < bIndex) {
  7728.             return -1;
  7729.           } else if (bIndex < aIndex) {
  7730.             return 1;
  7731.           } else {
  7732.             return 0;
  7733.           }
  7734.         });
  7735.         return Result.value(sorted);
  7736.       } catch (err) {
  7737.         return Result.error([err]);
  7738.       }
  7739.     };
  7740.  
  7741.     var uncurried = function (handler, purpose) {
  7742.       return {
  7743.         handler: handler,
  7744.         purpose: purpose
  7745.       };
  7746.     };
  7747.     var curried = function (handler, purpose) {
  7748.       return {
  7749.         cHandler: handler,
  7750.         purpose: purpose
  7751.       };
  7752.     };
  7753.     var curryArgs = function (descHandler, extraArgs) {
  7754.       return curried(curry.apply(undefined, [descHandler.handler].concat(extraArgs)), descHandler.purpose);
  7755.     };
  7756.     var getCurried = function (descHandler) {
  7757.       return descHandler.cHandler;
  7758.     };
  7759.  
  7760.     var behaviourTuple = function (name, handler) {
  7761.       return {
  7762.         name: name,
  7763.         handler: handler
  7764.       };
  7765.     };
  7766.     var nameToHandlers = function (behaviours, info) {
  7767.       var r = {};
  7768.       each$1(behaviours, function (behaviour) {
  7769.         r[behaviour.name()] = behaviour.handlers(info);
  7770.       });
  7771.       return r;
  7772.     };
  7773.     var groupByEvents = function (info, behaviours, base) {
  7774.       var behaviourEvents = __assign(__assign({}, base), nameToHandlers(behaviours, info));
  7775.       return byInnerKey(behaviourEvents, behaviourTuple);
  7776.     };
  7777.     var combine = function (info, eventOrder, behaviours, base) {
  7778.       var byEventName = groupByEvents(info, behaviours, base);
  7779.       return combineGroups(byEventName, eventOrder);
  7780.     };
  7781.     var assemble = function (rawHandler) {
  7782.       var handler = read$1(rawHandler);
  7783.       return function (component, simulatedEvent) {
  7784.         var rest = [];
  7785.         for (var _i = 2; _i < arguments.length; _i++) {
  7786.           rest[_i - 2] = arguments[_i];
  7787.         }
  7788.         var args = [
  7789.           component,
  7790.           simulatedEvent
  7791.         ].concat(rest);
  7792.         if (handler.abort.apply(undefined, args)) {
  7793.           simulatedEvent.stop();
  7794.         } else if (handler.can.apply(undefined, args)) {
  7795.           handler.run.apply(undefined, args);
  7796.         }
  7797.       };
  7798.     };
  7799.     var missingOrderError = function (eventName, tuples) {
  7800.       return Result.error(['The event (' + eventName + ') has more than one behaviour that listens to it.\nWhen this occurs, you must ' + 'specify an event ordering for the behaviours in your spec (e.g. [ "listing", "toggling" ]).\nThe behaviours that ' + 'can trigger it are: ' + JSON.stringify(map$2(tuples, function (c) {
  7801.           return c.name;
  7802.         }), null, 2)]);
  7803.     };
  7804.     var fuse = function (tuples, eventOrder, eventName) {
  7805.       var order = eventOrder[eventName];
  7806.       if (!order) {
  7807.         return missingOrderError(eventName, tuples);
  7808.       } else {
  7809.         return sortKeys('Event: ' + eventName, 'name', tuples, order).map(function (sortedTuples) {
  7810.           var handlers = map$2(sortedTuples, function (tuple) {
  7811.             return tuple.handler;
  7812.           });
  7813.           return fuse$1(handlers);
  7814.         });
  7815.       }
  7816.     };
  7817.     var combineGroups = function (byEventName, eventOrder) {
  7818.       var r = mapToArray(byEventName, function (tuples, eventName) {
  7819.         var combined = tuples.length === 1 ? Result.value(tuples[0].handler) : fuse(tuples, eventOrder, eventName);
  7820.         return combined.map(function (handler) {
  7821.           var assembled = assemble(handler);
  7822.           var purpose = tuples.length > 1 ? filter$2(eventOrder[eventName], function (o) {
  7823.             return exists(tuples, function (t) {
  7824.               return t.name === o;
  7825.             });
  7826.           }).join(' > ') : tuples[0].name;
  7827.           return wrap(eventName, uncurried(assembled, purpose));
  7828.         });
  7829.       });
  7830.       return consolidate(r, {});
  7831.     };
  7832.  
  7833.     var _a;
  7834.     var baseBehaviour = 'alloy.base.behaviour';
  7835.     var schema$6 = objOf([
  7836.       field$2('dom', 'dom', required$2(), objOf([
  7837.         required$1('tag'),
  7838.         defaulted('styles', {}),
  7839.         defaulted('classes', []),
  7840.         defaulted('attributes', {}),
  7841.         option('value'),
  7842.         option('innerHtml')
  7843.       ])),
  7844.       required$1('components'),
  7845.       required$1('uid'),
  7846.       defaulted('events', {}),
  7847.       defaulted('apis', {}),
  7848.       field$2('eventOrder', 'eventOrder', mergeWith((_a = {}, _a[execute$5()] = [
  7849.         'disabling',
  7850.         baseBehaviour,
  7851.         'toggling',
  7852.         'typeaheadevents'
  7853.       ], _a[focus$4()] = [
  7854.         baseBehaviour,
  7855.         'focusing',
  7856.         'keying'
  7857.       ], _a[systemInit()] = [
  7858.         baseBehaviour,
  7859.         'disabling',
  7860.         'toggling',
  7861.         'representing'
  7862.       ], _a[input$1()] = [
  7863.         baseBehaviour,
  7864.         'representing',
  7865.         'streaming',
  7866.         'invalidating'
  7867.       ], _a[detachedFromDom()] = [
  7868.         baseBehaviour,
  7869.         'representing',
  7870.         'item-events',
  7871.         'tooltipping'
  7872.       ], _a[mousedown()] = [
  7873.         'focusing',
  7874.         baseBehaviour,
  7875.         'item-type-events'
  7876.       ], _a[touchstart()] = [
  7877.         'focusing',
  7878.         baseBehaviour,
  7879.         'item-type-events'
  7880.       ], _a[mouseover()] = [
  7881.         'item-type-events',
  7882.         'tooltipping'
  7883.       ], _a[receive$1()] = [
  7884.         'receiving',
  7885.         'reflecting',
  7886.         'tooltipping'
  7887.       ], _a)), anyValue()),
  7888.       option('domModification')
  7889.     ]);
  7890.     var toInfo = function (spec) {
  7891.       return asRaw('custom.definition', schema$6, spec);
  7892.     };
  7893.     var toDefinition = function (detail) {
  7894.       return __assign(__assign({}, detail.dom), {
  7895.         uid: detail.uid,
  7896.         domChildren: map$2(detail.components, function (comp) {
  7897.           return comp.element;
  7898.         })
  7899.       });
  7900.     };
  7901.     var toModification = function (detail) {
  7902.       return detail.domModification.fold(function () {
  7903.         return nu$3({});
  7904.       }, nu$3);
  7905.     };
  7906.     var toEvents = function (info) {
  7907.       return info.events;
  7908.     };
  7909.  
  7910.     var add = function (element, classes) {
  7911.       each$1(classes, function (x) {
  7912.         add$1(element, x);
  7913.       });
  7914.     };
  7915.     var remove$1 = function (element, classes) {
  7916.       each$1(classes, function (x) {
  7917.         remove$3(element, x);
  7918.       });
  7919.     };
  7920.  
  7921.     var renderToDom = function (definition) {
  7922.       var subject = SugarElement.fromTag(definition.tag);
  7923.       setAll$1(subject, definition.attributes);
  7924.       add(subject, definition.classes);
  7925.       setAll(subject, definition.styles);
  7926.       definition.innerHtml.each(function (html) {
  7927.         return set$7(subject, html);
  7928.       });
  7929.       var children = definition.domChildren;
  7930.       append$1(subject, children);
  7931.       definition.value.each(function (value) {
  7932.         set$2(subject, value);
  7933.       });
  7934.       if (!definition.uid) {
  7935.         debugger;
  7936.       }
  7937.       writeOnly(subject, definition.uid);
  7938.       return subject;
  7939.     };
  7940.  
  7941.     var getBehaviours = function (spec) {
  7942.       var behaviours = get$c(spec, 'behaviours').getOr({});
  7943.       return bind$3(keys(behaviours), function (name) {
  7944.         var behaviour = behaviours[name];
  7945.         return isNonNullable(behaviour) ? [behaviour.me] : [];
  7946.       });
  7947.     };
  7948.     var generateFrom = function (spec, all) {
  7949.       return generateFrom$1(spec, all);
  7950.     };
  7951.     var generate$1 = function (spec) {
  7952.       var all = getBehaviours(spec);
  7953.       return generateFrom(spec, all);
  7954.     };
  7955.  
  7956.     var getDomDefinition = function (info, bList, bData) {
  7957.       var definition = toDefinition(info);
  7958.       var infoModification = toModification(info);
  7959.       var baseModification = { 'alloy.base.modification': infoModification };
  7960.       var modification = bList.length > 0 ? combine$1(bData, baseModification, bList, definition) : infoModification;
  7961.       return merge(definition, modification);
  7962.     };
  7963.     var getEvents = function (info, bList, bData) {
  7964.       var baseEvents = { 'alloy.base.behaviour': toEvents(info) };
  7965.       return combine(bData, info.eventOrder, bList, baseEvents).getOrDie();
  7966.     };
  7967.     var build$2 = function (spec) {
  7968.       var getMe = function () {
  7969.         return me;
  7970.       };
  7971.       var systemApi = Cell(singleton);
  7972.       var info = getOrDie(toInfo(spec));
  7973.       var bBlob = generate$1(spec);
  7974.       var bList = getBehaviours$1(bBlob);
  7975.       var bData = getData(bBlob);
  7976.       var modDefinition = getDomDefinition(info, bList, bData);
  7977.       var item = renderToDom(modDefinition);
  7978.       var events = getEvents(info, bList, bData);
  7979.       var subcomponents = Cell(info.components);
  7980.       var connect = function (newApi) {
  7981.         systemApi.set(newApi);
  7982.       };
  7983.       var disconnect = function () {
  7984.         systemApi.set(NoContextApi(getMe));
  7985.       };
  7986.       var syncComponents = function () {
  7987.         var children$1 = children(item);
  7988.         var subs = bind$3(children$1, function (child) {
  7989.           return systemApi.get().getByDom(child).fold(function () {
  7990.             return [];
  7991.           }, pure$2);
  7992.         });
  7993.         subcomponents.set(subs);
  7994.       };
  7995.       var config = function (behaviour) {
  7996.         var b = bData;
  7997.         var f = isFunction(b[behaviour.name()]) ? b[behaviour.name()] : function () {
  7998.           throw new Error('Could not find ' + behaviour.name() + ' in ' + JSON.stringify(spec, null, 2));
  7999.         };
  8000.         return f();
  8001.       };
  8002.       var hasConfigured = function (behaviour) {
  8003.         return isFunction(bData[behaviour.name()]);
  8004.       };
  8005.       var getApis = function () {
  8006.         return info.apis;
  8007.       };
  8008.       var readState = function (behaviourName) {
  8009.         return bData[behaviourName]().map(function (b) {
  8010.           return b.state.readState();
  8011.         }).getOr('not enabled');
  8012.       };
  8013.       var me = {
  8014.         uid: spec.uid,
  8015.         getSystem: systemApi.get,
  8016.         config: config,
  8017.         hasConfigured: hasConfigured,
  8018.         spec: spec,
  8019.         readState: readState,
  8020.         getApis: getApis,
  8021.         connect: connect,
  8022.         disconnect: disconnect,
  8023.         element: item,
  8024.         syncComponents: syncComponents,
  8025.         components: subcomponents.get,
  8026.         events: events
  8027.       };
  8028.       return me;
  8029.     };
  8030.  
  8031.     var buildSubcomponents = function (spec) {
  8032.       var components = get$c(spec, 'components').getOr([]);
  8033.       return map$2(components, build$1);
  8034.     };
  8035.     var buildFromSpec = function (userSpec) {
  8036.       var _a = make$3(userSpec), specEvents = _a.events, spec = __rest(_a, ['events']);
  8037.       var components = buildSubcomponents(spec);
  8038.       var completeSpec = __assign(__assign({}, spec), {
  8039.         events: __assign(__assign({}, DefaultEvents), specEvents),
  8040.         components: components
  8041.       });
  8042.       return Result.value(build$2(completeSpec));
  8043.     };
  8044.     var text = function (textContent) {
  8045.       var element = SugarElement.fromText(textContent);
  8046.       return external({ element: element });
  8047.     };
  8048.     var external = function (spec) {
  8049.       var extSpec = asRawOrDie$1('external.component', objOfOnly([
  8050.         required$1('element'),
  8051.         option('uid')
  8052.       ]), spec);
  8053.       var systemApi = Cell(NoContextApi());
  8054.       var connect = function (newApi) {
  8055.         systemApi.set(newApi);
  8056.       };
  8057.       var disconnect = function () {
  8058.         systemApi.set(NoContextApi(function () {
  8059.           return me;
  8060.         }));
  8061.       };
  8062.       var uid = extSpec.uid.getOrThunk(function () {
  8063.         return generate$2('external');
  8064.       });
  8065.       writeOnly(extSpec.element, uid);
  8066.       var me = {
  8067.         uid: uid,
  8068.         getSystem: systemApi.get,
  8069.         config: Optional.none,
  8070.         hasConfigured: never,
  8071.         connect: connect,
  8072.         disconnect: disconnect,
  8073.         getApis: function () {
  8074.           return {};
  8075.         },
  8076.         element: extSpec.element,
  8077.         spec: spec,
  8078.         readState: constant$1('No state'),
  8079.         syncComponents: noop,
  8080.         components: constant$1([]),
  8081.         events: {}
  8082.       };
  8083.       return premade$1(me);
  8084.     };
  8085.     var uids = generate$2;
  8086.     var isSketchSpec = function (spec) {
  8087.       return has$2(spec, 'uid');
  8088.     };
  8089.     var build$1 = function (spec) {
  8090.       return getPremade(spec).getOrThunk(function () {
  8091.         var userSpecWithUid = isSketchSpec(spec) ? spec : __assign({ uid: uids('') }, spec);
  8092.         return buildFromSpec(userSpecWithUid).getOrDie();
  8093.       });
  8094.     };
  8095.     var premade = premade$1;
  8096.  
  8097.     var hoverEvent = 'alloy.item-hover';
  8098.     var focusEvent = 'alloy.item-focus';
  8099.     var onHover = function (item) {
  8100.       if (search(item.element).isNone() || Focusing.isFocused(item)) {
  8101.         if (!Focusing.isFocused(item)) {
  8102.           Focusing.focus(item);
  8103.         }
  8104.         emitWith(item, hoverEvent, { item: item });
  8105.       }
  8106.     };
  8107.     var onFocus = function (item) {
  8108.       emitWith(item, focusEvent, { item: item });
  8109.     };
  8110.     var hover = constant$1(hoverEvent);
  8111.     var focus$1 = constant$1(focusEvent);
  8112.  
  8113.     var builder$2 = function (detail) {
  8114.       return {
  8115.         dom: detail.dom,
  8116.         domModification: __assign(__assign({}, detail.domModification), { attributes: __assign(__assign(__assign({ 'role': detail.toggling.isSome() ? 'menuitemcheckbox' : 'menuitem' }, detail.domModification.attributes), { 'aria-haspopup': detail.hasSubmenu }), detail.hasSubmenu ? { 'aria-expanded': false } : {}) }),
  8117.         behaviours: SketchBehaviours.augment(detail.itemBehaviours, [
  8118.           detail.toggling.fold(Toggling.revoke, function (tConfig) {
  8119.             return Toggling.config(__assign({ aria: { mode: 'checked' } }, tConfig));
  8120.           }),
  8121.           Focusing.config({
  8122.             ignore: detail.ignoreFocus,
  8123.             stopMousedown: detail.ignoreFocus,
  8124.             onFocus: function (component) {
  8125.               onFocus(component);
  8126.             }
  8127.           }),
  8128.           Keying.config({ mode: 'execution' }),
  8129.           Representing.config({
  8130.             store: {
  8131.               mode: 'memory',
  8132.               initialValue: detail.data
  8133.             }
  8134.           }),
  8135.           config('item-type-events', __spreadArray(__spreadArray([], pointerEvents(), true), [
  8136.             run(mouseover(), onHover),
  8137.             run(focusItem(), Focusing.focus)
  8138.           ], false))
  8139.         ]),
  8140.         components: detail.components,
  8141.         eventOrder: detail.eventOrder
  8142.       };
  8143.     };
  8144.     var schema$5 = [
  8145.       required$1('data'),
  8146.       required$1('components'),
  8147.       required$1('dom'),
  8148.       defaulted('hasSubmenu', false),
  8149.       option('toggling'),
  8150.       SketchBehaviours.field('itemBehaviours', [
  8151.         Toggling,
  8152.         Focusing,
  8153.         Keying,
  8154.         Representing
  8155.       ]),
  8156.       defaulted('ignoreFocus', false),
  8157.       defaulted('domModification', {}),
  8158.       output('builder', builder$2),
  8159.       defaulted('eventOrder', {})
  8160.     ];
  8161.  
  8162.     var builder$1 = function (detail) {
  8163.       return {
  8164.         dom: detail.dom,
  8165.         components: detail.components,
  8166.         events: derive$3([stopper(focusItem())])
  8167.       };
  8168.     };
  8169.     var schema$4 = [
  8170.       required$1('dom'),
  8171.       required$1('components'),
  8172.       output('builder', builder$1)
  8173.     ];
  8174.  
  8175.     var owner = constant$1('item-widget');
  8176.     var parts$3 = constant$1([required({
  8177.         name: 'widget',
  8178.         overrides: function (detail) {
  8179.           return {
  8180.             behaviours: derive$2([Representing.config({
  8181.                 store: {
  8182.                   mode: 'manual',
  8183.                   getValue: function (_component) {
  8184.                     return detail.data;
  8185.                   },
  8186.                   setValue: noop
  8187.                 }
  8188.               })])
  8189.           };
  8190.         }
  8191.       })]);
  8192.  
  8193.     var builder = function (detail) {
  8194.       var subs = substitutes(owner(), detail, parts$3());
  8195.       var components$1 = components(owner(), detail, subs.internals());
  8196.       var focusWidget = function (component) {
  8197.         return getPart(component, detail, 'widget').map(function (widget) {
  8198.           Keying.focusIn(widget);
  8199.           return widget;
  8200.         });
  8201.       };
  8202.       var onHorizontalArrow = function (component, simulatedEvent) {
  8203.         return inside(simulatedEvent.event.target) ? Optional.none() : function () {
  8204.           if (detail.autofocus) {
  8205.             simulatedEvent.setSource(component.element);
  8206.             return Optional.none();
  8207.           } else {
  8208.             return Optional.none();
  8209.           }
  8210.         }();
  8211.       };
  8212.       return {
  8213.         dom: detail.dom,
  8214.         components: components$1,
  8215.         domModification: detail.domModification,
  8216.         events: derive$3([
  8217.           runOnExecute(function (component, simulatedEvent) {
  8218.             focusWidget(component).each(function (_widget) {
  8219.               simulatedEvent.stop();
  8220.             });
  8221.           }),
  8222.           run(mouseover(), onHover),
  8223.           run(focusItem(), function (component, _simulatedEvent) {
  8224.             if (detail.autofocus) {
  8225.               focusWidget(component);
  8226.             } else {
  8227.               Focusing.focus(component);
  8228.             }
  8229.           })
  8230.         ]),
  8231.         behaviours: SketchBehaviours.augment(detail.widgetBehaviours, [
  8232.           Representing.config({
  8233.             store: {
  8234.               mode: 'memory',
  8235.               initialValue: detail.data
  8236.             }
  8237.           }),
  8238.           Focusing.config({
  8239.             ignore: detail.ignoreFocus,
  8240.             onFocus: function (component) {
  8241.               onFocus(component);
  8242.             }
  8243.           }),
  8244.           Keying.config({
  8245.             mode: 'special',
  8246.             focusIn: detail.autofocus ? function (component) {
  8247.               focusWidget(component);
  8248.             } : revoke(),
  8249.             onLeft: onHorizontalArrow,
  8250.             onRight: onHorizontalArrow,
  8251.             onEscape: function (component, simulatedEvent) {
  8252.               if (!Focusing.isFocused(component) && !detail.autofocus) {
  8253.                 Focusing.focus(component);
  8254.                 return Optional.some(true);
  8255.               } else if (detail.autofocus) {
  8256.                 simulatedEvent.setSource(component.element);
  8257.                 return Optional.none();
  8258.               } else {
  8259.                 return Optional.none();
  8260.               }
  8261.             }
  8262.           })
  8263.         ])
  8264.       };
  8265.     };
  8266.     var schema$3 = [
  8267.       required$1('uid'),
  8268.       required$1('data'),
  8269.       required$1('components'),
  8270.       required$1('dom'),
  8271.       defaulted('autofocus', false),
  8272.       defaulted('ignoreFocus', false),
  8273.       SketchBehaviours.field('widgetBehaviours', [
  8274.         Representing,
  8275.         Focusing,
  8276.         Keying
  8277.       ]),
  8278.       defaulted('domModification', {}),
  8279.       defaultUidsSchema(parts$3()),
  8280.       output('builder', builder)
  8281.     ];
  8282.  
  8283.     var itemSchema = choose$1('type', {
  8284.       widget: schema$3,
  8285.       item: schema$5,
  8286.       separator: schema$4
  8287.     });
  8288.     var configureGrid = function (detail, movementInfo) {
  8289.       return {
  8290.         mode: 'flatgrid',
  8291.         selector: '.' + detail.markers.item,
  8292.         initSize: {
  8293.           numColumns: movementInfo.initSize.numColumns,
  8294.           numRows: movementInfo.initSize.numRows
  8295.         },
  8296.         focusManager: detail.focusManager
  8297.       };
  8298.     };
  8299.     var configureMatrix = function (detail, movementInfo) {
  8300.       return {
  8301.         mode: 'matrix',
  8302.         selectors: {
  8303.           row: movementInfo.rowSelector,
  8304.           cell: '.' + detail.markers.item
  8305.         },
  8306.         focusManager: detail.focusManager
  8307.       };
  8308.     };
  8309.     var configureMenu = function (detail, movementInfo) {
  8310.       return {
  8311.         mode: 'menu',
  8312.         selector: '.' + detail.markers.item,
  8313.         moveOnTab: movementInfo.moveOnTab,
  8314.         focusManager: detail.focusManager
  8315.       };
  8316.     };
  8317.     var parts$2 = constant$1([group({
  8318.         factory: {
  8319.           sketch: function (spec) {
  8320.             var itemInfo = asRawOrDie$1('menu.spec item', itemSchema, spec);
  8321.             return itemInfo.builder(itemInfo);
  8322.           }
  8323.         },
  8324.         name: 'items',
  8325.         unit: 'item',
  8326.         defaults: function (detail, u) {
  8327.           return has$2(u, 'uid') ? u : __assign(__assign({}, u), { uid: generate$2('item') });
  8328.         },
  8329.         overrides: function (detail, u) {
  8330.           return {
  8331.             type: u.type,
  8332.             ignoreFocus: detail.fakeFocus,
  8333.             domModification: { classes: [detail.markers.item] }
  8334.           };
  8335.         }
  8336.       })]);
  8337.     var schema$2 = constant$1([
  8338.       required$1('value'),
  8339.       required$1('items'),
  8340.       required$1('dom'),
  8341.       required$1('components'),
  8342.       defaulted('eventOrder', {}),
  8343.       field$1('menuBehaviours', [
  8344.         Highlighting,
  8345.         Representing,
  8346.         Composing,
  8347.         Keying
  8348.       ]),
  8349.       defaultedOf('movement', {
  8350.         mode: 'menu',
  8351.         moveOnTab: true
  8352.       }, choose$1('mode', {
  8353.         grid: [
  8354.           initSize(),
  8355.           output('config', configureGrid)
  8356.         ],
  8357.         matrix: [
  8358.           output('config', configureMatrix),
  8359.           required$1('rowSelector')
  8360.         ],
  8361.         menu: [
  8362.           defaulted('moveOnTab', true),
  8363.           output('config', configureMenu)
  8364.         ]
  8365.       })),
  8366.       itemMarkers(),
  8367.       defaulted('fakeFocus', false),
  8368.       defaulted('focusManager', dom$2()),
  8369.       onHandler('onHighlight')
  8370.     ]);
  8371.  
  8372.     var focus = constant$1('alloy.menu-focus');
  8373.  
  8374.     var make$2 = function (detail, components, _spec, _externals) {
  8375.       return {
  8376.         uid: detail.uid,
  8377.         dom: detail.dom,
  8378.         markers: detail.markers,
  8379.         behaviours: augment(detail.menuBehaviours, [
  8380.           Highlighting.config({
  8381.             highlightClass: detail.markers.selectedItem,
  8382.             itemClass: detail.markers.item,
  8383.             onHighlight: detail.onHighlight
  8384.           }),
  8385.           Representing.config({
  8386.             store: {
  8387.               mode: 'memory',
  8388.               initialValue: detail.value
  8389.             }
  8390.           }),
  8391.           Composing.config({ find: Optional.some }),
  8392.           Keying.config(detail.movement.config(detail, detail.movement))
  8393.         ]),
  8394.         events: derive$3([
  8395.           run(focus$1(), function (menu, simulatedEvent) {
  8396.             var event = simulatedEvent.event;
  8397.             menu.getSystem().getByDom(event.target).each(function (item) {
  8398.               Highlighting.highlight(menu, item);
  8399.               simulatedEvent.stop();
  8400.               emitWith(menu, focus(), {
  8401.                 menu: menu,
  8402.                 item: item
  8403.               });
  8404.             });
  8405.           }),
  8406.           run(hover(), function (menu, simulatedEvent) {
  8407.             var item = simulatedEvent.event.item;
  8408.             Highlighting.highlight(menu, item);
  8409.           })
  8410.         ]),
  8411.         components: components,
  8412.         eventOrder: detail.eventOrder,
  8413.         domModification: { attributes: { role: 'menu' } }
  8414.       };
  8415.     };
  8416.  
  8417.     var Menu = composite({
  8418.       name: 'Menu',
  8419.       configFields: schema$2(),
  8420.       partFields: parts$2(),
  8421.       factory: make$2
  8422.     });
  8423.  
  8424.     var preserve = function (f, container) {
  8425.       var dos = getRootNode(container);
  8426.       var refocus = active(dos).bind(function (focused) {
  8427.         var hasFocus = function (elem) {
  8428.           return eq(focused, elem);
  8429.         };
  8430.         return hasFocus(container) ? Optional.some(container) : descendant$1(container, hasFocus);
  8431.       });
  8432.       var result = f(container);
  8433.       refocus.each(function (oldFocus) {
  8434.         active(dos).filter(function (newFocus) {
  8435.           return eq(newFocus, oldFocus);
  8436.         }).fold(function () {
  8437.           focus$3(oldFocus);
  8438.         }, noop);
  8439.       });
  8440.       return result;
  8441.     };
  8442.  
  8443.     var set = function (component, replaceConfig, replaceState, data) {
  8444.       preserve(function () {
  8445.         var newChildren = map$2(data, component.getSystem().build);
  8446.         replaceChildren(component, newChildren);
  8447.       }, component.element);
  8448.     };
  8449.     var insert = function (component, replaceConfig, insertion, childSpec) {
  8450.       var child = component.getSystem().build(childSpec);
  8451.       attachWith(component, child, insertion);
  8452.     };
  8453.     var append = function (component, replaceConfig, replaceState, appendee) {
  8454.       insert(component, replaceConfig, append$2, appendee);
  8455.     };
  8456.     var prepend = function (component, replaceConfig, replaceState, prependee) {
  8457.       insert(component, replaceConfig, prepend$1, prependee);
  8458.     };
  8459.     var remove = function (component, replaceConfig, replaceState, removee) {
  8460.       var children = contents(component);
  8461.       var foundChild = find$2(children, function (child) {
  8462.         return eq(removee.element, child.element);
  8463.       });
  8464.       foundChild.each(detach);
  8465.     };
  8466.     var contents = function (component, _replaceConfig) {
  8467.       return component.components();
  8468.     };
  8469.     var replaceAt = function (component, replaceConfig, replaceState, replaceeIndex, replacer) {
  8470.       var children = contents(component);
  8471.       return Optional.from(children[replaceeIndex]).map(function (replacee) {
  8472.         remove(component, replaceConfig, replaceState, replacee);
  8473.         replacer.each(function (r) {
  8474.           insert(component, replaceConfig, function (p, c) {
  8475.             appendAt(p, c, replaceeIndex);
  8476.           }, r);
  8477.         });
  8478.         return replacee;
  8479.       });
  8480.     };
  8481.     var replaceBy = function (component, replaceConfig, replaceState, replaceePred, replacer) {
  8482.       var children = contents(component);
  8483.       return findIndex$1(children, replaceePred).bind(function (replaceeIndex) {
  8484.         return replaceAt(component, replaceConfig, replaceState, replaceeIndex, replacer);
  8485.       });
  8486.     };
  8487.  
  8488.     var ReplaceApis = /*#__PURE__*/Object.freeze({
  8489.         __proto__: null,
  8490.         append: append,
  8491.         prepend: prepend,
  8492.         remove: remove,
  8493.         replaceAt: replaceAt,
  8494.         replaceBy: replaceBy,
  8495.         set: set,
  8496.         contents: contents
  8497.     });
  8498.  
  8499.     var Replacing = create$5({
  8500.       fields: [],
  8501.       name: 'replacing',
  8502.       apis: ReplaceApis
  8503.     });
  8504.  
  8505.     var transpose = function (obj) {
  8506.       return tupleMap(obj, function (v, k) {
  8507.         return {
  8508.           k: v,
  8509.           v: k
  8510.         };
  8511.       });
  8512.     };
  8513.     var trace = function (items, byItem, byMenu, finish) {
  8514.       return get$c(byMenu, finish).bind(function (triggerItem) {
  8515.         return get$c(items, triggerItem).bind(function (triggerMenu) {
  8516.           var rest = trace(items, byItem, byMenu, triggerMenu);
  8517.           return Optional.some([triggerMenu].concat(rest));
  8518.         });
  8519.       }).getOr([]);
  8520.     };
  8521.     var generate = function (menus, expansions) {
  8522.       var items = {};
  8523.       each(menus, function (menuItems, menu) {
  8524.         each$1(menuItems, function (item) {
  8525.           items[item] = menu;
  8526.         });
  8527.       });
  8528.       var byItem = expansions;
  8529.       var byMenu = transpose(expansions);
  8530.       var menuPaths = map$1(byMenu, function (_triggerItem, submenu) {
  8531.         return [submenu].concat(trace(items, byItem, byMenu, submenu));
  8532.       });
  8533.       return map$1(items, function (menu) {
  8534.         return get$c(menuPaths, menu).getOr([menu]);
  8535.       });
  8536.     };
  8537.  
  8538.     var init$2 = function () {
  8539.       var expansions = Cell({});
  8540.       var menus = Cell({});
  8541.       var paths = Cell({});
  8542.       var primary = value();
  8543.       var directory = Cell({});
  8544.       var clear = function () {
  8545.         expansions.set({});
  8546.         menus.set({});
  8547.         paths.set({});
  8548.         primary.clear();
  8549.       };
  8550.       var isClear = function () {
  8551.         return primary.get().isNone();
  8552.       };
  8553.       var setMenuBuilt = function (menuName, built) {
  8554.         var _a;
  8555.         menus.set(__assign(__assign({}, menus.get()), (_a = {}, _a[menuName] = {
  8556.           type: 'prepared',
  8557.           menu: built
  8558.         }, _a)));
  8559.       };
  8560.       var setContents = function (sPrimary, sMenus, sExpansions, dir) {
  8561.         primary.set(sPrimary);
  8562.         expansions.set(sExpansions);
  8563.         menus.set(sMenus);
  8564.         directory.set(dir);
  8565.         var sPaths = generate(dir, sExpansions);
  8566.         paths.set(sPaths);
  8567.       };
  8568.       var getTriggeringItem = function (menuValue) {
  8569.         return find(expansions.get(), function (v, _k) {
  8570.           return v === menuValue;
  8571.         });
  8572.       };
  8573.       var getTriggerData = function (menuValue, getItemByValue, path) {
  8574.         return getPreparedMenu(menuValue).bind(function (menu) {
  8575.           return getTriggeringItem(menuValue).bind(function (triggeringItemValue) {
  8576.             return getItemByValue(triggeringItemValue).map(function (triggeredItem) {
  8577.               return {
  8578.                 triggeredMenu: menu,
  8579.                 triggeringItem: triggeredItem,
  8580.                 triggeringPath: path
  8581.               };
  8582.             });
  8583.           });
  8584.         });
  8585.       };
  8586.       var getTriggeringPath = function (itemValue, getItemByValue) {
  8587.         var extraPath = filter$2(lookupItem(itemValue).toArray(), function (menuValue) {
  8588.           return getPreparedMenu(menuValue).isSome();
  8589.         });
  8590.         return get$c(paths.get(), itemValue).bind(function (path) {
  8591.           var revPath = reverse(extraPath.concat(path));
  8592.           var triggers = bind$3(revPath, function (menuValue, menuIndex) {
  8593.             return getTriggerData(menuValue, getItemByValue, revPath.slice(0, menuIndex + 1)).fold(function () {
  8594.               return is(primary.get(), menuValue) ? [] : [Optional.none()];
  8595.             }, function (data) {
  8596.               return [Optional.some(data)];
  8597.             });
  8598.           });
  8599.           return sequence(triggers);
  8600.         });
  8601.       };
  8602.       var expand = function (itemValue) {
  8603.         return get$c(expansions.get(), itemValue).map(function (menu) {
  8604.           var current = get$c(paths.get(), itemValue).getOr([]);
  8605.           return [menu].concat(current);
  8606.         });
  8607.       };
  8608.       var collapse = function (itemValue) {
  8609.         return get$c(paths.get(), itemValue).bind(function (path) {
  8610.           return path.length > 1 ? Optional.some(path.slice(1)) : Optional.none();
  8611.         });
  8612.       };
  8613.       var refresh = function (itemValue) {
  8614.         return get$c(paths.get(), itemValue);
  8615.       };
  8616.       var getPreparedMenu = function (menuValue) {
  8617.         return lookupMenu(menuValue).bind(extractPreparedMenu);
  8618.       };
  8619.       var lookupMenu = function (menuValue) {
  8620.         return get$c(menus.get(), menuValue);
  8621.       };
  8622.       var lookupItem = function (itemValue) {
  8623.         return get$c(expansions.get(), itemValue);
  8624.       };
  8625.       var otherMenus = function (path) {
  8626.         var menuValues = directory.get();
  8627.         return difference(keys(menuValues), path);
  8628.       };
  8629.       var getPrimary = function () {
  8630.         return primary.get().bind(getPreparedMenu);
  8631.       };
  8632.       var getMenus = function () {
  8633.         return menus.get();
  8634.       };
  8635.       return {
  8636.         setMenuBuilt: setMenuBuilt,
  8637.         setContents: setContents,
  8638.         expand: expand,
  8639.         refresh: refresh,
  8640.         collapse: collapse,
  8641.         lookupMenu: lookupMenu,
  8642.         lookupItem: lookupItem,
  8643.         otherMenus: otherMenus,
  8644.         getPrimary: getPrimary,
  8645.         getMenus: getMenus,
  8646.         clear: clear,
  8647.         isClear: isClear,
  8648.         getTriggeringPath: getTriggeringPath
  8649.       };
  8650.     };
  8651.     var extractPreparedMenu = function (prep) {
  8652.       return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();
  8653.     };
  8654.     var LayeredState = {
  8655.       init: init$2,
  8656.       extractPreparedMenu: extractPreparedMenu
  8657.     };
  8658.  
  8659.     var make$1 = function (detail, _rawUiSpec) {
  8660.       var submenuParentItems = value();
  8661.       var buildMenus = function (container, primaryName, menus) {
  8662.         return map$1(menus, function (spec, name) {
  8663.           var makeSketch = function () {
  8664.             return Menu.sketch(__assign(__assign({}, spec), {
  8665.               value: name,
  8666.               markers: detail.markers,
  8667.               fakeFocus: detail.fakeFocus,
  8668.               onHighlight: detail.onHighlight,
  8669.               focusManager: detail.fakeFocus ? highlights() : dom$2()
  8670.             }));
  8671.           };
  8672.           return name === primaryName ? {
  8673.             type: 'prepared',
  8674.             menu: container.getSystem().build(makeSketch())
  8675.           } : {
  8676.             type: 'notbuilt',
  8677.             nbMenu: makeSketch
  8678.           };
  8679.         });
  8680.       };
  8681.       var layeredState = LayeredState.init();
  8682.       var setup = function (container) {
  8683.         var componentMap = buildMenus(container, detail.data.primary, detail.data.menus);
  8684.         var directory = toDirectory();
  8685.         layeredState.setContents(detail.data.primary, componentMap, detail.data.expansions, directory);
  8686.         return layeredState.getPrimary();
  8687.       };
  8688.       var getItemValue = function (item) {
  8689.         return Representing.getValue(item).value;
  8690.       };
  8691.       var getItemByValue = function (_container, menus, itemValue) {
  8692.         return findMap(menus, function (menu) {
  8693.           if (!menu.getSystem().isConnected()) {
  8694.             return Optional.none();
  8695.           }
  8696.           var candidates = Highlighting.getCandidates(menu);
  8697.           return find$2(candidates, function (c) {
  8698.             return getItemValue(c) === itemValue;
  8699.           });
  8700.         });
  8701.       };
  8702.       var toDirectory = function (_container) {
  8703.         return map$1(detail.data.menus, function (data, _menuName) {
  8704.           return bind$3(data.items, function (item) {
  8705.             return item.type === 'separator' ? [] : [item.data.value];
  8706.           });
  8707.         });
  8708.       };
  8709.       var setActiveMenu = function (container, menu) {
  8710.         Highlighting.highlight(container, menu);
  8711.         Highlighting.getHighlighted(menu).orThunk(function () {
  8712.           return Highlighting.getFirst(menu);
  8713.         }).each(function (item) {
  8714.           dispatch(container, item.element, focusItem());
  8715.         });
  8716.       };
  8717.       var getMenus = function (state, menuValues) {
  8718.         return cat(map$2(menuValues, function (mv) {
  8719.           return state.lookupMenu(mv).bind(function (prep) {
  8720.             return prep.type === 'prepared' ? Optional.some(prep.menu) : Optional.none();
  8721.           });
  8722.         }));
  8723.       };
  8724.       var closeOthers = function (container, state, path) {
  8725.         var others = getMenus(state, state.otherMenus(path));
  8726.         each$1(others, function (o) {
  8727.           remove$1(o.element, [detail.markers.backgroundMenu]);
  8728.           if (!detail.stayInDom) {
  8729.             Replacing.remove(container, o);
  8730.           }
  8731.         });
  8732.       };
  8733.       var getSubmenuParents = function (container) {
  8734.         return submenuParentItems.get().getOrThunk(function () {
  8735.           var r = {};
  8736.           var items = descendants(container.element, '.' + detail.markers.item);
  8737.           var parentItems = filter$2(items, function (i) {
  8738.             return get$b(i, 'aria-haspopup') === 'true';
  8739.           });
  8740.           each$1(parentItems, function (i) {
  8741.             container.getSystem().getByDom(i).each(function (itemComp) {
  8742.               var key = getItemValue(itemComp);
  8743.               r[key] = itemComp;
  8744.             });
  8745.           });
  8746.           submenuParentItems.set(r);
  8747.           return r;
  8748.         });
  8749.       };
  8750.       var updateAriaExpansions = function (container, path) {
  8751.         var parentItems = getSubmenuParents(container);
  8752.         each(parentItems, function (v, k) {
  8753.           var expanded = contains$1(path, k);
  8754.           set$8(v.element, 'aria-expanded', expanded);
  8755.         });
  8756.       };
  8757.       var updateMenuPath = function (container, state, path) {
  8758.         return Optional.from(path[0]).bind(function (latestMenuName) {
  8759.           return state.lookupMenu(latestMenuName).bind(function (menuPrep) {
  8760.             if (menuPrep.type === 'notbuilt') {
  8761.               return Optional.none();
  8762.             } else {
  8763.               var activeMenu = menuPrep.menu;
  8764.               var rest = getMenus(state, path.slice(1));
  8765.               each$1(rest, function (r) {
  8766.                 add$1(r.element, detail.markers.backgroundMenu);
  8767.               });
  8768.               if (!inBody(activeMenu.element)) {
  8769.                 Replacing.append(container, premade(activeMenu));
  8770.               }
  8771.               remove$1(activeMenu.element, [detail.markers.backgroundMenu]);
  8772.               setActiveMenu(container, activeMenu);
  8773.               closeOthers(container, state, path);
  8774.               return Optional.some(activeMenu);
  8775.             }
  8776.           });
  8777.         });
  8778.       };
  8779.       var ExpandHighlightDecision;
  8780.       (function (ExpandHighlightDecision) {
  8781.         ExpandHighlightDecision[ExpandHighlightDecision['HighlightSubmenu'] = 0] = 'HighlightSubmenu';
  8782.         ExpandHighlightDecision[ExpandHighlightDecision['HighlightParent'] = 1] = 'HighlightParent';
  8783.       }(ExpandHighlightDecision || (ExpandHighlightDecision = {})));
  8784.       var buildIfRequired = function (container, menuName, menuPrep) {
  8785.         if (menuPrep.type === 'notbuilt') {
  8786.           var menu = container.getSystem().build(menuPrep.nbMenu());
  8787.           layeredState.setMenuBuilt(menuName, menu);
  8788.           return menu;
  8789.         } else {
  8790.           return menuPrep.menu;
  8791.         }
  8792.       };
  8793.       var expandRight = function (container, item, decision) {
  8794.         if (decision === void 0) {
  8795.           decision = ExpandHighlightDecision.HighlightSubmenu;
  8796.         }
  8797.         if (item.hasConfigured(Disabling) && Disabling.isDisabled(item)) {
  8798.           return Optional.some(item);
  8799.         } else {
  8800.           var value = getItemValue(item);
  8801.           return layeredState.expand(value).bind(function (path) {
  8802.             updateAriaExpansions(container, path);
  8803.             return Optional.from(path[0]).bind(function (menuName) {
  8804.               return layeredState.lookupMenu(menuName).bind(function (activeMenuPrep) {
  8805.                 var activeMenu = buildIfRequired(container, menuName, activeMenuPrep);
  8806.                 if (!inBody(activeMenu.element)) {
  8807.                   Replacing.append(container, premade(activeMenu));
  8808.                 }
  8809.                 detail.onOpenSubmenu(container, item, activeMenu, reverse(path));
  8810.                 if (decision === ExpandHighlightDecision.HighlightSubmenu) {
  8811.                   Highlighting.highlightFirst(activeMenu);
  8812.                   return updateMenuPath(container, layeredState, path);
  8813.                 } else {
  8814.                   Highlighting.dehighlightAll(activeMenu);
  8815.                   return Optional.some(item);
  8816.                 }
  8817.               });
  8818.             });
  8819.           });
  8820.         }
  8821.       };
  8822.       var collapseLeft = function (container, item) {
  8823.         var value = getItemValue(item);
  8824.         return layeredState.collapse(value).bind(function (path) {
  8825.           updateAriaExpansions(container, path);
  8826.           return updateMenuPath(container, layeredState, path).map(function (activeMenu) {
  8827.             detail.onCollapseMenu(container, item, activeMenu);
  8828.             return activeMenu;
  8829.           });
  8830.         });
  8831.       };
  8832.       var updateView = function (container, item) {
  8833.         var value = getItemValue(item);
  8834.         return layeredState.refresh(value).bind(function (path) {
  8835.           updateAriaExpansions(container, path);
  8836.           return updateMenuPath(container, layeredState, path);
  8837.         });
  8838.       };
  8839.       var onRight = function (container, item) {
  8840.         return inside(item.element) ? Optional.none() : expandRight(container, item, ExpandHighlightDecision.HighlightSubmenu);
  8841.       };
  8842.       var onLeft = function (container, item) {
  8843.         return inside(item.element) ? Optional.none() : collapseLeft(container, item);
  8844.       };
  8845.       var onEscape = function (container, item) {
  8846.         return collapseLeft(container, item).orThunk(function () {
  8847.           return detail.onEscape(container, item).map(function () {
  8848.             return container;
  8849.           });
  8850.         });
  8851.       };
  8852.       var keyOnItem = function (f) {
  8853.         return function (container, simulatedEvent) {
  8854.           return closest$1(simulatedEvent.getSource(), '.' + detail.markers.item).bind(function (target) {
  8855.             return container.getSystem().getByDom(target).toOptional().bind(function (item) {
  8856.               return f(container, item).map(always);
  8857.             });
  8858.           });
  8859.         };
  8860.       };
  8861.       var events = derive$3([
  8862.         run(focus(), function (sandbox, simulatedEvent) {
  8863.           var item = simulatedEvent.event.item;
  8864.           layeredState.lookupItem(getItemValue(item)).each(function () {
  8865.             var menu = simulatedEvent.event.menu;
  8866.             Highlighting.highlight(sandbox, menu);
  8867.             var value = getItemValue(simulatedEvent.event.item);
  8868.             layeredState.refresh(value).each(function (path) {
  8869.               return closeOthers(sandbox, layeredState, path);
  8870.             });
  8871.           });
  8872.         }),
  8873.         runOnExecute(function (component, simulatedEvent) {
  8874.           var target = simulatedEvent.event.target;
  8875.           component.getSystem().getByDom(target).each(function (item) {
  8876.             var itemValue = getItemValue(item);
  8877.             if (itemValue.indexOf('collapse-item') === 0) {
  8878.               collapseLeft(component, item);
  8879.             }
  8880.             expandRight(component, item, ExpandHighlightDecision.HighlightSubmenu).fold(function () {
  8881.               detail.onExecute(component, item);
  8882.             }, noop);
  8883.           });
  8884.         }),
  8885.         runOnAttached(function (container, _simulatedEvent) {
  8886.           setup(container).each(function (primary) {
  8887.             Replacing.append(container, premade(primary));
  8888.             detail.onOpenMenu(container, primary);
  8889.             if (detail.highlightImmediately) {
  8890.               setActiveMenu(container, primary);
  8891.             }
  8892.           });
  8893.         })
  8894.       ].concat(detail.navigateOnHover ? [run(hover(), function (sandbox, simulatedEvent) {
  8895.           var item = simulatedEvent.event.item;
  8896.           updateView(sandbox, item);
  8897.           expandRight(sandbox, item, ExpandHighlightDecision.HighlightParent);
  8898.           detail.onHover(sandbox, item);
  8899.         })] : []));
  8900.       var getActiveItem = function (container) {
  8901.         return Highlighting.getHighlighted(container).bind(Highlighting.getHighlighted);
  8902.       };
  8903.       var collapseMenuApi = function (container) {
  8904.         getActiveItem(container).each(function (currentItem) {
  8905.           collapseLeft(container, currentItem);
  8906.         });
  8907.       };
  8908.       var highlightPrimary = function (container) {
  8909.         layeredState.getPrimary().each(function (primary) {
  8910.           setActiveMenu(container, primary);
  8911.         });
  8912.       };
  8913.       var extractMenuFromContainer = function (container) {
  8914.         return Optional.from(container.components()[0]).filter(function (comp) {
  8915.           return get$b(comp.element, 'role') === 'menu';
  8916.         });
  8917.       };
  8918.       var repositionMenus = function (container) {
  8919.         var maybeActivePrimary = layeredState.getPrimary().bind(function (primary) {
  8920.           return getActiveItem(container).bind(function (currentItem) {
  8921.             var itemValue = getItemValue(currentItem);
  8922.             var allMenus = values(layeredState.getMenus());
  8923.             var preparedMenus = cat(map$2(allMenus, LayeredState.extractPreparedMenu));
  8924.             return layeredState.getTriggeringPath(itemValue, function (v) {
  8925.               return getItemByValue(container, preparedMenus, v);
  8926.             });
  8927.           }).map(function (triggeringPath) {
  8928.             return {
  8929.               primary: primary,
  8930.               triggeringPath: triggeringPath
  8931.             };
  8932.           });
  8933.         });
  8934.         maybeActivePrimary.fold(function () {
  8935.           extractMenuFromContainer(container).each(function (primaryMenu) {
  8936.             detail.onRepositionMenu(container, primaryMenu, []);
  8937.           });
  8938.         }, function (_a) {
  8939.           var primary = _a.primary, triggeringPath = _a.triggeringPath;
  8940.           detail.onRepositionMenu(container, primary, triggeringPath);
  8941.         });
  8942.       };
  8943.       var apis = {
  8944.         collapseMenu: collapseMenuApi,
  8945.         highlightPrimary: highlightPrimary,
  8946.         repositionMenus: repositionMenus
  8947.       };
  8948.       return {
  8949.         uid: detail.uid,
  8950.         dom: detail.dom,
  8951.         markers: detail.markers,
  8952.         behaviours: augment(detail.tmenuBehaviours, [
  8953.           Keying.config({
  8954.             mode: 'special',
  8955.             onRight: keyOnItem(onRight),
  8956.             onLeft: keyOnItem(onLeft),
  8957.             onEscape: keyOnItem(onEscape),
  8958.             focusIn: function (container, _keyInfo) {
  8959.               layeredState.getPrimary().each(function (primary) {
  8960.                 dispatch(container, primary.element, focusItem());
  8961.               });
  8962.             }
  8963.           }),
  8964.           Highlighting.config({
  8965.             highlightClass: detail.markers.selectedMenu,
  8966.             itemClass: detail.markers.menu
  8967.           }),
  8968.           Composing.config({
  8969.             find: function (container) {
  8970.               return Highlighting.getHighlighted(container);
  8971.             }
  8972.           }),
  8973.           Replacing.config({})
  8974.         ]),
  8975.         eventOrder: detail.eventOrder,
  8976.         apis: apis,
  8977.         events: events
  8978.       };
  8979.     };
  8980.     var collapseItem$1 = constant$1('collapse-item');
  8981.  
  8982.     var tieredData = function (primary, menus, expansions) {
  8983.       return {
  8984.         primary: primary,
  8985.         menus: menus,
  8986.         expansions: expansions
  8987.       };
  8988.     };
  8989.     var singleData = function (name, menu) {
  8990.       return {
  8991.         primary: name,
  8992.         menus: wrap(name, menu),
  8993.         expansions: {}
  8994.       };
  8995.     };
  8996.     var collapseItem = function (text) {
  8997.       return {
  8998.         value: generate$4(collapseItem$1()),
  8999.         meta: { text: text }
  9000.       };
  9001.     };
  9002.     var tieredMenu = single({
  9003.       name: 'TieredMenu',
  9004.       configFields: [
  9005.         onStrictKeyboardHandler('onExecute'),
  9006.         onStrictKeyboardHandler('onEscape'),
  9007.         onStrictHandler('onOpenMenu'),
  9008.         onStrictHandler('onOpenSubmenu'),
  9009.         onHandler('onRepositionMenu'),
  9010.         onHandler('onCollapseMenu'),
  9011.         defaulted('highlightImmediately', true),
  9012.         requiredObjOf('data', [
  9013.           required$1('primary'),
  9014.           required$1('menus'),
  9015.           required$1('expansions')
  9016.         ]),
  9017.         defaulted('fakeFocus', false),
  9018.         onHandler('onHighlight'),
  9019.         onHandler('onHover'),
  9020.         tieredMenuMarkers(),
  9021.         required$1('dom'),
  9022.         defaulted('navigateOnHover', true),
  9023.         defaulted('stayInDom', false),
  9024.         field$1('tmenuBehaviours', [
  9025.           Keying,
  9026.           Highlighting,
  9027.           Composing,
  9028.           Replacing
  9029.         ]),
  9030.         defaulted('eventOrder', {})
  9031.       ],
  9032.       apis: {
  9033.         collapseMenu: function (apis, tmenu) {
  9034.           apis.collapseMenu(tmenu);
  9035.         },
  9036.         highlightPrimary: function (apis, tmenu) {
  9037.           apis.highlightPrimary(tmenu);
  9038.         },
  9039.         repositionMenus: function (apis, tmenu) {
  9040.           apis.repositionMenus(tmenu);
  9041.         }
  9042.       },
  9043.       factory: make$1,
  9044.       extraApis: {
  9045.         tieredData: tieredData,
  9046.         singleData: singleData,
  9047.         collapseItem: collapseItem
  9048.       }
  9049.     });
  9050.  
  9051.     var findRoute = function (component, transConfig, transState, route) {
  9052.       return get$c(transConfig.routes, route.start).bind(function (sConfig) {
  9053.         return get$c(sConfig, route.destination);
  9054.       });
  9055.     };
  9056.     var getTransition = function (comp, transConfig, transState) {
  9057.       var route = getCurrentRoute(comp, transConfig);
  9058.       return route.bind(function (r) {
  9059.         return getTransitionOf(comp, transConfig, transState, r);
  9060.       });
  9061.     };
  9062.     var getTransitionOf = function (comp, transConfig, transState, route) {
  9063.       return findRoute(comp, transConfig, transState, route).bind(function (r) {
  9064.         return r.transition.map(function (t) {
  9065.           return {
  9066.             transition: t,
  9067.             route: r
  9068.           };
  9069.         });
  9070.       });
  9071.     };
  9072.     var disableTransition = function (comp, transConfig, transState) {
  9073.       getTransition(comp, transConfig, transState).each(function (routeTransition) {
  9074.         var t = routeTransition.transition;
  9075.         remove$3(comp.element, t.transitionClass);
  9076.         remove$6(comp.element, transConfig.destinationAttr);
  9077.       });
  9078.     };
  9079.     var getNewRoute = function (comp, transConfig, transState, destination) {
  9080.       return {
  9081.         start: get$b(comp.element, transConfig.stateAttr),
  9082.         destination: destination
  9083.       };
  9084.     };
  9085.     var getCurrentRoute = function (comp, transConfig, _transState) {
  9086.       var el = comp.element;
  9087.       return getOpt(el, transConfig.destinationAttr).map(function (destination) {
  9088.         return {
  9089.           start: get$b(comp.element, transConfig.stateAttr),
  9090.           destination: destination
  9091.         };
  9092.       });
  9093.     };
  9094.     var jumpTo = function (comp, transConfig, transState, destination) {
  9095.       disableTransition(comp, transConfig, transState);
  9096.       if (has$1(comp.element, transConfig.stateAttr) && get$b(comp.element, transConfig.stateAttr) !== destination) {
  9097.         transConfig.onFinish(comp, destination);
  9098.       }
  9099.       set$8(comp.element, transConfig.stateAttr, destination);
  9100.     };
  9101.     var fasttrack = function (comp, transConfig, _transState, _destination) {
  9102.       if (has$1(comp.element, transConfig.destinationAttr)) {
  9103.         getOpt(comp.element, transConfig.destinationAttr).each(function (destination) {
  9104.           set$8(comp.element, transConfig.stateAttr, destination);
  9105.         });
  9106.         remove$6(comp.element, transConfig.destinationAttr);
  9107.       }
  9108.     };
  9109.     var progressTo = function (comp, transConfig, transState, destination) {
  9110.       fasttrack(comp, transConfig);
  9111.       var route = getNewRoute(comp, transConfig, transState, destination);
  9112.       getTransitionOf(comp, transConfig, transState, route).fold(function () {
  9113.         jumpTo(comp, transConfig, transState, destination);
  9114.       }, function (routeTransition) {
  9115.         disableTransition(comp, transConfig, transState);
  9116.         var t = routeTransition.transition;
  9117.         add$1(comp.element, t.transitionClass);
  9118.         set$8(comp.element, transConfig.destinationAttr, destination);
  9119.       });
  9120.     };
  9121.     var getState = function (comp, transConfig, _transState) {
  9122.       return getOpt(comp.element, transConfig.stateAttr);
  9123.     };
  9124.  
  9125.     var TransitionApis = /*#__PURE__*/Object.freeze({
  9126.         __proto__: null,
  9127.         findRoute: findRoute,
  9128.         disableTransition: disableTransition,
  9129.         getCurrentRoute: getCurrentRoute,
  9130.         jumpTo: jumpTo,
  9131.         progressTo: progressTo,
  9132.         getState: getState
  9133.     });
  9134.  
  9135.     var events$1 = function (transConfig, transState) {
  9136.       return derive$3([
  9137.         run(transitionend(), function (component, simulatedEvent) {
  9138.           var raw = simulatedEvent.event.raw;
  9139.           getCurrentRoute(component, transConfig).each(function (route) {
  9140.             findRoute(component, transConfig, transState, route).each(function (rInfo) {
  9141.               rInfo.transition.each(function (rTransition) {
  9142.                 if (raw.propertyName === rTransition.property) {
  9143.                   jumpTo(component, transConfig, transState, route.destination);
  9144.                   transConfig.onTransition(component, route);
  9145.                 }
  9146.               });
  9147.             });
  9148.           });
  9149.         }),
  9150.         runOnAttached(function (comp, _se) {
  9151.           jumpTo(comp, transConfig, transState, transConfig.initialState);
  9152.         })
  9153.       ]);
  9154.     };
  9155.  
  9156.     var ActiveTransitioning = /*#__PURE__*/Object.freeze({
  9157.         __proto__: null,
  9158.         events: events$1
  9159.     });
  9160.  
  9161.     var TransitionSchema = [
  9162.       defaulted('destinationAttr', 'data-transitioning-destination'),
  9163.       defaulted('stateAttr', 'data-transitioning-state'),
  9164.       required$1('initialState'),
  9165.       onHandler('onTransition'),
  9166.       onHandler('onFinish'),
  9167.       requiredOf('routes', setOf(Result.value, setOf(Result.value, objOfOnly([optionObjOfOnly('transition', [
  9168.           required$1('property'),
  9169.           required$1('transitionClass')
  9170.         ])]))))
  9171.     ];
  9172.  
  9173.     var createRoutes = function (routes) {
  9174.       var r = {};
  9175.       each(routes, function (v, k) {
  9176.         var waypoints = k.split('<->');
  9177.         r[waypoints[0]] = wrap(waypoints[1], v);
  9178.         r[waypoints[1]] = wrap(waypoints[0], v);
  9179.       });
  9180.       return r;
  9181.     };
  9182.     var createBistate = function (first, second, transitions) {
  9183.       return wrapAll([
  9184.         {
  9185.           key: first,
  9186.           value: wrap(second, transitions)
  9187.         },
  9188.         {
  9189.           key: second,
  9190.           value: wrap(first, transitions)
  9191.         }
  9192.       ]);
  9193.     };
  9194.     var createTristate = function (first, second, third, transitions) {
  9195.       return wrapAll([
  9196.         {
  9197.           key: first,
  9198.           value: wrapAll([
  9199.             {
  9200.               key: second,
  9201.               value: transitions
  9202.             },
  9203.             {
  9204.               key: third,
  9205.               value: transitions
  9206.             }
  9207.           ])
  9208.         },
  9209.         {
  9210.           key: second,
  9211.           value: wrapAll([
  9212.             {
  9213.               key: first,
  9214.               value: transitions
  9215.             },
  9216.             {
  9217.               key: third,
  9218.               value: transitions
  9219.             }
  9220.           ])
  9221.         },
  9222.         {
  9223.           key: third,
  9224.           value: wrapAll([
  9225.             {
  9226.               key: first,
  9227.               value: transitions
  9228.             },
  9229.             {
  9230.               key: second,
  9231.               value: transitions
  9232.             }
  9233.           ])
  9234.         }
  9235.       ]);
  9236.     };
  9237.     var Transitioning = create$5({
  9238.       fields: TransitionSchema,
  9239.       name: 'transitioning',
  9240.       active: ActiveTransitioning,
  9241.       apis: TransitionApis,
  9242.       extra: {
  9243.         createRoutes: createRoutes,
  9244.         createBistate: createBistate,
  9245.         createTristate: createTristate
  9246.       }
  9247.     });
  9248.  
  9249.     var scrollableStyle = resolve('scrollable');
  9250.     var register$2 = function (element) {
  9251.       add$1(element, scrollableStyle);
  9252.     };
  9253.     var deregister = function (element) {
  9254.       remove$3(element, scrollableStyle);
  9255.     };
  9256.     var scrollable = scrollableStyle;
  9257.  
  9258.     var getValue = function (item) {
  9259.       return get$c(item, 'format').getOr(item.title);
  9260.     };
  9261.     var convert = function (formats, memMenuThunk) {
  9262.       var mainMenu = makeMenu('Styles', [].concat(map$2(formats.items, function (k) {
  9263.         return makeItem(getValue(k), k.title, k.isSelected(), k.getPreview(), hasNonNullableKey(formats.expansions, getValue(k)));
  9264.       })), memMenuThunk, false);
  9265.       var submenus = map$1(formats.menus, function (menuItems, menuName) {
  9266.         var items = map$2(menuItems, function (item) {
  9267.           return makeItem(getValue(item), item.title, item.isSelected !== undefined ? item.isSelected() : false, item.getPreview !== undefined ? item.getPreview() : '', hasNonNullableKey(formats.expansions, getValue(item)));
  9268.         });
  9269.         return makeMenu(menuName, items, memMenuThunk, true);
  9270.       });
  9271.       var menus = deepMerge(submenus, wrap('styles', mainMenu));
  9272.       var tmenu = tieredMenu.tieredData('styles', menus, formats.expansions);
  9273.       return { tmenu: tmenu };
  9274.     };
  9275.     var makeItem = function (value, text, selected, preview, isMenu) {
  9276.       return {
  9277.         data: {
  9278.           value: value,
  9279.           text: text
  9280.         },
  9281.         type: 'item',
  9282.         dom: {
  9283.           tag: 'div',
  9284.           classes: isMenu ? [resolve('styles-item-is-menu')] : []
  9285.         },
  9286.         toggling: {
  9287.           toggleOnExecute: false,
  9288.           toggleClass: resolve('format-matches'),
  9289.           selected: selected
  9290.         },
  9291.         itemBehaviours: derive$2(isMenu ? [] : [format(value, function (comp, status) {
  9292.             var toggle = status ? Toggling.on : Toggling.off;
  9293.             toggle(comp);
  9294.           })]),
  9295.         components: [{
  9296.             dom: {
  9297.               tag: 'div',
  9298.               attributes: { style: preview },
  9299.               innerHtml: text
  9300.             }
  9301.           }]
  9302.       };
  9303.     };
  9304.     var makeMenu = function (value, items, memMenuThunk, collapsable) {
  9305.       return {
  9306.         value: value,
  9307.         dom: { tag: 'div' },
  9308.         components: [
  9309.           Button.sketch({
  9310.             dom: {
  9311.               tag: 'div',
  9312.               classes: [resolve('styles-collapser')]
  9313.             },
  9314.             components: collapsable ? [
  9315.               {
  9316.                 dom: {
  9317.                   tag: 'span',
  9318.                   classes: [resolve('styles-collapse-icon')]
  9319.                 }
  9320.               },
  9321.               text(value)
  9322.             ] : [text(value)],
  9323.             action: function (item) {
  9324.               if (collapsable) {
  9325.                 var comp = memMenuThunk().get(item);
  9326.                 tieredMenu.collapseMenu(comp);
  9327.               }
  9328.             }
  9329.           }),
  9330.           {
  9331.             dom: {
  9332.               tag: 'div',
  9333.               classes: [resolve('styles-menu-items-container')]
  9334.             },
  9335.             components: [Menu.parts.items({})],
  9336.             behaviours: derive$2([config('adhoc-scrollable-menu', [
  9337.                 runOnAttached(function (component, _simulatedEvent) {
  9338.                   set$5(component.element, 'overflow-y', 'auto');
  9339.                   set$5(component.element, '-webkit-overflow-scrolling', 'touch');
  9340.                   register$2(component.element);
  9341.                 }),
  9342.                 runOnDetached(function (component) {
  9343.                   remove$2(component.element, 'overflow-y');
  9344.                   remove$2(component.element, '-webkit-overflow-scrolling');
  9345.                   deregister(component.element);
  9346.                 })
  9347.               ])])
  9348.           }
  9349.         ],
  9350.         items: items,
  9351.         menuBehaviours: derive$2([Transitioning.config({
  9352.             initialState: 'after',
  9353.             routes: Transitioning.createTristate('before', 'current', 'after', {
  9354.               transition: {
  9355.                 property: 'transform',
  9356.                 transitionClass: 'transitioning'
  9357.               }
  9358.             })
  9359.           })])
  9360.       };
  9361.     };
  9362.     var sketch$1 = function (settings) {
  9363.       var dataset = convert(settings.formats, function () {
  9364.         return memMenu;
  9365.       });
  9366.       var memMenu = record(tieredMenu.sketch({
  9367.         dom: {
  9368.           tag: 'div',
  9369.           classes: [resolve('styles-menu')]
  9370.         },
  9371.         components: [],
  9372.         fakeFocus: true,
  9373.         stayInDom: true,
  9374.         onExecute: function (_tmenu, item) {
  9375.           var v = Representing.getValue(item);
  9376.           settings.handle(item, v.value);
  9377.           return Optional.none();
  9378.         },
  9379.         onEscape: function () {
  9380.           return Optional.none();
  9381.         },
  9382.         onOpenMenu: function (container, menu) {
  9383.           var w = get$5(container.element);
  9384.           set$4(menu.element, w);
  9385.           Transitioning.jumpTo(menu, 'current');
  9386.         },
  9387.         onOpenSubmenu: function (container, item, submenu) {
  9388.           var w = get$5(container.element);
  9389.           var menu = ancestor(item.element, '[role="menu"]').getOrDie('hacky');
  9390.           var menuComp = container.getSystem().getByDom(menu).getOrDie();
  9391.           set$4(submenu.element, w);
  9392.           Transitioning.progressTo(menuComp, 'before');
  9393.           Transitioning.jumpTo(submenu, 'after');
  9394.           Transitioning.progressTo(submenu, 'current');
  9395.         },
  9396.         onCollapseMenu: function (container, item, menu) {
  9397.           var submenu = ancestor(item.element, '[role="menu"]').getOrDie('hacky');
  9398.           var submenuComp = container.getSystem().getByDom(submenu).getOrDie();
  9399.           Transitioning.progressTo(submenuComp, 'after');
  9400.           Transitioning.progressTo(menu, 'current');
  9401.         },
  9402.         navigateOnHover: false,
  9403.         highlightImmediately: true,
  9404.         data: dataset.tmenu,
  9405.         markers: {
  9406.           backgroundMenu: resolve('styles-background-menu'),
  9407.           menu: resolve('styles-menu'),
  9408.           selectedMenu: resolve('styles-selected-menu'),
  9409.           item: resolve('styles-item'),
  9410.           selectedItem: resolve('styles-selected-item')
  9411.         }
  9412.       }));
  9413.       return memMenu.asSpec();
  9414.     };
  9415.  
  9416.     var getFromExpandingItem = function (item) {
  9417.       var newItem = deepMerge(exclude(item, ['items']), { menu: true });
  9418.       var rest = expand(item.items);
  9419.       var newMenus = deepMerge(rest.menus, wrap(item.title, rest.items));
  9420.       var newExpansions = deepMerge(rest.expansions, wrap(item.title, item.title));
  9421.       return {
  9422.         item: newItem,
  9423.         menus: newMenus,
  9424.         expansions: newExpansions
  9425.       };
  9426.     };
  9427.     var getFromItem = function (item) {
  9428.       return hasNonNullableKey(item, 'items') ? getFromExpandingItem(item) : {
  9429.         item: item,
  9430.         menus: {},
  9431.         expansions: {}
  9432.       };
  9433.     };
  9434.     var expand = function (items) {
  9435.       return foldr(items, function (acc, item) {
  9436.         var newData = getFromItem(item);
  9437.         return {
  9438.           menus: deepMerge(acc.menus, newData.menus),
  9439.           items: [newData.item].concat(acc.items),
  9440.           expansions: deepMerge(acc.expansions, newData.expansions)
  9441.         };
  9442.       }, {
  9443.         menus: {},
  9444.         expansions: {},
  9445.         items: []
  9446.       });
  9447.     };
  9448.  
  9449.     var register$1 = function (editor) {
  9450.       var isSelectedFor = function (format) {
  9451.         return function () {
  9452.           return editor.formatter.match(format);
  9453.         };
  9454.       };
  9455.       var getPreview = function (format) {
  9456.         return function () {
  9457.           return editor.formatter.getCssText(format);
  9458.         };
  9459.       };
  9460.       var enrichSupported = function (item) {
  9461.         return deepMerge(item, {
  9462.           isSelected: isSelectedFor(item.format),
  9463.           getPreview: getPreview(item.format)
  9464.         });
  9465.       };
  9466.       var enrichMenu = function (item) {
  9467.         return deepMerge(item, {
  9468.           isSelected: never,
  9469.           getPreview: constant$1('')
  9470.         });
  9471.       };
  9472.       var enrichCustom = function (item) {
  9473.         var formatName = generate$4(item.title);
  9474.         var newItem = deepMerge(item, {
  9475.           format: formatName,
  9476.           isSelected: isSelectedFor(formatName),
  9477.           getPreview: getPreview(formatName)
  9478.         });
  9479.         editor.formatter.register(formatName, newItem);
  9480.         return newItem;
  9481.       };
  9482.       var doEnrich = function (items) {
  9483.         return map$2(items, function (item) {
  9484.           if (hasNonNullableKey(item, 'items')) {
  9485.             var newItems = doEnrich(item.items);
  9486.             return deepMerge(enrichMenu(item), { items: newItems });
  9487.           } else if (hasNonNullableKey(item, 'format')) {
  9488.             return enrichSupported(item);
  9489.           } else {
  9490.             return enrichCustom(item);
  9491.           }
  9492.         });
  9493.       };
  9494.       return doEnrich(getStyleFormats(editor));
  9495.     };
  9496.     var prune = function (editor, formats) {
  9497.       var doPrune = function (items) {
  9498.         return bind$3(items, function (item) {
  9499.           if (item.items !== undefined) {
  9500.             var newItems = doPrune(item.items);
  9501.             return newItems.length > 0 ? [item] : [];
  9502.           } else {
  9503.             var keep = hasNonNullableKey(item, 'format') ? editor.formatter.canApply(item.format) : true;
  9504.             return keep ? [item] : [];
  9505.           }
  9506.         });
  9507.       };
  9508.       var prunedItems = doPrune(formats);
  9509.       return expand(prunedItems);
  9510.     };
  9511.     var ui = function (editor, formats, onDone) {
  9512.       var pruned = prune(editor, formats);
  9513.       return sketch$1({
  9514.         formats: pruned,
  9515.         handle: function (item, value) {
  9516.           editor.undoManager.transact(function () {
  9517.             if (Toggling.isOn(item)) {
  9518.               editor.formatter.remove(value);
  9519.             } else {
  9520.               editor.formatter.apply(value);
  9521.             }
  9522.           });
  9523.           onDone();
  9524.         }
  9525.       });
  9526.     };
  9527.  
  9528.     var extract = function (rawToolbar) {
  9529.       var toolbar = rawToolbar.replace(/\|/g, ' ').trim();
  9530.       return toolbar.length > 0 ? toolbar.split(/\s+/) : [];
  9531.     };
  9532.     var identifyFromArray = function (toolbar) {
  9533.       return bind$3(toolbar, function (item) {
  9534.         return isArray(item) ? identifyFromArray(item) : extract(item);
  9535.       });
  9536.     };
  9537.     var identify = function (editor) {
  9538.       var toolbar = getToolbar(editor);
  9539.       return isArray(toolbar) ? identifyFromArray(toolbar) : extract(toolbar);
  9540.     };
  9541.     var setup$3 = function (realm, editor) {
  9542.       var commandSketch = function (name) {
  9543.         return function () {
  9544.           return forToolbarCommand(editor, name);
  9545.         };
  9546.       };
  9547.       var stateCommandSketch = function (name) {
  9548.         return function () {
  9549.           return forToolbarStateCommand(editor, name);
  9550.         };
  9551.       };
  9552.       var actionSketch = function (name, query, action) {
  9553.         return function () {
  9554.           return forToolbarStateAction(editor, name, query, action);
  9555.         };
  9556.       };
  9557.       var undo = commandSketch('undo');
  9558.       var redo = commandSketch('redo');
  9559.       var bold = stateCommandSketch('bold');
  9560.       var italic = stateCommandSketch('italic');
  9561.       var underline = stateCommandSketch('underline');
  9562.       var removeformat = commandSketch('removeformat');
  9563.       var link = function () {
  9564.         return sketch$2(realm, editor);
  9565.       };
  9566.       var unlink = actionSketch('unlink', 'link', function () {
  9567.         editor.execCommand('unlink', null, false);
  9568.       });
  9569.       var image = function () {
  9570.         return sketch$5(editor);
  9571.       };
  9572.       var bullist = actionSketch('unordered-list', 'ul', function () {
  9573.         editor.execCommand('InsertUnorderedList', null, false);
  9574.       });
  9575.       var numlist = actionSketch('ordered-list', 'ol', function () {
  9576.         editor.execCommand('InsertOrderedList', null, false);
  9577.       });
  9578.       var fontsizeselect = function () {
  9579.         return sketch$6(realm, editor);
  9580.       };
  9581.       var forecolor = function () {
  9582.         return sketch$8(realm, editor);
  9583.       };
  9584.       var styleFormats = register$1(editor);
  9585.       var styleFormatsMenu = function () {
  9586.         return ui(editor, styleFormats, function () {
  9587.           editor.fire('scrollIntoView');
  9588.         });
  9589.       };
  9590.       var styleselect = function () {
  9591.         return forToolbar('style-formats', function (button) {
  9592.           editor.fire('toReading');
  9593.           realm.dropup.appear(styleFormatsMenu, Toggling.on, button);
  9594.         }, derive$2([
  9595.           Toggling.config({
  9596.             toggleClass: resolve('toolbar-button-selected'),
  9597.             toggleOnExecute: false,
  9598.             aria: { mode: 'pressed' }
  9599.           }),
  9600.           Receiving.config({
  9601.             channels: wrapAll([
  9602.               receive(orientationChanged, Toggling.off),
  9603.               receive(dropupDismissed, Toggling.off)
  9604.             ])
  9605.           })
  9606.         ]), editor);
  9607.       };
  9608.       var feature = function (prereq, sketch) {
  9609.         return {
  9610.           isSupported: function () {
  9611.             var buttons = editor.ui.registry.getAll().buttons;
  9612.             return prereq.forall(function (p) {
  9613.               return hasNonNullableKey(buttons, p);
  9614.             });
  9615.           },
  9616.           sketch: sketch
  9617.         };
  9618.       };
  9619.       return {
  9620.         undo: feature(Optional.none(), undo),
  9621.         redo: feature(Optional.none(), redo),
  9622.         bold: feature(Optional.none(), bold),
  9623.         italic: feature(Optional.none(), italic),
  9624.         underline: feature(Optional.none(), underline),
  9625.         removeformat: feature(Optional.none(), removeformat),
  9626.         link: feature(Optional.none(), link),
  9627.         unlink: feature(Optional.none(), unlink),
  9628.         image: feature(Optional.none(), image),
  9629.         bullist: feature(Optional.some('bullist'), bullist),
  9630.         numlist: feature(Optional.some('numlist'), numlist),
  9631.         fontsizeselect: feature(Optional.none(), fontsizeselect),
  9632.         forecolor: feature(Optional.none(), forecolor),
  9633.         styleselect: feature(Optional.none(), styleselect)
  9634.       };
  9635.     };
  9636.     var detect = function (editor, features) {
  9637.       var itemNames = identify(editor);
  9638.       var present = {};
  9639.       return bind$3(itemNames, function (iName) {
  9640.         var r = !hasNonNullableKey(present, iName) && hasNonNullableKey(features, iName) && features[iName].isSupported() ? [features[iName].sketch()] : [];
  9641.         present[iName] = true;
  9642.         return r;
  9643.       });
  9644.     };
  9645.  
  9646.     var mkEvent = function (target, x, y, stop, prevent, kill, raw) {
  9647.       return {
  9648.         target: target,
  9649.         x: x,
  9650.         y: y,
  9651.         stop: stop,
  9652.         prevent: prevent,
  9653.         kill: kill,
  9654.         raw: raw
  9655.       };
  9656.     };
  9657.     var fromRawEvent = function (rawEvent) {
  9658.       var target = SugarElement.fromDom(getOriginalEventTarget(rawEvent).getOr(rawEvent.target));
  9659.       var stop = function () {
  9660.         return rawEvent.stopPropagation();
  9661.       };
  9662.       var prevent = function () {
  9663.         return rawEvent.preventDefault();
  9664.       };
  9665.       var kill = compose(prevent, stop);
  9666.       return mkEvent(target, rawEvent.clientX, rawEvent.clientY, stop, prevent, kill, rawEvent);
  9667.     };
  9668.     var handle = function (filter, handler) {
  9669.       return function (rawEvent) {
  9670.         if (filter(rawEvent)) {
  9671.           handler(fromRawEvent(rawEvent));
  9672.         }
  9673.       };
  9674.     };
  9675.     var binder = function (element, event, filter, handler, useCapture) {
  9676.       var wrapped = handle(filter, handler);
  9677.       element.dom.addEventListener(event, wrapped, useCapture);
  9678.       return { unbind: curry(unbind, element, event, wrapped, useCapture) };
  9679.     };
  9680.     var bind$1 = function (element, event, filter, handler) {
  9681.       return binder(element, event, filter, handler, false);
  9682.     };
  9683.     var capture$1 = function (element, event, filter, handler) {
  9684.       return binder(element, event, filter, handler, true);
  9685.     };
  9686.     var unbind = function (element, event, handler, useCapture) {
  9687.       element.dom.removeEventListener(event, handler, useCapture);
  9688.     };
  9689.  
  9690.     var filter = always;
  9691.     var bind = function (element, event, handler) {
  9692.       return bind$1(element, event, filter, handler);
  9693.     };
  9694.     var capture = function (element, event, handler) {
  9695.       return capture$1(element, event, filter, handler);
  9696.     };
  9697.  
  9698.     var global$2 = tinymce.util.Tools.resolve('tinymce.util.Delay');
  9699.  
  9700.     var INTERVAL = 50;
  9701.     var INSURANCE = 1000 / INTERVAL;
  9702.     var get$1 = function (outerWindow) {
  9703.       var isPortrait = outerWindow.matchMedia('(orientation: portrait)').matches;
  9704.       return { isPortrait: constant$1(isPortrait) };
  9705.     };
  9706.     var getActualWidth = function (outerWindow) {
  9707.       var isIos = detect$1().os.isiOS();
  9708.       var isPortrait = get$1(outerWindow).isPortrait();
  9709.       return isIos && !isPortrait ? outerWindow.screen.height : outerWindow.screen.width;
  9710.     };
  9711.     var onChange = function (outerWindow, listeners) {
  9712.       var win = SugarElement.fromDom(outerWindow);
  9713.       var poller = null;
  9714.       var change = function () {
  9715.         global$2.clearInterval(poller);
  9716.         var orientation = get$1(outerWindow);
  9717.         listeners.onChange(orientation);
  9718.         onAdjustment(function () {
  9719.           listeners.onReady(orientation);
  9720.         });
  9721.       };
  9722.       var orientationHandle = bind(win, 'orientationchange', change);
  9723.       var onAdjustment = function (f) {
  9724.         global$2.clearInterval(poller);
  9725.         var flag = outerWindow.innerHeight;
  9726.         var insurance = 0;
  9727.         poller = global$2.setInterval(function () {
  9728.           if (flag !== outerWindow.innerHeight) {
  9729.             global$2.clearInterval(poller);
  9730.             f(Optional.some(outerWindow.innerHeight));
  9731.           } else if (insurance > INSURANCE) {
  9732.             global$2.clearInterval(poller);
  9733.             f(Optional.none());
  9734.           }
  9735.           insurance++;
  9736.         }, INTERVAL);
  9737.       };
  9738.       var destroy = function () {
  9739.         orientationHandle.unbind();
  9740.       };
  9741.       return {
  9742.         onAdjustment: onAdjustment,
  9743.         destroy: destroy
  9744.       };
  9745.     };
  9746.  
  9747.     var setStart = function (rng, situ) {
  9748.       situ.fold(function (e) {
  9749.         rng.setStartBefore(e.dom);
  9750.       }, function (e, o) {
  9751.         rng.setStart(e.dom, o);
  9752.       }, function (e) {
  9753.         rng.setStartAfter(e.dom);
  9754.       });
  9755.     };
  9756.     var setFinish = function (rng, situ) {
  9757.       situ.fold(function (e) {
  9758.         rng.setEndBefore(e.dom);
  9759.       }, function (e, o) {
  9760.         rng.setEnd(e.dom, o);
  9761.       }, function (e) {
  9762.         rng.setEndAfter(e.dom);
  9763.       });
  9764.     };
  9765.     var relativeToNative = function (win, startSitu, finishSitu) {
  9766.       var range = win.document.createRange();
  9767.       setStart(range, startSitu);
  9768.       setFinish(range, finishSitu);
  9769.       return range;
  9770.     };
  9771.     var exactToNative = function (win, start, soffset, finish, foffset) {
  9772.       var rng = win.document.createRange();
  9773.       rng.setStart(start.dom, soffset);
  9774.       rng.setEnd(finish.dom, foffset);
  9775.       return rng;
  9776.     };
  9777.     var toRect$1 = function (rect) {
  9778.       return {
  9779.         left: rect.left,
  9780.         top: rect.top,
  9781.         right: rect.right,
  9782.         bottom: rect.bottom,
  9783.         width: rect.width,
  9784.         height: rect.height
  9785.       };
  9786.     };
  9787.     var getFirstRect$1 = function (rng) {
  9788.       var rects = rng.getClientRects();
  9789.       var rect = rects.length > 0 ? rects[0] : rng.getBoundingClientRect();
  9790.       return rect.width > 0 || rect.height > 0 ? Optional.some(rect).map(toRect$1) : Optional.none();
  9791.     };
  9792.  
  9793.     var adt$3 = Adt.generate([
  9794.       {
  9795.         ltr: [
  9796.           'start',
  9797.           'soffset',
  9798.           'finish',
  9799.           'foffset'
  9800.         ]
  9801.       },
  9802.       {
  9803.         rtl: [
  9804.           'start',
  9805.           'soffset',
  9806.           'finish',
  9807.           'foffset'
  9808.         ]
  9809.       }
  9810.     ]);
  9811.     var fromRange = function (win, type, range) {
  9812.       return type(SugarElement.fromDom(range.startContainer), range.startOffset, SugarElement.fromDom(range.endContainer), range.endOffset);
  9813.     };
  9814.     var getRanges = function (win, selection) {
  9815.       return selection.match({
  9816.         domRange: function (rng) {
  9817.           return {
  9818.             ltr: constant$1(rng),
  9819.             rtl: Optional.none
  9820.           };
  9821.         },
  9822.         relative: function (startSitu, finishSitu) {
  9823.           return {
  9824.             ltr: cached(function () {
  9825.               return relativeToNative(win, startSitu, finishSitu);
  9826.             }),
  9827.             rtl: cached(function () {
  9828.               return Optional.some(relativeToNative(win, finishSitu, startSitu));
  9829.             })
  9830.           };
  9831.         },
  9832.         exact: function (start, soffset, finish, foffset) {
  9833.           return {
  9834.             ltr: cached(function () {
  9835.               return exactToNative(win, start, soffset, finish, foffset);
  9836.             }),
  9837.             rtl: cached(function () {
  9838.               return Optional.some(exactToNative(win, finish, foffset, start, soffset));
  9839.             })
  9840.           };
  9841.         }
  9842.       });
  9843.     };
  9844.     var doDiagnose = function (win, ranges) {
  9845.       var rng = ranges.ltr();
  9846.       if (rng.collapsed) {
  9847.         var reversed = ranges.rtl().filter(function (rev) {
  9848.           return rev.collapsed === false;
  9849.         });
  9850.         return reversed.map(function (rev) {
  9851.           return adt$3.rtl(SugarElement.fromDom(rev.endContainer), rev.endOffset, SugarElement.fromDom(rev.startContainer), rev.startOffset);
  9852.         }).getOrThunk(function () {
  9853.           return fromRange(win, adt$3.ltr, rng);
  9854.         });
  9855.       } else {
  9856.         return fromRange(win, adt$3.ltr, rng);
  9857.       }
  9858.     };
  9859.     var diagnose = function (win, selection) {
  9860.       var ranges = getRanges(win, selection);
  9861.       return doDiagnose(win, ranges);
  9862.     };
  9863.     var asLtrRange = function (win, selection) {
  9864.       var diagnosis = diagnose(win, selection);
  9865.       return diagnosis.match({
  9866.         ltr: function (start, soffset, finish, foffset) {
  9867.           var rng = win.document.createRange();
  9868.           rng.setStart(start.dom, soffset);
  9869.           rng.setEnd(finish.dom, foffset);
  9870.           return rng;
  9871.         },
  9872.         rtl: function (start, soffset, finish, foffset) {
  9873.           var rng = win.document.createRange();
  9874.           rng.setStart(finish.dom, foffset);
  9875.           rng.setEnd(start.dom, soffset);
  9876.           return rng;
  9877.         }
  9878.       });
  9879.     };
  9880.     adt$3.ltr;
  9881.     adt$3.rtl;
  9882.  
  9883.     var create$3 = function (start, soffset, finish, foffset) {
  9884.       return {
  9885.         start: start,
  9886.         soffset: soffset,
  9887.         finish: finish,
  9888.         foffset: foffset
  9889.       };
  9890.     };
  9891.     var SimRange = { create: create$3 };
  9892.  
  9893.     var NodeValue = function (is, name) {
  9894.       var get = function (element) {
  9895.         if (!is(element)) {
  9896.           throw new Error('Can only get ' + name + ' value of a ' + name + ' node');
  9897.         }
  9898.         return getOption(element).getOr('');
  9899.       };
  9900.       var getOption = function (element) {
  9901.         return is(element) ? Optional.from(element.dom.nodeValue) : Optional.none();
  9902.       };
  9903.       var set = function (element, value) {
  9904.         if (!is(element)) {
  9905.           throw new Error('Can only set raw ' + name + ' value of a ' + name + ' node');
  9906.         }
  9907.         element.dom.nodeValue = value;
  9908.       };
  9909.       return {
  9910.         get: get,
  9911.         getOption: getOption,
  9912.         set: set
  9913.       };
  9914.     };
  9915.  
  9916.     var api = NodeValue(isText, 'text');
  9917.     var getOption = function (element) {
  9918.       return api.getOption(element);
  9919.     };
  9920.  
  9921.     var getEnd = function (element) {
  9922.       return name$1(element) === 'img' ? 1 : getOption(element).fold(function () {
  9923.         return children(element).length;
  9924.       }, function (v) {
  9925.         return v.length;
  9926.       });
  9927.     };
  9928.  
  9929.     var adt$2 = Adt.generate([
  9930.       { before: ['element'] },
  9931.       {
  9932.         on: [
  9933.           'element',
  9934.           'offset'
  9935.         ]
  9936.       },
  9937.       { after: ['element'] }
  9938.     ]);
  9939.     var cata = function (subject, onBefore, onOn, onAfter) {
  9940.       return subject.fold(onBefore, onOn, onAfter);
  9941.     };
  9942.     var getStart$1 = function (situ) {
  9943.       return situ.fold(identity, identity, identity);
  9944.     };
  9945.     var before = adt$2.before;
  9946.     var on = adt$2.on;
  9947.     var after$1 = adt$2.after;
  9948.     var Situ = {
  9949.       before: before,
  9950.       on: on,
  9951.       after: after$1,
  9952.       cata: cata,
  9953.       getStart: getStart$1
  9954.     };
  9955.  
  9956.     var adt$1 = Adt.generate([
  9957.       { domRange: ['rng'] },
  9958.       {
  9959.         relative: [
  9960.           'startSitu',
  9961.           'finishSitu'
  9962.         ]
  9963.       },
  9964.       {
  9965.         exact: [
  9966.           'start',
  9967.           'soffset',
  9968.           'finish',
  9969.           'foffset'
  9970.         ]
  9971.       }
  9972.     ]);
  9973.     var exactFromRange = function (simRange) {
  9974.       return adt$1.exact(simRange.start, simRange.soffset, simRange.finish, simRange.foffset);
  9975.     };
  9976.     var getStart = function (selection) {
  9977.       return selection.match({
  9978.         domRange: function (rng) {
  9979.           return SugarElement.fromDom(rng.startContainer);
  9980.         },
  9981.         relative: function (startSitu, _finishSitu) {
  9982.           return Situ.getStart(startSitu);
  9983.         },
  9984.         exact: function (start, _soffset, _finish, _foffset) {
  9985.           return start;
  9986.         }
  9987.       });
  9988.     };
  9989.     var domRange = adt$1.domRange;
  9990.     var relative = adt$1.relative;
  9991.     var exact = adt$1.exact;
  9992.     var getWin$1 = function (selection) {
  9993.       var start = getStart(selection);
  9994.       return defaultView(start);
  9995.     };
  9996.     var range = SimRange.create;
  9997.     var SimSelection = {
  9998.       domRange: domRange,
  9999.       relative: relative,
  10000.       exact: exact,
  10001.       exactFromRange: exactFromRange,
  10002.       getWin: getWin$1,
  10003.       range: range
  10004.     };
  10005.  
  10006.     var beforeSpecial = function (element, offset) {
  10007.       var name = name$1(element);
  10008.       if ('input' === name) {
  10009.         return Situ.after(element);
  10010.       } else if (!contains$1([
  10011.           'br',
  10012.           'img'
  10013.         ], name)) {
  10014.         return Situ.on(element, offset);
  10015.       } else {
  10016.         return offset === 0 ? Situ.before(element) : Situ.after(element);
  10017.       }
  10018.     };
  10019.     var preprocessExact = function (start, soffset, finish, foffset) {
  10020.       var startSitu = beforeSpecial(start, soffset);
  10021.       var finishSitu = beforeSpecial(finish, foffset);
  10022.       return SimSelection.relative(startSitu, finishSitu);
  10023.     };
  10024.  
  10025.     var makeRange = function (start, soffset, finish, foffset) {
  10026.       var doc = owner$2(start);
  10027.       var rng = doc.dom.createRange();
  10028.       rng.setStart(start.dom, soffset);
  10029.       rng.setEnd(finish.dom, foffset);
  10030.       return rng;
  10031.     };
  10032.     var after = function (start, soffset, finish, foffset) {
  10033.       var r = makeRange(start, soffset, finish, foffset);
  10034.       var same = eq(start, finish) && soffset === foffset;
  10035.       return r.collapsed && !same;
  10036.     };
  10037.  
  10038.     var getNativeSelection = function (win) {
  10039.       return Optional.from(win.getSelection());
  10040.     };
  10041.     var doSetNativeRange = function (win, rng) {
  10042.       getNativeSelection(win).each(function (selection) {
  10043.         selection.removeAllRanges();
  10044.         selection.addRange(rng);
  10045.       });
  10046.     };
  10047.     var doSetRange = function (win, start, soffset, finish, foffset) {
  10048.       var rng = exactToNative(win, start, soffset, finish, foffset);
  10049.       doSetNativeRange(win, rng);
  10050.     };
  10051.     var setLegacyRtlRange = function (win, selection, start, soffset, finish, foffset) {
  10052.       selection.collapse(start.dom, soffset);
  10053.       selection.extend(finish.dom, foffset);
  10054.     };
  10055.     var setRangeFromRelative = function (win, relative) {
  10056.       return diagnose(win, relative).match({
  10057.         ltr: function (start, soffset, finish, foffset) {
  10058.           doSetRange(win, start, soffset, finish, foffset);
  10059.         },
  10060.         rtl: function (start, soffset, finish, foffset) {
  10061.           getNativeSelection(win).each(function (selection) {
  10062.             if (selection.setBaseAndExtent) {
  10063.               selection.setBaseAndExtent(start.dom, soffset, finish.dom, foffset);
  10064.             } else if (selection.extend) {
  10065.               try {
  10066.                 setLegacyRtlRange(win, selection, start, soffset, finish, foffset);
  10067.               } catch (e) {
  10068.                 doSetRange(win, finish, foffset, start, soffset);
  10069.               }
  10070.             } else {
  10071.               doSetRange(win, finish, foffset, start, soffset);
  10072.             }
  10073.           });
  10074.         }
  10075.       });
  10076.     };
  10077.     var setExact = function (win, start, soffset, finish, foffset) {
  10078.       var relative = preprocessExact(start, soffset, finish, foffset);
  10079.       setRangeFromRelative(win, relative);
  10080.     };
  10081.     var readRange = function (selection) {
  10082.       if (selection.rangeCount > 0) {
  10083.         var firstRng = selection.getRangeAt(0);
  10084.         var lastRng = selection.getRangeAt(selection.rangeCount - 1);
  10085.         return Optional.some(SimRange.create(SugarElement.fromDom(firstRng.startContainer), firstRng.startOffset, SugarElement.fromDom(lastRng.endContainer), lastRng.endOffset));
  10086.       } else {
  10087.         return Optional.none();
  10088.       }
  10089.     };
  10090.     var doGetExact = function (selection) {
  10091.       if (selection.anchorNode === null || selection.focusNode === null) {
  10092.         return readRange(selection);
  10093.       } else {
  10094.         var anchor = SugarElement.fromDom(selection.anchorNode);
  10095.         var focus_1 = SugarElement.fromDom(selection.focusNode);
  10096.         return after(anchor, selection.anchorOffset, focus_1, selection.focusOffset) ? Optional.some(SimRange.create(anchor, selection.anchorOffset, focus_1, selection.focusOffset)) : readRange(selection);
  10097.       }
  10098.     };
  10099.     var getExact = function (win) {
  10100.       return getNativeSelection(win).filter(function (sel) {
  10101.         return sel.rangeCount > 0;
  10102.       }).bind(doGetExact);
  10103.     };
  10104.     var get = function (win) {
  10105.       return getExact(win).map(function (range) {
  10106.         return SimSelection.exact(range.start, range.soffset, range.finish, range.foffset);
  10107.       });
  10108.     };
  10109.     var getFirstRect = function (win, selection) {
  10110.       var rng = asLtrRange(win, selection);
  10111.       return getFirstRect$1(rng);
  10112.     };
  10113.     var clear = function (win) {
  10114.       getNativeSelection(win).each(function (selection) {
  10115.         return selection.removeAllRanges();
  10116.       });
  10117.     };
  10118.  
  10119.     var getBodyFromFrame = function (frame) {
  10120.       return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document.body));
  10121.     };
  10122.     var getDocFromFrame = function (frame) {
  10123.       return Optional.some(SugarElement.fromDom(frame.dom.contentWindow.document));
  10124.     };
  10125.     var getWinFromFrame = function (frame) {
  10126.       return Optional.from(frame.dom.contentWindow);
  10127.     };
  10128.     var getSelectionFromFrame = function (frame) {
  10129.       var optWin = getWinFromFrame(frame);
  10130.       return optWin.bind(getExact);
  10131.     };
  10132.     var getFrame = function (editor) {
  10133.       return editor.getFrame();
  10134.     };
  10135.     var getOrDerive = function (name, f) {
  10136.       return function (editor) {
  10137.         var g = editor[name].getOrThunk(function () {
  10138.           var frame = getFrame(editor);
  10139.           return function () {
  10140.             return f(frame);
  10141.           };
  10142.         });
  10143.         return g();
  10144.       };
  10145.     };
  10146.     var getOrListen = function (editor, doc, name, type) {
  10147.       return editor[name].getOrThunk(function () {
  10148.         return function (handler) {
  10149.           return bind(doc, type, handler);
  10150.         };
  10151.       });
  10152.     };
  10153.     var getActiveApi = function (editor) {
  10154.       var frame = getFrame(editor);
  10155.       var tryFallbackBox = function (win) {
  10156.         var isCollapsed = function (sel) {
  10157.           return eq(sel.start, sel.finish) && sel.soffset === sel.foffset;
  10158.         };
  10159.         var toStartRect = function (sel) {
  10160.           var rect = sel.start.dom.getBoundingClientRect();
  10161.           return rect.width > 0 || rect.height > 0 ? Optional.some(rect) : Optional.none();
  10162.         };
  10163.         return getExact(win).filter(isCollapsed).bind(toStartRect);
  10164.       };
  10165.       return getBodyFromFrame(frame).bind(function (body) {
  10166.         return getDocFromFrame(frame).bind(function (doc) {
  10167.           return getWinFromFrame(frame).map(function (win) {
  10168.             var html = SugarElement.fromDom(doc.dom.documentElement);
  10169.             var getCursorBox = editor.getCursorBox.getOrThunk(function () {
  10170.               return function () {
  10171.                 return get(win).bind(function (sel) {
  10172.                   return getFirstRect(win, sel).orThunk(function () {
  10173.                     return tryFallbackBox(win);
  10174.                   });
  10175.                 });
  10176.               };
  10177.             });
  10178.             var setSelection = editor.setSelection.getOrThunk(function () {
  10179.               return function (start, soffset, finish, foffset) {
  10180.                 setExact(win, start, soffset, finish, foffset);
  10181.               };
  10182.             });
  10183.             var clearSelection = editor.clearSelection.getOrThunk(function () {
  10184.               return function () {
  10185.                 clear(win);
  10186.               };
  10187.             });
  10188.             return {
  10189.               body: body,
  10190.               doc: doc,
  10191.               win: win,
  10192.               html: html,
  10193.               getSelection: curry(getSelectionFromFrame, frame),
  10194.               setSelection: setSelection,
  10195.               clearSelection: clearSelection,
  10196.               frame: frame,
  10197.               onKeyup: getOrListen(editor, doc, 'onKeyup', 'keyup'),
  10198.               onNodeChanged: getOrListen(editor, doc, 'onNodeChanged', 'SelectionChange'),
  10199.               onDomChanged: editor.onDomChanged,
  10200.               onScrollToCursor: editor.onScrollToCursor,
  10201.               onScrollToElement: editor.onScrollToElement,
  10202.               onToReading: editor.onToReading,
  10203.               onToEditing: editor.onToEditing,
  10204.               onToolbarScrollStart: editor.onToolbarScrollStart,
  10205.               onTouchContent: editor.onTouchContent,
  10206.               onTapContent: editor.onTapContent,
  10207.               onTouchToolstrip: editor.onTouchToolstrip,
  10208.               getCursorBox: getCursorBox
  10209.             };
  10210.           });
  10211.         });
  10212.       });
  10213.     };
  10214.     var getWin = getOrDerive('getWin', getWinFromFrame);
  10215.  
  10216.     var tag = function () {
  10217.       var head = first$1('head').getOrDie();
  10218.       var nu = function () {
  10219.         var meta = SugarElement.fromTag('meta');
  10220.         set$8(meta, 'name', 'viewport');
  10221.         append$2(head, meta);
  10222.         return meta;
  10223.       };
  10224.       var element = first$1('meta[name="viewport"]').getOrThunk(nu);
  10225.       var backup = get$b(element, 'content');
  10226.       var maximize = function () {
  10227.         set$8(element, 'content', 'width=device-width, initial-scale=1.0, user-scalable=no, maximum-scale=1.0');
  10228.       };
  10229.       var restore = function () {
  10230.         if (backup !== undefined && backup !== null && backup.length > 0) {
  10231.           set$8(element, 'content', backup);
  10232.         } else {
  10233.           set$8(element, 'content', 'user-scalable=yes');
  10234.         }
  10235.       };
  10236.       return {
  10237.         maximize: maximize,
  10238.         restore: restore
  10239.       };
  10240.     };
  10241.  
  10242.     var attr = 'data-ephox-mobile-fullscreen-style';
  10243.     var siblingStyles = 'display:none!important;';
  10244.     var ancestorPosition = 'position:absolute!important;';
  10245.     var ancestorStyles = 'top:0!important;left:0!important;margin:0!important;padding:0!important;width:100%!important;height:100%!important;overflow:visible!important;';
  10246.     var bgFallback = 'background-color:rgb(255,255,255)!important;';
  10247.     var isAndroid = detect$1().os.isAndroid();
  10248.     var matchColor = function (editorBody) {
  10249.       var color = get$8(editorBody, 'background-color');
  10250.       return color !== undefined && color !== '' ? 'background-color:' + color + '!important' : bgFallback;
  10251.     };
  10252.     var clobberStyles = function (container, editorBody) {
  10253.       var gatherSiblings = function (element) {
  10254.         return siblings(element, '*');
  10255.       };
  10256.       var clobber = function (clobberStyle) {
  10257.         return function (element) {
  10258.           var styles = get$b(element, 'style');
  10259.           var backup = styles === undefined ? 'no-styles' : styles.trim();
  10260.           if (backup === clobberStyle) {
  10261.             return;
  10262.           } else {
  10263.             set$8(element, attr, backup);
  10264.             set$8(element, 'style', clobberStyle);
  10265.           }
  10266.         };
  10267.       };
  10268.       var ancestors$1 = ancestors(container, '*');
  10269.       var siblings$1 = bind$3(ancestors$1, gatherSiblings);
  10270.       var bgColor = matchColor(editorBody);
  10271.       each$1(siblings$1, clobber(siblingStyles));
  10272.       each$1(ancestors$1, clobber(ancestorPosition + ancestorStyles + bgColor));
  10273.       var containerStyles = isAndroid === true ? '' : ancestorPosition;
  10274.       clobber(containerStyles + ancestorStyles + bgColor)(container);
  10275.     };
  10276.     var restoreStyles = function () {
  10277.       var clobberedEls = all('[' + attr + ']');
  10278.       each$1(clobberedEls, function (element) {
  10279.         var restore = get$b(element, attr);
  10280.         if (restore !== 'no-styles') {
  10281.           set$8(element, 'style', restore);
  10282.         } else {
  10283.           remove$6(element, 'style');
  10284.         }
  10285.         remove$6(element, attr);
  10286.       });
  10287.     };
  10288.  
  10289.     var DelayedFunction = function (fun, delay) {
  10290.       var ref = null;
  10291.       var schedule = function () {
  10292.         var args = [];
  10293.         for (var _i = 0; _i < arguments.length; _i++) {
  10294.           args[_i] = arguments[_i];
  10295.         }
  10296.         ref = setTimeout(function () {
  10297.           fun.apply(null, args);
  10298.           ref = null;
  10299.         }, delay);
  10300.       };
  10301.       var cancel = function () {
  10302.         if (ref !== null) {
  10303.           clearTimeout(ref);
  10304.           ref = null;
  10305.         }
  10306.       };
  10307.       return {
  10308.         cancel: cancel,
  10309.         schedule: schedule
  10310.       };
  10311.     };
  10312.  
  10313.     var SIGNIFICANT_MOVE = 5;
  10314.     var LONGPRESS_DELAY = 400;
  10315.     var getTouch = function (event) {
  10316.       var raw = event.raw;
  10317.       if (raw.touches === undefined || raw.touches.length !== 1) {
  10318.         return Optional.none();
  10319.       }
  10320.       return Optional.some(raw.touches[0]);
  10321.     };
  10322.     var isFarEnough = function (touch, data) {
  10323.       var distX = Math.abs(touch.clientX - data.x);
  10324.       var distY = Math.abs(touch.clientY - data.y);
  10325.       return distX > SIGNIFICANT_MOVE || distY > SIGNIFICANT_MOVE;
  10326.     };
  10327.     var monitor$1 = function (settings) {
  10328.       var startData = value();
  10329.       var longpressFired = Cell(false);
  10330.       var longpress$1 = DelayedFunction(function (event) {
  10331.         settings.triggerEvent(longpress(), event);
  10332.         longpressFired.set(true);
  10333.       }, LONGPRESS_DELAY);
  10334.       var handleTouchstart = function (event) {
  10335.         getTouch(event).each(function (touch) {
  10336.           longpress$1.cancel();
  10337.           var data = {
  10338.             x: touch.clientX,
  10339.             y: touch.clientY,
  10340.             target: event.target
  10341.           };
  10342.           longpress$1.schedule(event);
  10343.           longpressFired.set(false);
  10344.           startData.set(data);
  10345.         });
  10346.         return Optional.none();
  10347.       };
  10348.       var handleTouchmove = function (event) {
  10349.         longpress$1.cancel();
  10350.         getTouch(event).each(function (touch) {
  10351.           startData.on(function (data) {
  10352.             if (isFarEnough(touch, data)) {
  10353.               startData.clear();
  10354.             }
  10355.           });
  10356.         });
  10357.         return Optional.none();
  10358.       };
  10359.       var handleTouchend = function (event) {
  10360.         longpress$1.cancel();
  10361.         var isSame = function (data) {
  10362.           return eq(data.target, event.target);
  10363.         };
  10364.         return startData.get().filter(isSame).map(function (_data) {
  10365.           if (longpressFired.get()) {
  10366.             event.prevent();
  10367.             return false;
  10368.           } else {
  10369.             return settings.triggerEvent(tap(), event);
  10370.           }
  10371.         });
  10372.       };
  10373.       var handlers = wrapAll([
  10374.         {
  10375.           key: touchstart(),
  10376.           value: handleTouchstart
  10377.         },
  10378.         {
  10379.           key: touchmove(),
  10380.           value: handleTouchmove
  10381.         },
  10382.         {
  10383.           key: touchend(),
  10384.           value: handleTouchend
  10385.         }
  10386.       ]);
  10387.       var fireIfReady = function (event, type) {
  10388.         return get$c(handlers, type).bind(function (handler) {
  10389.           return handler(event);
  10390.         });
  10391.       };
  10392.       return { fireIfReady: fireIfReady };
  10393.     };
  10394.  
  10395.     var monitor = function (editorApi) {
  10396.       var tapEvent = monitor$1({
  10397.         triggerEvent: function (type, evt) {
  10398.           editorApi.onTapContent(evt);
  10399.         }
  10400.       });
  10401.       var onTouchend = function () {
  10402.         return bind(editorApi.body, 'touchend', function (evt) {
  10403.           tapEvent.fireIfReady(evt, 'touchend');
  10404.         });
  10405.       };
  10406.       var onTouchmove = function () {
  10407.         return bind(editorApi.body, 'touchmove', function (evt) {
  10408.           tapEvent.fireIfReady(evt, 'touchmove');
  10409.         });
  10410.       };
  10411.       var fireTouchstart = function (evt) {
  10412.         tapEvent.fireIfReady(evt, 'touchstart');
  10413.       };
  10414.       return {
  10415.         fireTouchstart: fireTouchstart,
  10416.         onTouchend: onTouchend,
  10417.         onTouchmove: onTouchmove
  10418.       };
  10419.     };
  10420.  
  10421.     var isAndroid6 = detect$1().os.version.major >= 6;
  10422.     var initEvents$1 = function (editorApi, toolstrip, alloy) {
  10423.       var tapping = monitor(editorApi);
  10424.       var outerDoc = owner$2(toolstrip);
  10425.       var isRanged = function (sel) {
  10426.         return !eq(sel.start, sel.finish) || sel.soffset !== sel.foffset;
  10427.       };
  10428.       var hasRangeInUi = function () {
  10429.         return active(outerDoc).filter(function (input) {
  10430.           return name$1(input) === 'input';
  10431.         }).exists(function (input) {
  10432.           return input.dom.selectionStart !== input.dom.selectionEnd;
  10433.         });
  10434.       };
  10435.       var updateMargin = function () {
  10436.         var rangeInContent = editorApi.doc.dom.hasFocus() && editorApi.getSelection().exists(isRanged);
  10437.         alloy.getByDom(toolstrip).each((rangeInContent || hasRangeInUi()) === true ? Toggling.on : Toggling.off);
  10438.       };
  10439.       var listeners = [
  10440.         bind(editorApi.body, 'touchstart', function (evt) {
  10441.           editorApi.onTouchContent();
  10442.           tapping.fireTouchstart(evt);
  10443.         }),
  10444.         tapping.onTouchmove(),
  10445.         tapping.onTouchend(),
  10446.         bind(toolstrip, 'touchstart', function (_evt) {
  10447.           editorApi.onTouchToolstrip();
  10448.         }),
  10449.         editorApi.onToReading(function () {
  10450.           blur$1(editorApi.body);
  10451.         }),
  10452.         editorApi.onToEditing(noop),
  10453.         editorApi.onScrollToCursor(function (tinyEvent) {
  10454.           tinyEvent.preventDefault();
  10455.           editorApi.getCursorBox().each(function (bounds) {
  10456.             var cWin = editorApi.win;
  10457.             var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight;
  10458.             var cScrollBy = isOutside ? bounds.bottom - cWin.innerHeight + 50 : 0;
  10459.             if (cScrollBy !== 0) {
  10460.               cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy);
  10461.             }
  10462.           });
  10463.         })
  10464.       ].concat(isAndroid6 === true ? [] : [
  10465.         bind(SugarElement.fromDom(editorApi.win), 'blur', function () {
  10466.           alloy.getByDom(toolstrip).each(Toggling.off);
  10467.         }),
  10468.         bind(outerDoc, 'select', updateMargin),
  10469.         bind(editorApi.doc, 'selectionchange', updateMargin)
  10470.       ]);
  10471.       var destroy = function () {
  10472.         each$1(listeners, function (l) {
  10473.           l.unbind();
  10474.         });
  10475.       };
  10476.       return { destroy: destroy };
  10477.     };
  10478.  
  10479.     var safeParse = function (element, attribute) {
  10480.       var parsed = parseInt(get$b(element, attribute), 10);
  10481.       return isNaN(parsed) ? 0 : parsed;
  10482.     };
  10483.  
  10484.     var COLLAPSED_WIDTH = 2;
  10485.     var collapsedRect = function (rect) {
  10486.       return __assign(__assign({}, rect), { width: COLLAPSED_WIDTH });
  10487.     };
  10488.     var toRect = function (rawRect) {
  10489.       return {
  10490.         left: rawRect.left,
  10491.         top: rawRect.top,
  10492.         right: rawRect.right,
  10493.         bottom: rawRect.bottom,
  10494.         width: rawRect.width,
  10495.         height: rawRect.height
  10496.       };
  10497.     };
  10498.     var getRectsFromRange = function (range) {
  10499.       if (!range.collapsed) {
  10500.         return map$2(range.getClientRects(), toRect);
  10501.       } else {
  10502.         var start_1 = SugarElement.fromDom(range.startContainer);
  10503.         return parent(start_1).bind(function (parent) {
  10504.           var selection = SimSelection.exact(start_1, range.startOffset, parent, getEnd(parent));
  10505.           var optRect = getFirstRect(range.startContainer.ownerDocument.defaultView, selection);
  10506.           return optRect.map(collapsedRect).map(pure$2);
  10507.         }).getOr([]);
  10508.       }
  10509.     };
  10510.     var getRectangles = function (cWin) {
  10511.       var sel = cWin.getSelection();
  10512.       return sel !== undefined && sel.rangeCount > 0 ? getRectsFromRange(sel.getRangeAt(0)) : [];
  10513.     };
  10514.  
  10515.     var autocompleteHack = function () {
  10516.       return function (f) {
  10517.         global$2.setTimeout(function () {
  10518.           f();
  10519.         }, 0);
  10520.       };
  10521.     };
  10522.     var resume$1 = function (cWin) {
  10523.       cWin.focus();
  10524.       var iBody = SugarElement.fromDom(cWin.document.body);
  10525.       var inInput = active().exists(function (elem) {
  10526.         return contains$1([
  10527.           'input',
  10528.           'textarea'
  10529.         ], name$1(elem));
  10530.       });
  10531.       var transaction = inInput ? autocompleteHack() : apply$1;
  10532.       transaction(function () {
  10533.         active().each(blur$1);
  10534.         focus$3(iBody);
  10535.       });
  10536.     };
  10537.  
  10538.     var EXTRA_SPACING = 50;
  10539.     var data = 'data-' + resolve('last-outer-height');
  10540.     var setLastHeight = function (cBody, value) {
  10541.       set$8(cBody, data, value);
  10542.     };
  10543.     var getLastHeight = function (cBody) {
  10544.       return safeParse(cBody, data);
  10545.     };
  10546.     var getBoundsFrom = function (rect) {
  10547.       return {
  10548.         top: rect.top,
  10549.         bottom: rect.top + rect.height
  10550.       };
  10551.     };
  10552.     var getBounds = function (cWin) {
  10553.       var rects = getRectangles(cWin);
  10554.       return rects.length > 0 ? Optional.some(rects[0]).map(getBoundsFrom) : Optional.none();
  10555.     };
  10556.     var findDelta = function (outerWindow, cBody) {
  10557.       var last = getLastHeight(cBody);
  10558.       var current = outerWindow.innerHeight;
  10559.       return last > current ? Optional.some(last - current) : Optional.none();
  10560.     };
  10561.     var calculate = function (cWin, bounds, delta) {
  10562.       var isOutside = bounds.top > cWin.innerHeight || bounds.bottom > cWin.innerHeight;
  10563.       return isOutside ? Math.min(delta, bounds.bottom - cWin.innerHeight + EXTRA_SPACING) : 0;
  10564.     };
  10565.     var setup$2 = function (outerWindow, cWin) {
  10566.       var cBody = SugarElement.fromDom(cWin.document.body);
  10567.       var toEditing = function () {
  10568.         resume$1(cWin);
  10569.       };
  10570.       var onResize = bind(SugarElement.fromDom(outerWindow), 'resize', function () {
  10571.         findDelta(outerWindow, cBody).each(function (delta) {
  10572.           getBounds(cWin).each(function (bounds) {
  10573.             var cScrollBy = calculate(cWin, bounds, delta);
  10574.             if (cScrollBy !== 0) {
  10575.               cWin.scrollTo(cWin.pageXOffset, cWin.pageYOffset + cScrollBy);
  10576.             }
  10577.           });
  10578.         });
  10579.         setLastHeight(cBody, outerWindow.innerHeight);
  10580.       });
  10581.       setLastHeight(cBody, outerWindow.innerHeight);
  10582.       var destroy = function () {
  10583.         onResize.unbind();
  10584.       };
  10585.       return {
  10586.         toEditing: toEditing,
  10587.         destroy: destroy
  10588.       };
  10589.     };
  10590.  
  10591.     var create$2 = function (platform, mask) {
  10592.       var meta = tag();
  10593.       var androidApi = api$2();
  10594.       var androidEvents = api$2();
  10595.       var enter = function () {
  10596.         mask.hide();
  10597.         add$1(platform.container, resolve('fullscreen-maximized'));
  10598.         add$1(platform.container, resolve('android-maximized'));
  10599.         meta.maximize();
  10600.         add$1(platform.body, resolve('android-scroll-reload'));
  10601.         androidApi.set(setup$2(platform.win, getWin(platform.editor).getOrDie('no')));
  10602.         getActiveApi(platform.editor).each(function (editorApi) {
  10603.           clobberStyles(platform.container, editorApi.body);
  10604.           androidEvents.set(initEvents$1(editorApi, platform.toolstrip, platform.alloy));
  10605.         });
  10606.       };
  10607.       var exit = function () {
  10608.         meta.restore();
  10609.         mask.show();
  10610.         remove$3(platform.container, resolve('fullscreen-maximized'));
  10611.         remove$3(platform.container, resolve('android-maximized'));
  10612.         restoreStyles();
  10613.         remove$3(platform.body, resolve('android-scroll-reload'));
  10614.         androidEvents.clear();
  10615.         androidApi.clear();
  10616.       };
  10617.       return {
  10618.         enter: enter,
  10619.         exit: exit
  10620.       };
  10621.     };
  10622.  
  10623.     var first = function (fn, rate) {
  10624.       var timer = null;
  10625.       var cancel = function () {
  10626.         if (!isNull(timer)) {
  10627.           clearTimeout(timer);
  10628.           timer = null;
  10629.         }
  10630.       };
  10631.       var throttle = function () {
  10632.         var args = [];
  10633.         for (var _i = 0; _i < arguments.length; _i++) {
  10634.           args[_i] = arguments[_i];
  10635.         }
  10636.         if (isNull(timer)) {
  10637.           timer = setTimeout(function () {
  10638.             timer = null;
  10639.             fn.apply(null, args);
  10640.           }, rate);
  10641.         }
  10642.       };
  10643.       return {
  10644.         cancel: cancel,
  10645.         throttle: throttle
  10646.       };
  10647.     };
  10648.     var last = function (fn, rate) {
  10649.       var timer = null;
  10650.       var cancel = function () {
  10651.         if (!isNull(timer)) {
  10652.           clearTimeout(timer);
  10653.           timer = null;
  10654.         }
  10655.       };
  10656.       var throttle = function () {
  10657.         var args = [];
  10658.         for (var _i = 0; _i < arguments.length; _i++) {
  10659.           args[_i] = arguments[_i];
  10660.         }
  10661.         cancel();
  10662.         timer = setTimeout(function () {
  10663.           timer = null;
  10664.           fn.apply(null, args);
  10665.         }, rate);
  10666.       };
  10667.       return {
  10668.         cancel: cancel,
  10669.         throttle: throttle
  10670.       };
  10671.     };
  10672.  
  10673.     var sketch = function (onView, _translate) {
  10674.       var memIcon = record(Container.sketch({
  10675.         dom: dom$1('<div aria-hidden="true" class="${prefix}-mask-tap-icon"></div>'),
  10676.         containerBehaviours: derive$2([Toggling.config({
  10677.             toggleClass: resolve('mask-tap-icon-selected'),
  10678.             toggleOnExecute: false
  10679.           })])
  10680.       }));
  10681.       var onViewThrottle = first(onView, 200);
  10682.       return Container.sketch({
  10683.         dom: dom$1('<div class="${prefix}-disabled-mask"></div>'),
  10684.         components: [Container.sketch({
  10685.             dom: dom$1('<div class="${prefix}-content-container"></div>'),
  10686.             components: [Button.sketch({
  10687.                 dom: dom$1('<div class="${prefix}-content-tap-section"></div>'),
  10688.                 components: [memIcon.asSpec()],
  10689.                 action: function (_button) {
  10690.                   onViewThrottle.throttle();
  10691.                 },
  10692.                 buttonBehaviours: derive$2([Toggling.config({ toggleClass: resolve('mask-tap-icon-selected') })])
  10693.               })]
  10694.           })]
  10695.       });
  10696.     };
  10697.  
  10698.     var unbindNoop = constant$1({ unbind: noop });
  10699.     var MobileSchema = objOf([
  10700.       requiredObjOf('editor', [
  10701.         required$1('getFrame'),
  10702.         option('getBody'),
  10703.         option('getDoc'),
  10704.         option('getWin'),
  10705.         option('getSelection'),
  10706.         option('setSelection'),
  10707.         option('clearSelection'),
  10708.         option('cursorSaver'),
  10709.         option('onKeyup'),
  10710.         option('onNodeChanged'),
  10711.         option('getCursorBox'),
  10712.         required$1('onDomChanged'),
  10713.         defaulted('onTouchContent', noop),
  10714.         defaulted('onTapContent', noop),
  10715.         defaulted('onTouchToolstrip', noop),
  10716.         defaulted('onScrollToCursor', unbindNoop),
  10717.         defaulted('onScrollToElement', unbindNoop),
  10718.         defaulted('onToEditing', unbindNoop),
  10719.         defaulted('onToReading', unbindNoop),
  10720.         defaulted('onToolbarScrollStart', identity)
  10721.       ]),
  10722.       required$1('socket'),
  10723.       required$1('toolstrip'),
  10724.       required$1('dropup'),
  10725.       required$1('toolbar'),
  10726.       required$1('container'),
  10727.       required$1('alloy'),
  10728.       customField('win', function (spec) {
  10729.         return owner$2(spec.socket).dom.defaultView;
  10730.       }),
  10731.       customField('body', function (spec) {
  10732.         return SugarElement.fromDom(spec.socket.dom.ownerDocument.body);
  10733.       }),
  10734.       defaulted('translate', identity),
  10735.       defaulted('setReadOnly', noop),
  10736.       defaulted('readOnlyOnInit', always)
  10737.     ]);
  10738.  
  10739.     var produce$1 = function (raw) {
  10740.       var mobile = asRawOrDie$1('Getting AndroidWebapp schema', MobileSchema, raw);
  10741.       set$5(mobile.toolstrip, 'width', '100%');
  10742.       var onTap = function () {
  10743.         mobile.setReadOnly(mobile.readOnlyOnInit());
  10744.         mode.enter();
  10745.       };
  10746.       var mask = build$1(sketch(onTap, mobile.translate));
  10747.       mobile.alloy.add(mask);
  10748.       var maskApi = {
  10749.         show: function () {
  10750.           mobile.alloy.add(mask);
  10751.         },
  10752.         hide: function () {
  10753.           mobile.alloy.remove(mask);
  10754.         }
  10755.       };
  10756.       append$2(mobile.container, mask.element);
  10757.       var mode = create$2(mobile, maskApi);
  10758.       return {
  10759.         setReadOnly: mobile.setReadOnly,
  10760.         refreshStructure: noop,
  10761.         enter: mode.enter,
  10762.         exit: mode.exit,
  10763.         destroy: noop
  10764.       };
  10765.     };
  10766.  
  10767.     var schema$1 = constant$1([
  10768.       required$1('dom'),
  10769.       defaulted('shell', true),
  10770.       field$1('toolbarBehaviours', [Replacing])
  10771.     ]);
  10772.     var enhanceGroups = function () {
  10773.       return { behaviours: derive$2([Replacing.config({})]) };
  10774.     };
  10775.     var parts$1 = constant$1([optional({
  10776.         name: 'groups',
  10777.         overrides: enhanceGroups
  10778.       })]);
  10779.  
  10780.     var factory$1 = function (detail, components, _spec, _externals) {
  10781.       var setGroups = function (toolbar, groups) {
  10782.         getGroupContainer(toolbar).fold(function () {
  10783.           console.error('Toolbar was defined to not be a shell, but no groups container was specified in components');
  10784.           throw new Error('Toolbar was defined to not be a shell, but no groups container was specified in components');
  10785.         }, function (container) {
  10786.           Replacing.set(container, groups);
  10787.         });
  10788.       };
  10789.       var getGroupContainer = function (component) {
  10790.         return detail.shell ? Optional.some(component) : getPart(component, detail, 'groups');
  10791.       };
  10792.       var extra = detail.shell ? {
  10793.         behaviours: [Replacing.config({})],
  10794.         components: []
  10795.       } : {
  10796.         behaviours: [],
  10797.         components: components
  10798.       };
  10799.       return {
  10800.         uid: detail.uid,
  10801.         dom: detail.dom,
  10802.         components: extra.components,
  10803.         behaviours: augment(detail.toolbarBehaviours, extra.behaviours),
  10804.         apis: { setGroups: setGroups },
  10805.         domModification: { attributes: { role: 'group' } }
  10806.       };
  10807.     };
  10808.     var Toolbar = composite({
  10809.       name: 'Toolbar',
  10810.       configFields: schema$1(),
  10811.       partFields: parts$1(),
  10812.       factory: factory$1,
  10813.       apis: {
  10814.         setGroups: function (apis, toolbar, groups) {
  10815.           apis.setGroups(toolbar, groups);
  10816.         }
  10817.       }
  10818.     });
  10819.  
  10820.     var schema = constant$1([
  10821.       required$1('items'),
  10822.       markers(['itemSelector']),
  10823.       field$1('tgroupBehaviours', [Keying])
  10824.     ]);
  10825.     var parts = constant$1([group({
  10826.         name: 'items',
  10827.         unit: 'item'
  10828.       })]);
  10829.  
  10830.     var factory = function (detail, components, _spec, _externals) {
  10831.       return {
  10832.         uid: detail.uid,
  10833.         dom: detail.dom,
  10834.         components: components,
  10835.         behaviours: augment(detail.tgroupBehaviours, [Keying.config({
  10836.             mode: 'flow',
  10837.             selector: detail.markers.itemSelector
  10838.           })]),
  10839.         domModification: { attributes: { role: 'toolbar' } }
  10840.       };
  10841.     };
  10842.     var ToolbarGroup = composite({
  10843.       name: 'ToolbarGroup',
  10844.       configFields: schema(),
  10845.       partFields: parts(),
  10846.       factory: factory
  10847.     });
  10848.  
  10849.     var dataHorizontal = 'data-' + resolve('horizontal-scroll');
  10850.     var canScrollVertically = function (container) {
  10851.       container.dom.scrollTop = 1;
  10852.       var result = container.dom.scrollTop !== 0;
  10853.       container.dom.scrollTop = 0;
  10854.       return result;
  10855.     };
  10856.     var canScrollHorizontally = function (container) {
  10857.       container.dom.scrollLeft = 1;
  10858.       var result = container.dom.scrollLeft !== 0;
  10859.       container.dom.scrollLeft = 0;
  10860.       return result;
  10861.     };
  10862.     var hasVerticalScroll = function (container) {
  10863.       return container.dom.scrollTop > 0 || canScrollVertically(container);
  10864.     };
  10865.     var hasHorizontalScroll = function (container) {
  10866.       return container.dom.scrollLeft > 0 || canScrollHorizontally(container);
  10867.     };
  10868.     var markAsHorizontal = function (container) {
  10869.       set$8(container, dataHorizontal, 'true');
  10870.     };
  10871.     var hasScroll = function (container) {
  10872.       return get$b(container, dataHorizontal) === 'true' ? hasHorizontalScroll(container) : hasVerticalScroll(container);
  10873.     };
  10874.     var exclusive = function (scope, selector) {
  10875.       return bind(scope, 'touchmove', function (event) {
  10876.         closest$1(event.target, selector).filter(hasScroll).fold(function () {
  10877.           event.prevent();
  10878.         }, noop);
  10879.       });
  10880.     };
  10881.  
  10882.     var ScrollingToolbar = function () {
  10883.       var makeGroup = function (gSpec) {
  10884.         var scrollClass = gSpec.scrollable === true ? '${prefix}-toolbar-scrollable-group' : '';
  10885.         return {
  10886.           dom: dom$1('<div aria-label="' + gSpec.label + '" class="${prefix}-toolbar-group ' + scrollClass + '"></div>'),
  10887.           tgroupBehaviours: derive$2([config('adhoc-scrollable-toolbar', gSpec.scrollable === true ? [runOnInit(function (component, _simulatedEvent) {
  10888.                 set$5(component.element, 'overflow-x', 'auto');
  10889.                 markAsHorizontal(component.element);
  10890.                 register$2(component.element);
  10891.               })] : [])]),
  10892.           components: [Container.sketch({ components: [ToolbarGroup.parts.items({})] })],
  10893.           markers: { itemSelector: '.' + resolve('toolbar-group-item') },
  10894.           items: gSpec.items
  10895.         };
  10896.       };
  10897.       var toolbar = build$1(Toolbar.sketch({
  10898.         dom: dom$1('<div class="${prefix}-toolbar"></div>'),
  10899.         components: [Toolbar.parts.groups({})],
  10900.         toolbarBehaviours: derive$2([
  10901.           Toggling.config({
  10902.             toggleClass: resolve('context-toolbar'),
  10903.             toggleOnExecute: false,
  10904.             aria: { mode: 'none' }
  10905.           }),
  10906.           Keying.config({ mode: 'cyclic' })
  10907.         ]),
  10908.         shell: true
  10909.       }));
  10910.       var wrapper = build$1(Container.sketch({
  10911.         dom: { classes: [resolve('toolstrip')] },
  10912.         components: [premade(toolbar)],
  10913.         containerBehaviours: derive$2([Toggling.config({
  10914.             toggleClass: resolve('android-selection-context-toolbar'),
  10915.             toggleOnExecute: false
  10916.           })])
  10917.       }));
  10918.       var resetGroups = function () {
  10919.         Toolbar.setGroups(toolbar, initGroups.get());
  10920.         Toggling.off(toolbar);
  10921.       };
  10922.       var initGroups = Cell([]);
  10923.       var setGroups = function (gs) {
  10924.         initGroups.set(gs);
  10925.         resetGroups();
  10926.       };
  10927.       var createGroups = function (gs) {
  10928.         return map$2(gs, compose(ToolbarGroup.sketch, makeGroup));
  10929.       };
  10930.       var refresh = function () {
  10931.       };
  10932.       var setContextToolbar = function (gs) {
  10933.         Toggling.on(toolbar);
  10934.         Toolbar.setGroups(toolbar, gs);
  10935.       };
  10936.       var restoreToolbar = function () {
  10937.         if (Toggling.isOn(toolbar)) {
  10938.           resetGroups();
  10939.         }
  10940.       };
  10941.       var focus = function () {
  10942.         Keying.focusIn(toolbar);
  10943.       };
  10944.       return {
  10945.         wrapper: wrapper,
  10946.         toolbar: toolbar,
  10947.         createGroups: createGroups,
  10948.         setGroups: setGroups,
  10949.         setContextToolbar: setContextToolbar,
  10950.         restoreToolbar: restoreToolbar,
  10951.         refresh: refresh,
  10952.         focus: focus
  10953.       };
  10954.     };
  10955.  
  10956.     var makeEditSwitch = function (webapp) {
  10957.       return build$1(Button.sketch({
  10958.         dom: dom$1('<div class="${prefix}-mask-edit-icon ${prefix}-icon"></div>'),
  10959.         action: function () {
  10960.           webapp.run(function (w) {
  10961.             w.setReadOnly(false);
  10962.           });
  10963.         }
  10964.       }));
  10965.     };
  10966.     var makeSocket = function () {
  10967.       return build$1(Container.sketch({
  10968.         dom: dom$1('<div class="${prefix}-editor-socket"></div>'),
  10969.         components: [],
  10970.         containerBehaviours: derive$2([Replacing.config({})])
  10971.       }));
  10972.     };
  10973.     var showEdit = function (socket, switchToEdit) {
  10974.       Replacing.append(socket, premade(switchToEdit));
  10975.     };
  10976.     var hideEdit = function (socket, switchToEdit) {
  10977.       Replacing.remove(socket, switchToEdit);
  10978.     };
  10979.     var updateMode = function (socket, switchToEdit, readOnly, root) {
  10980.       var swap = readOnly === true ? Swapping.toAlpha : Swapping.toOmega;
  10981.       swap(root);
  10982.       var f = readOnly ? showEdit : hideEdit;
  10983.       f(socket, switchToEdit);
  10984.     };
  10985.  
  10986.     var getAnimationRoot = function (component, slideConfig) {
  10987.       return slideConfig.getAnimationRoot.fold(function () {
  10988.         return component.element;
  10989.       }, function (get) {
  10990.         return get(component);
  10991.       });
  10992.     };
  10993.  
  10994.     var getDimensionProperty = function (slideConfig) {
  10995.       return slideConfig.dimension.property;
  10996.     };
  10997.     var getDimension = function (slideConfig, elem) {
  10998.       return slideConfig.dimension.getDimension(elem);
  10999.     };
  11000.     var disableTransitions = function (component, slideConfig) {
  11001.       var root = getAnimationRoot(component, slideConfig);
  11002.       remove$1(root, [
  11003.         slideConfig.shrinkingClass,
  11004.         slideConfig.growingClass
  11005.       ]);
  11006.     };
  11007.     var setShrunk = function (component, slideConfig) {
  11008.       remove$3(component.element, slideConfig.openClass);
  11009.       add$1(component.element, slideConfig.closedClass);
  11010.       set$5(component.element, getDimensionProperty(slideConfig), '0px');
  11011.       reflow(component.element);
  11012.     };
  11013.     var setGrown = function (component, slideConfig) {
  11014.       remove$3(component.element, slideConfig.closedClass);
  11015.       add$1(component.element, slideConfig.openClass);
  11016.       remove$2(component.element, getDimensionProperty(slideConfig));
  11017.     };
  11018.     var doImmediateShrink = function (component, slideConfig, slideState, _calculatedSize) {
  11019.       slideState.setCollapsed();
  11020.       set$5(component.element, getDimensionProperty(slideConfig), getDimension(slideConfig, component.element));
  11021.       reflow(component.element);
  11022.       disableTransitions(component, slideConfig);
  11023.       setShrunk(component, slideConfig);
  11024.       slideConfig.onStartShrink(component);
  11025.       slideConfig.onShrunk(component);
  11026.     };
  11027.     var doStartShrink = function (component, slideConfig, slideState, calculatedSize) {
  11028.       var size = calculatedSize.getOrThunk(function () {
  11029.         return getDimension(slideConfig, component.element);
  11030.       });
  11031.       slideState.setCollapsed();
  11032.       set$5(component.element, getDimensionProperty(slideConfig), size);
  11033.       reflow(component.element);
  11034.       var root = getAnimationRoot(component, slideConfig);
  11035.       remove$3(root, slideConfig.growingClass);
  11036.       add$1(root, slideConfig.shrinkingClass);
  11037.       setShrunk(component, slideConfig);
  11038.       slideConfig.onStartShrink(component);
  11039.     };
  11040.     var doStartSmartShrink = function (component, slideConfig, slideState) {
  11041.       var size = getDimension(slideConfig, component.element);
  11042.       var shrinker = size === '0px' ? doImmediateShrink : doStartShrink;
  11043.       shrinker(component, slideConfig, slideState, Optional.some(size));
  11044.     };
  11045.     var doStartGrow = function (component, slideConfig, slideState) {
  11046.       var root = getAnimationRoot(component, slideConfig);
  11047.       var wasShrinking = has(root, slideConfig.shrinkingClass);
  11048.       var beforeSize = getDimension(slideConfig, component.element);
  11049.       setGrown(component, slideConfig);
  11050.       var fullSize = getDimension(slideConfig, component.element);
  11051.       var startPartialGrow = function () {
  11052.         set$5(component.element, getDimensionProperty(slideConfig), beforeSize);
  11053.         reflow(component.element);
  11054.       };
  11055.       var startCompleteGrow = function () {
  11056.         setShrunk(component, slideConfig);
  11057.       };
  11058.       var setStartSize = wasShrinking ? startPartialGrow : startCompleteGrow;
  11059.       setStartSize();
  11060.       remove$3(root, slideConfig.shrinkingClass);
  11061.       add$1(root, slideConfig.growingClass);
  11062.       setGrown(component, slideConfig);
  11063.       set$5(component.element, getDimensionProperty(slideConfig), fullSize);
  11064.       slideState.setExpanded();
  11065.       slideConfig.onStartGrow(component);
  11066.     };
  11067.     var refresh$1 = function (component, slideConfig, slideState) {
  11068.       if (slideState.isExpanded()) {
  11069.         remove$2(component.element, getDimensionProperty(slideConfig));
  11070.         var fullSize = getDimension(slideConfig, component.element);
  11071.         set$5(component.element, getDimensionProperty(slideConfig), fullSize);
  11072.       }
  11073.     };
  11074.     var grow = function (component, slideConfig, slideState) {
  11075.       if (!slideState.isExpanded()) {
  11076.         doStartGrow(component, slideConfig, slideState);
  11077.       }
  11078.     };
  11079.     var shrink = function (component, slideConfig, slideState) {
  11080.       if (slideState.isExpanded()) {
  11081.         doStartSmartShrink(component, slideConfig, slideState);
  11082.       }
  11083.     };
  11084.     var immediateShrink = function (component, slideConfig, slideState) {
  11085.       if (slideState.isExpanded()) {
  11086.         doImmediateShrink(component, slideConfig, slideState);
  11087.       }
  11088.     };
  11089.     var hasGrown = function (component, slideConfig, slideState) {
  11090.       return slideState.isExpanded();
  11091.     };
  11092.     var hasShrunk = function (component, slideConfig, slideState) {
  11093.       return slideState.isCollapsed();
  11094.     };
  11095.     var isGrowing = function (component, slideConfig, _slideState) {
  11096.       var root = getAnimationRoot(component, slideConfig);
  11097.       return has(root, slideConfig.growingClass) === true;
  11098.     };
  11099.     var isShrinking = function (component, slideConfig, _slideState) {
  11100.       var root = getAnimationRoot(component, slideConfig);
  11101.       return has(root, slideConfig.shrinkingClass) === true;
  11102.     };
  11103.     var isTransitioning = function (component, slideConfig, slideState) {
  11104.       return isGrowing(component, slideConfig) || isShrinking(component, slideConfig);
  11105.     };
  11106.     var toggleGrow = function (component, slideConfig, slideState) {
  11107.       var f = slideState.isExpanded() ? doStartSmartShrink : doStartGrow;
  11108.       f(component, slideConfig, slideState);
  11109.     };
  11110.  
  11111.     var SlidingApis = /*#__PURE__*/Object.freeze({
  11112.         __proto__: null,
  11113.         refresh: refresh$1,
  11114.         grow: grow,
  11115.         shrink: shrink,
  11116.         immediateShrink: immediateShrink,
  11117.         hasGrown: hasGrown,
  11118.         hasShrunk: hasShrunk,
  11119.         isGrowing: isGrowing,
  11120.         isShrinking: isShrinking,
  11121.         isTransitioning: isTransitioning,
  11122.         toggleGrow: toggleGrow,
  11123.         disableTransitions: disableTransitions
  11124.     });
  11125.  
  11126.     var exhibit = function (base, slideConfig, _slideState) {
  11127.       var expanded = slideConfig.expanded;
  11128.       return expanded ? nu$3({
  11129.         classes: [slideConfig.openClass],
  11130.         styles: {}
  11131.       }) : nu$3({
  11132.         classes: [slideConfig.closedClass],
  11133.         styles: wrap(slideConfig.dimension.property, '0px')
  11134.       });
  11135.     };
  11136.     var events = function (slideConfig, slideState) {
  11137.       return derive$3([runOnSource(transitionend(), function (component, simulatedEvent) {
  11138.           var raw = simulatedEvent.event.raw;
  11139.           if (raw.propertyName === slideConfig.dimension.property) {
  11140.             disableTransitions(component, slideConfig);
  11141.             if (slideState.isExpanded()) {
  11142.               remove$2(component.element, slideConfig.dimension.property);
  11143.             }
  11144.             var notify = slideState.isExpanded() ? slideConfig.onGrown : slideConfig.onShrunk;
  11145.             notify(component);
  11146.           }
  11147.         })]);
  11148.     };
  11149.  
  11150.     var ActiveSliding = /*#__PURE__*/Object.freeze({
  11151.         __proto__: null,
  11152.         exhibit: exhibit,
  11153.         events: events
  11154.     });
  11155.  
  11156.     var SlidingSchema = [
  11157.       required$1('closedClass'),
  11158.       required$1('openClass'),
  11159.       required$1('shrinkingClass'),
  11160.       required$1('growingClass'),
  11161.       option('getAnimationRoot'),
  11162.       onHandler('onShrunk'),
  11163.       onHandler('onStartShrink'),
  11164.       onHandler('onGrown'),
  11165.       onHandler('onStartGrow'),
  11166.       defaulted('expanded', false),
  11167.       requiredOf('dimension', choose$1('property', {
  11168.         width: [
  11169.           output('property', 'width'),
  11170.           output('getDimension', function (elem) {
  11171.             return get$5(elem) + 'px';
  11172.           })
  11173.         ],
  11174.         height: [
  11175.           output('property', 'height'),
  11176.           output('getDimension', function (elem) {
  11177.             return get$7(elem) + 'px';
  11178.           })
  11179.         ]
  11180.       }))
  11181.     ];
  11182.  
  11183.     var init$1 = function (spec) {
  11184.       var state = Cell(spec.expanded);
  11185.       var readState = function () {
  11186.         return 'expanded: ' + state.get();
  11187.       };
  11188.       return nu$2({
  11189.         isExpanded: function () {
  11190.           return state.get() === true;
  11191.         },
  11192.         isCollapsed: function () {
  11193.           return state.get() === false;
  11194.         },
  11195.         setCollapsed: curry(state.set, false),
  11196.         setExpanded: curry(state.set, true),
  11197.         readState: readState
  11198.       });
  11199.     };
  11200.  
  11201.     var SlidingState = /*#__PURE__*/Object.freeze({
  11202.         __proto__: null,
  11203.         init: init$1
  11204.     });
  11205.  
  11206.     var Sliding = create$5({
  11207.       fields: SlidingSchema,
  11208.       name: 'sliding',
  11209.       active: ActiveSliding,
  11210.       apis: SlidingApis,
  11211.       state: SlidingState
  11212.     });
  11213.  
  11214.     var build = function (refresh, scrollIntoView) {
  11215.       var dropup = build$1(Container.sketch({
  11216.         dom: {
  11217.           tag: 'div',
  11218.           classes: [resolve('dropup')]
  11219.         },
  11220.         components: [],
  11221.         containerBehaviours: derive$2([
  11222.           Replacing.config({}),
  11223.           Sliding.config({
  11224.             closedClass: resolve('dropup-closed'),
  11225.             openClass: resolve('dropup-open'),
  11226.             shrinkingClass: resolve('dropup-shrinking'),
  11227.             growingClass: resolve('dropup-growing'),
  11228.             dimension: { property: 'height' },
  11229.             onShrunk: function (component) {
  11230.               refresh();
  11231.               scrollIntoView();
  11232.               Replacing.set(component, []);
  11233.             },
  11234.             onGrown: function (_component) {
  11235.               refresh();
  11236.               scrollIntoView();
  11237.             }
  11238.           }),
  11239.           orientation(function (_component, _data) {
  11240.             disappear(noop);
  11241.           })
  11242.         ])
  11243.       }));
  11244.       var appear = function (menu, update, component) {
  11245.         if (Sliding.hasShrunk(dropup) === true && Sliding.isTransitioning(dropup) === false) {
  11246.           window.requestAnimationFrame(function () {
  11247.             update(component);
  11248.             Replacing.set(dropup, [menu()]);
  11249.             Sliding.grow(dropup);
  11250.           });
  11251.         }
  11252.       };
  11253.       var disappear = function (onReadyToShrink) {
  11254.         window.requestAnimationFrame(function () {
  11255.           onReadyToShrink();
  11256.           Sliding.shrink(dropup);
  11257.         });
  11258.       };
  11259.       return {
  11260.         appear: appear,
  11261.         disappear: disappear,
  11262.         component: dropup,
  11263.         element: dropup.element
  11264.       };
  11265.     };
  11266.  
  11267.     var closest = function (scope, selector, isRoot) {
  11268.       return closest$1(scope, selector, isRoot).isSome();
  11269.     };
  11270.  
  11271.     var isDangerous = function (event) {
  11272.       var keyEv = event.raw;
  11273.       return keyEv.which === BACKSPACE[0] && !contains$1([
  11274.         'input',
  11275.         'textarea'
  11276.       ], name$1(event.target)) && !closest(event.target, '[contenteditable="true"]');
  11277.     };
  11278.     var isFirefox = function () {
  11279.       return detect$1().browser.isFirefox();
  11280.     };
  11281.     var bindFocus = function (container, handler) {
  11282.       if (isFirefox()) {
  11283.         return capture(container, 'focus', handler);
  11284.       } else {
  11285.         return bind(container, 'focusin', handler);
  11286.       }
  11287.     };
  11288.     var bindBlur = function (container, handler) {
  11289.       if (isFirefox()) {
  11290.         return capture(container, 'blur', handler);
  11291.       } else {
  11292.         return bind(container, 'focusout', handler);
  11293.       }
  11294.     };
  11295.     var setup$1 = function (container, rawSettings) {
  11296.       var settings = __assign({ stopBackspace: true }, rawSettings);
  11297.       var pointerEvents = [
  11298.         'touchstart',
  11299.         'touchmove',
  11300.         'touchend',
  11301.         'touchcancel',
  11302.         'gesturestart',
  11303.         'mousedown',
  11304.         'mouseup',
  11305.         'mouseover',
  11306.         'mousemove',
  11307.         'mouseout',
  11308.         'click'
  11309.       ];
  11310.       var tapEvent = monitor$1(settings);
  11311.       var simpleEvents = map$2(pointerEvents.concat([
  11312.         'selectstart',
  11313.         'input',
  11314.         'contextmenu',
  11315.         'change',
  11316.         'transitionend',
  11317.         'transitioncancel',
  11318.         'drag',
  11319.         'dragstart',
  11320.         'dragend',
  11321.         'dragenter',
  11322.         'dragleave',
  11323.         'dragover',
  11324.         'drop',
  11325.         'keyup'
  11326.       ]), function (type) {
  11327.         return bind(container, type, function (event) {
  11328.           tapEvent.fireIfReady(event, type).each(function (tapStopped) {
  11329.             if (tapStopped) {
  11330.               event.kill();
  11331.             }
  11332.           });
  11333.           var stopped = settings.triggerEvent(type, event);
  11334.           if (stopped) {
  11335.             event.kill();
  11336.           }
  11337.         });
  11338.       });
  11339.       var pasteTimeout = value();
  11340.       var onPaste = bind(container, 'paste', function (event) {
  11341.         tapEvent.fireIfReady(event, 'paste').each(function (tapStopped) {
  11342.           if (tapStopped) {
  11343.             event.kill();
  11344.           }
  11345.         });
  11346.         var stopped = settings.triggerEvent('paste', event);
  11347.         if (stopped) {
  11348.           event.kill();
  11349.         }
  11350.         pasteTimeout.set(setTimeout(function () {
  11351.           settings.triggerEvent(postPaste(), event);
  11352.         }, 0));
  11353.       });
  11354.       var onKeydown = bind(container, 'keydown', function (event) {
  11355.         var stopped = settings.triggerEvent('keydown', event);
  11356.         if (stopped) {
  11357.           event.kill();
  11358.         } else if (settings.stopBackspace && isDangerous(event)) {
  11359.           event.prevent();
  11360.         }
  11361.       });
  11362.       var onFocusIn = bindFocus(container, function (event) {
  11363.         var stopped = settings.triggerEvent('focusin', event);
  11364.         if (stopped) {
  11365.           event.kill();
  11366.         }
  11367.       });
  11368.       var focusoutTimeout = value();
  11369.       var onFocusOut = bindBlur(container, function (event) {
  11370.         var stopped = settings.triggerEvent('focusout', event);
  11371.         if (stopped) {
  11372.           event.kill();
  11373.         }
  11374.         focusoutTimeout.set(setTimeout(function () {
  11375.           settings.triggerEvent(postBlur(), event);
  11376.         }, 0));
  11377.       });
  11378.       var unbind = function () {
  11379.         each$1(simpleEvents, function (e) {
  11380.           e.unbind();
  11381.         });
  11382.         onKeydown.unbind();
  11383.         onFocusIn.unbind();
  11384.         onFocusOut.unbind();
  11385.         onPaste.unbind();
  11386.         pasteTimeout.on(clearTimeout);
  11387.         focusoutTimeout.on(clearTimeout);
  11388.       };
  11389.       return { unbind: unbind };
  11390.     };
  11391.  
  11392.     var derive$1 = function (rawEvent, rawTarget) {
  11393.       var source = get$c(rawEvent, 'target').getOr(rawTarget);
  11394.       return Cell(source);
  11395.     };
  11396.  
  11397.     var fromSource = function (event, source) {
  11398.       var stopper = Cell(false);
  11399.       var cutter = Cell(false);
  11400.       var stop = function () {
  11401.         stopper.set(true);
  11402.       };
  11403.       var cut = function () {
  11404.         cutter.set(true);
  11405.       };
  11406.       return {
  11407.         stop: stop,
  11408.         cut: cut,
  11409.         isStopped: stopper.get,
  11410.         isCut: cutter.get,
  11411.         event: event,
  11412.         setSource: source.set,
  11413.         getSource: source.get
  11414.       };
  11415.     };
  11416.     var fromExternal = function (event) {
  11417.       var stopper = Cell(false);
  11418.       var stop = function () {
  11419.         stopper.set(true);
  11420.       };
  11421.       return {
  11422.         stop: stop,
  11423.         cut: noop,
  11424.         isStopped: stopper.get,
  11425.         isCut: never,
  11426.         event: event,
  11427.         setSource: die('Cannot set source of a broadcasted event'),
  11428.         getSource: die('Cannot get source of a broadcasted event')
  11429.       };
  11430.     };
  11431.  
  11432.     var adt = Adt.generate([
  11433.       { stopped: [] },
  11434.       { resume: ['element'] },
  11435.       { complete: [] }
  11436.     ]);
  11437.     var doTriggerHandler = function (lookup, eventType, rawEvent, target, source, logger) {
  11438.       var handler = lookup(eventType, target);
  11439.       var simulatedEvent = fromSource(rawEvent, source);
  11440.       return handler.fold(function () {
  11441.         logger.logEventNoHandlers(eventType, target);
  11442.         return adt.complete();
  11443.       }, function (handlerInfo) {
  11444.         var descHandler = handlerInfo.descHandler;
  11445.         var eventHandler = getCurried(descHandler);
  11446.         eventHandler(simulatedEvent);
  11447.         if (simulatedEvent.isStopped()) {
  11448.           logger.logEventStopped(eventType, handlerInfo.element, descHandler.purpose);
  11449.           return adt.stopped();
  11450.         } else if (simulatedEvent.isCut()) {
  11451.           logger.logEventCut(eventType, handlerInfo.element, descHandler.purpose);
  11452.           return adt.complete();
  11453.         } else {
  11454.           return parent(handlerInfo.element).fold(function () {
  11455.             logger.logNoParent(eventType, handlerInfo.element, descHandler.purpose);
  11456.             return adt.complete();
  11457.           }, function (parent) {
  11458.             logger.logEventResponse(eventType, handlerInfo.element, descHandler.purpose);
  11459.             return adt.resume(parent);
  11460.           });
  11461.         }
  11462.       });
  11463.     };
  11464.     var doTriggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, source, logger) {
  11465.       return doTriggerHandler(lookup, eventType, rawEvent, rawTarget, source, logger).fold(always, function (parent) {
  11466.         return doTriggerOnUntilStopped(lookup, eventType, rawEvent, parent, source, logger);
  11467.       }, never);
  11468.     };
  11469.     var triggerHandler = function (lookup, eventType, rawEvent, target, logger) {
  11470.       var source = derive$1(rawEvent, target);
  11471.       return doTriggerHandler(lookup, eventType, rawEvent, target, source, logger);
  11472.     };
  11473.     var broadcast = function (listeners, rawEvent, _logger) {
  11474.       var simulatedEvent = fromExternal(rawEvent);
  11475.       each$1(listeners, function (listener) {
  11476.         var descHandler = listener.descHandler;
  11477.         var handler = getCurried(descHandler);
  11478.         handler(simulatedEvent);
  11479.       });
  11480.       return simulatedEvent.isStopped();
  11481.     };
  11482.     var triggerUntilStopped = function (lookup, eventType, rawEvent, logger) {
  11483.       return triggerOnUntilStopped(lookup, eventType, rawEvent, rawEvent.target, logger);
  11484.     };
  11485.     var triggerOnUntilStopped = function (lookup, eventType, rawEvent, rawTarget, logger) {
  11486.       var source = derive$1(rawEvent, rawTarget);
  11487.       return doTriggerOnUntilStopped(lookup, eventType, rawEvent, rawTarget, source, logger);
  11488.     };
  11489.  
  11490.     var eventHandler = function (element, descHandler) {
  11491.       return {
  11492.         element: element,
  11493.         descHandler: descHandler
  11494.       };
  11495.     };
  11496.     var broadcastHandler = function (id, handler) {
  11497.       return {
  11498.         id: id,
  11499.         descHandler: handler
  11500.       };
  11501.     };
  11502.     var EventRegistry = function () {
  11503.       var registry = {};
  11504.       var registerId = function (extraArgs, id, events) {
  11505.         each(events, function (v, k) {
  11506.           var handlers = registry[k] !== undefined ? registry[k] : {};
  11507.           handlers[id] = curryArgs(v, extraArgs);
  11508.           registry[k] = handlers;
  11509.         });
  11510.       };
  11511.       var findHandler = function (handlers, elem) {
  11512.         return read(elem).bind(function (id) {
  11513.           return get$c(handlers, id);
  11514.         }).map(function (descHandler) {
  11515.           return eventHandler(elem, descHandler);
  11516.         });
  11517.       };
  11518.       var filterByType = function (type) {
  11519.         return get$c(registry, type).map(function (handlers) {
  11520.           return mapToArray(handlers, function (f, id) {
  11521.             return broadcastHandler(id, f);
  11522.           });
  11523.         }).getOr([]);
  11524.       };
  11525.       var find = function (isAboveRoot, type, target) {
  11526.         return get$c(registry, type).bind(function (handlers) {
  11527.           return closest$3(target, function (elem) {
  11528.             return findHandler(handlers, elem);
  11529.           }, isAboveRoot);
  11530.         });
  11531.       };
  11532.       var unregisterId = function (id) {
  11533.         each(registry, function (handlersById, _eventName) {
  11534.           if (has$2(handlersById, id)) {
  11535.             delete handlersById[id];
  11536.           }
  11537.         });
  11538.       };
  11539.       return {
  11540.         registerId: registerId,
  11541.         unregisterId: unregisterId,
  11542.         filterByType: filterByType,
  11543.         find: find
  11544.       };
  11545.     };
  11546.  
  11547.     var Registry = function () {
  11548.       var events = EventRegistry();
  11549.       var components = {};
  11550.       var readOrTag = function (component) {
  11551.         var elem = component.element;
  11552.         return read(elem).getOrThunk(function () {
  11553.           return write('uid-', component.element);
  11554.         });
  11555.       };
  11556.       var failOnDuplicate = function (component, tagId) {
  11557.         var conflict = components[tagId];
  11558.         if (conflict === component) {
  11559.           unregister(component);
  11560.         } else {
  11561.           throw new Error('The tagId "' + tagId + '" is already used by: ' + element(conflict.element) + '\nCannot use it for: ' + element(component.element) + '\n' + 'The conflicting element is' + (inBody(conflict.element) ? ' ' : ' not ') + 'already in the DOM');
  11562.         }
  11563.       };
  11564.       var register = function (component) {
  11565.         var tagId = readOrTag(component);
  11566.         if (hasNonNullableKey(components, tagId)) {
  11567.           failOnDuplicate(component, tagId);
  11568.         }
  11569.         var extraArgs = [component];
  11570.         events.registerId(extraArgs, tagId, component.events);
  11571.         components[tagId] = component;
  11572.       };
  11573.       var unregister = function (component) {
  11574.         read(component.element).each(function (tagId) {
  11575.           delete components[tagId];
  11576.           events.unregisterId(tagId);
  11577.         });
  11578.       };
  11579.       var filter = function (type) {
  11580.         return events.filterByType(type);
  11581.       };
  11582.       var find = function (isAboveRoot, type, target) {
  11583.         return events.find(isAboveRoot, type, target);
  11584.       };
  11585.       var getById = function (id) {
  11586.         return get$c(components, id);
  11587.       };
  11588.       return {
  11589.         find: find,
  11590.         filter: filter,
  11591.         register: register,
  11592.         unregister: unregister,
  11593.         getById: getById
  11594.       };
  11595.     };
  11596.  
  11597.     var takeover$1 = function (root) {
  11598.       var isAboveRoot = function (el) {
  11599.         return parent(root.element).fold(always, function (parent) {
  11600.           return eq(el, parent);
  11601.         });
  11602.       };
  11603.       var registry = Registry();
  11604.       var lookup = function (eventName, target) {
  11605.         return registry.find(isAboveRoot, eventName, target);
  11606.       };
  11607.       var domEvents = setup$1(root.element, {
  11608.         triggerEvent: function (eventName, event) {
  11609.           return monitorEvent(eventName, event.target, function (logger) {
  11610.             return triggerUntilStopped(lookup, eventName, event, logger);
  11611.           });
  11612.         }
  11613.       });
  11614.       var systemApi = {
  11615.         debugInfo: constant$1('real'),
  11616.         triggerEvent: function (eventName, target, data) {
  11617.           monitorEvent(eventName, target, function (logger) {
  11618.             return triggerOnUntilStopped(lookup, eventName, data, target, logger);
  11619.           });
  11620.         },
  11621.         triggerFocus: function (target, originator) {
  11622.           read(target).fold(function () {
  11623.             focus$3(target);
  11624.           }, function (_alloyId) {
  11625.             monitorEvent(focus$4(), target, function (logger) {
  11626.               triggerHandler(lookup, focus$4(), {
  11627.                 originator: originator,
  11628.                 kill: noop,
  11629.                 prevent: noop,
  11630.                 target: target
  11631.               }, target, logger);
  11632.               return false;
  11633.             });
  11634.           });
  11635.         },
  11636.         triggerEscape: function (comp, simulatedEvent) {
  11637.           systemApi.triggerEvent('keydown', comp.element, simulatedEvent.event);
  11638.         },
  11639.         getByUid: function (uid) {
  11640.           return getByUid(uid);
  11641.         },
  11642.         getByDom: function (elem) {
  11643.           return getByDom(elem);
  11644.         },
  11645.         build: build$1,
  11646.         addToGui: function (c) {
  11647.           add(c);
  11648.         },
  11649.         removeFromGui: function (c) {
  11650.           remove(c);
  11651.         },
  11652.         addToWorld: function (c) {
  11653.           addToWorld(c);
  11654.         },
  11655.         removeFromWorld: function (c) {
  11656.           removeFromWorld(c);
  11657.         },
  11658.         broadcast: function (message) {
  11659.           broadcast$1(message);
  11660.         },
  11661.         broadcastOn: function (channels, message) {
  11662.           broadcastOn(channels, message);
  11663.         },
  11664.         broadcastEvent: function (eventName, event) {
  11665.           broadcastEvent(eventName, event);
  11666.         },
  11667.         isConnected: always
  11668.       };
  11669.       var addToWorld = function (component) {
  11670.         component.connect(systemApi);
  11671.         if (!isText(component.element)) {
  11672.           registry.register(component);
  11673.           each$1(component.components(), addToWorld);
  11674.           systemApi.triggerEvent(systemInit(), component.element, { target: component.element });
  11675.         }
  11676.       };
  11677.       var removeFromWorld = function (component) {
  11678.         if (!isText(component.element)) {
  11679.           each$1(component.components(), removeFromWorld);
  11680.           registry.unregister(component);
  11681.         }
  11682.         component.disconnect();
  11683.       };
  11684.       var add = function (component) {
  11685.         attach(root, component);
  11686.       };
  11687.       var remove = function (component) {
  11688.         detach(component);
  11689.       };
  11690.       var destroy = function () {
  11691.         domEvents.unbind();
  11692.         remove$7(root.element);
  11693.       };
  11694.       var broadcastData = function (data) {
  11695.         var receivers = registry.filter(receive$1());
  11696.         each$1(receivers, function (receiver) {
  11697.           var descHandler = receiver.descHandler;
  11698.           var handler = getCurried(descHandler);
  11699.           handler(data);
  11700.         });
  11701.       };
  11702.       var broadcast$1 = function (message) {
  11703.         broadcastData({
  11704.           universal: true,
  11705.           data: message
  11706.         });
  11707.       };
  11708.       var broadcastOn = function (channels, message) {
  11709.         broadcastData({
  11710.           universal: false,
  11711.           channels: channels,
  11712.           data: message
  11713.         });
  11714.       };
  11715.       var broadcastEvent = function (eventName, event) {
  11716.         var listeners = registry.filter(eventName);
  11717.         return broadcast(listeners, event);
  11718.       };
  11719.       var getByUid = function (uid) {
  11720.         return registry.getById(uid).fold(function () {
  11721.           return Result.error(new Error('Could not find component with uid: "' + uid + '" in system.'));
  11722.         }, Result.value);
  11723.       };
  11724.       var getByDom = function (elem) {
  11725.         var uid = read(elem).getOr('not found');
  11726.         return getByUid(uid);
  11727.       };
  11728.       addToWorld(root);
  11729.       return {
  11730.         root: root,
  11731.         element: root.element,
  11732.         destroy: destroy,
  11733.         add: add,
  11734.         remove: remove,
  11735.         getByUid: getByUid,
  11736.         getByDom: getByDom,
  11737.         addToWorld: addToWorld,
  11738.         removeFromWorld: removeFromWorld,
  11739.         broadcast: broadcast$1,
  11740.         broadcastOn: broadcastOn,
  11741.         broadcastEvent: broadcastEvent
  11742.       };
  11743.     };
  11744.  
  11745.     var READ_ONLY_MODE_CLASS = resolve('readonly-mode');
  11746.     var EDIT_MODE_CLASS = resolve('edit-mode');
  11747.     function OuterContainer (spec) {
  11748.       var root = build$1(Container.sketch({
  11749.         dom: { classes: [resolve('outer-container')].concat(spec.classes) },
  11750.         containerBehaviours: derive$2([Swapping.config({
  11751.             alpha: READ_ONLY_MODE_CLASS,
  11752.             omega: EDIT_MODE_CLASS
  11753.           })])
  11754.       }));
  11755.       return takeover$1(root);
  11756.     }
  11757.  
  11758.     function AndroidRealm (scrollIntoView) {
  11759.       var alloy = OuterContainer({ classes: [resolve('android-container')] });
  11760.       var toolbar = ScrollingToolbar();
  11761.       var webapp = api$2();
  11762.       var switchToEdit = makeEditSwitch(webapp);
  11763.       var socket = makeSocket();
  11764.       var dropup = build(noop, scrollIntoView);
  11765.       alloy.add(toolbar.wrapper);
  11766.       alloy.add(socket);
  11767.       alloy.add(dropup.component);
  11768.       var setToolbarGroups = function (rawGroups) {
  11769.         var groups = toolbar.createGroups(rawGroups);
  11770.         toolbar.setGroups(groups);
  11771.       };
  11772.       var setContextToolbar = function (rawGroups) {
  11773.         var groups = toolbar.createGroups(rawGroups);
  11774.         toolbar.setContextToolbar(groups);
  11775.       };
  11776.       var focusToolbar = function () {
  11777.         toolbar.focus();
  11778.       };
  11779.       var restoreToolbar = function () {
  11780.         toolbar.restoreToolbar();
  11781.       };
  11782.       var init = function (spec) {
  11783.         webapp.set(produce$1(spec));
  11784.       };
  11785.       var exit = function () {
  11786.         webapp.run(function (w) {
  11787.           w.exit();
  11788.           Replacing.remove(socket, switchToEdit);
  11789.         });
  11790.       };
  11791.       var updateMode$1 = function (readOnly) {
  11792.         updateMode(socket, switchToEdit, readOnly, alloy.root);
  11793.       };
  11794.       return {
  11795.         system: alloy,
  11796.         element: alloy.element,
  11797.         init: init,
  11798.         exit: exit,
  11799.         setToolbarGroups: setToolbarGroups,
  11800.         setContextToolbar: setContextToolbar,
  11801.         focusToolbar: focusToolbar,
  11802.         restoreToolbar: restoreToolbar,
  11803.         updateMode: updateMode$1,
  11804.         socket: socket,
  11805.         dropup: dropup
  11806.       };
  11807.     }
  11808.  
  11809.     var input = function (parent, operation) {
  11810.       var input = SugarElement.fromTag('input');
  11811.       setAll(input, {
  11812.         opacity: '0',
  11813.         position: 'absolute',
  11814.         top: '-1000px',
  11815.         left: '-1000px'
  11816.       });
  11817.       append$2(parent, input);
  11818.       focus$3(input);
  11819.       operation(input);
  11820.       remove$7(input);
  11821.     };
  11822.  
  11823.     var refresh = function (winScope) {
  11824.       var sel = winScope.getSelection();
  11825.       if (sel.rangeCount > 0) {
  11826.         var br = sel.getRangeAt(0);
  11827.         var r = winScope.document.createRange();
  11828.         r.setStart(br.startContainer, br.startOffset);
  11829.         r.setEnd(br.endContainer, br.endOffset);
  11830.         sel.removeAllRanges();
  11831.         sel.addRange(r);
  11832.       }
  11833.     };
  11834.  
  11835.     var resume = function (cWin, frame) {
  11836.       active().each(function (active) {
  11837.         if (!eq(active, frame)) {
  11838.           blur$1(active);
  11839.         }
  11840.       });
  11841.       cWin.focus();
  11842.       focus$3(SugarElement.fromDom(cWin.document.body));
  11843.       refresh(cWin);
  11844.     };
  11845.  
  11846.     var stubborn = function (outerBody, cWin, page, frame) {
  11847.       var toEditing = function () {
  11848.         resume(cWin, frame);
  11849.       };
  11850.       var toReading = function () {
  11851.         input(outerBody, blur$1);
  11852.       };
  11853.       var captureInput = bind(page, 'keydown', function (evt) {
  11854.         if (!contains$1([
  11855.             'input',
  11856.             'textarea'
  11857.           ], name$1(evt.target))) {
  11858.           toEditing();
  11859.         }
  11860.       });
  11861.       var onToolbarTouch = noop;
  11862.       var destroy = function () {
  11863.         captureInput.unbind();
  11864.       };
  11865.       return {
  11866.         toReading: toReading,
  11867.         toEditing: toEditing,
  11868.         onToolbarTouch: onToolbarTouch,
  11869.         destroy: destroy
  11870.       };
  11871.     };
  11872.  
  11873.     var initEvents = function (editorApi, iosApi, toolstrip, socket, _dropup) {
  11874.       var saveSelectionFirst = function () {
  11875.         iosApi.run(function (api) {
  11876.           api.highlightSelection();
  11877.         });
  11878.       };
  11879.       var refreshIosSelection = function () {
  11880.         iosApi.run(function (api) {
  11881.           api.refreshSelection();
  11882.         });
  11883.       };
  11884.       var scrollToY = function (yTop, height) {
  11885.         var y = yTop - socket.dom.scrollTop;
  11886.         iosApi.run(function (api) {
  11887.           api.scrollIntoView(y, y + height);
  11888.         });
  11889.       };
  11890.       var scrollToElement = function (_target) {
  11891.         scrollToY(iosApi, socket);
  11892.       };
  11893.       var scrollToCursor = function () {
  11894.         editorApi.getCursorBox().each(function (box) {
  11895.           scrollToY(box.top, box.height);
  11896.         });
  11897.       };
  11898.       var clearSelection = function () {
  11899.         iosApi.run(function (api) {
  11900.           api.clearSelection();
  11901.         });
  11902.       };
  11903.       var clearAndRefresh = function () {
  11904.         clearSelection();
  11905.         refreshThrottle.throttle();
  11906.       };
  11907.       var refreshView = function () {
  11908.         scrollToCursor();
  11909.         iosApi.run(function (api) {
  11910.           api.syncHeight();
  11911.         });
  11912.       };
  11913.       var reposition = function () {
  11914.         var toolbarHeight = get$7(toolstrip);
  11915.         iosApi.run(function (api) {
  11916.           api.setViewportOffset(toolbarHeight);
  11917.         });
  11918.         refreshIosSelection();
  11919.         refreshView();
  11920.       };
  11921.       var toEditing = function () {
  11922.         iosApi.run(function (api) {
  11923.           api.toEditing();
  11924.         });
  11925.       };
  11926.       var toReading = function () {
  11927.         iosApi.run(function (api) {
  11928.           api.toReading();
  11929.         });
  11930.       };
  11931.       var onToolbarTouch = function (event) {
  11932.         iosApi.run(function (api) {
  11933.           api.onToolbarTouch(event);
  11934.         });
  11935.       };
  11936.       var tapping = monitor(editorApi);
  11937.       var refreshThrottle = last(refreshView, 300);
  11938.       var listeners = [
  11939.         editorApi.onKeyup(clearAndRefresh),
  11940.         editorApi.onNodeChanged(refreshIosSelection),
  11941.         editorApi.onDomChanged(refreshThrottle.throttle),
  11942.         editorApi.onDomChanged(refreshIosSelection),
  11943.         editorApi.onScrollToCursor(function (tinyEvent) {
  11944.           tinyEvent.preventDefault();
  11945.           refreshThrottle.throttle();
  11946.         }),
  11947.         editorApi.onScrollToElement(function (event) {
  11948.           scrollToElement(event.element);
  11949.         }),
  11950.         editorApi.onToEditing(toEditing),
  11951.         editorApi.onToReading(toReading),
  11952.         bind(editorApi.doc, 'touchend', function (touchEvent) {
  11953.           if (eq(editorApi.html, touchEvent.target) || eq(editorApi.body, touchEvent.target)) ;
  11954.         }),
  11955.         bind(toolstrip, 'transitionend', function (transitionEvent) {
  11956.           if (transitionEvent.raw.propertyName === 'height') {
  11957.             reposition();
  11958.           }
  11959.         }),
  11960.         capture(toolstrip, 'touchstart', function (touchEvent) {
  11961.           saveSelectionFirst();
  11962.           onToolbarTouch(touchEvent);
  11963.           editorApi.onTouchToolstrip();
  11964.         }),
  11965.         bind(editorApi.body, 'touchstart', function (evt) {
  11966.           clearSelection();
  11967.           editorApi.onTouchContent();
  11968.           tapping.fireTouchstart(evt);
  11969.         }),
  11970.         tapping.onTouchmove(),
  11971.         tapping.onTouchend(),
  11972.         bind(editorApi.body, 'click', function (event) {
  11973.           event.kill();
  11974.         }),
  11975.         bind(toolstrip, 'touchmove', function () {
  11976.           editorApi.onToolbarScrollStart();
  11977.         })
  11978.       ];
  11979.       var destroy = function () {
  11980.         each$1(listeners, function (l) {
  11981.           l.unbind();
  11982.         });
  11983.       };
  11984.       return { destroy: destroy };
  11985.     };
  11986.  
  11987.     function FakeSelection (win, frame) {
  11988.       var doc = win.document;
  11989.       var container = SugarElement.fromTag('div');
  11990.       add$1(container, resolve('unfocused-selections'));
  11991.       append$2(SugarElement.fromDom(doc.documentElement), container);
  11992.       var onTouch = bind(container, 'touchstart', function (event) {
  11993.         event.prevent();
  11994.         resume(win, frame);
  11995.         clear();
  11996.       });
  11997.       var make = function (rectangle) {
  11998.         var span = SugarElement.fromTag('span');
  11999.         add(span, [
  12000.           resolve('layer-editor'),
  12001.           resolve('unfocused-selection')
  12002.         ]);
  12003.         setAll(span, {
  12004.           left: rectangle.left + 'px',
  12005.           top: rectangle.top + 'px',
  12006.           width: rectangle.width + 'px',
  12007.           height: rectangle.height + 'px'
  12008.         });
  12009.         return span;
  12010.       };
  12011.       var update = function () {
  12012.         clear();
  12013.         var rectangles = getRectangles(win);
  12014.         var spans = map$2(rectangles, make);
  12015.         append$1(container, spans);
  12016.       };
  12017.       var clear = function () {
  12018.         empty(container);
  12019.       };
  12020.       var destroy = function () {
  12021.         onTouch.unbind();
  12022.         remove$7(container);
  12023.       };
  12024.       var isActive = function () {
  12025.         return children(container).length > 0;
  12026.       };
  12027.       return {
  12028.         update: update,
  12029.         isActive: isActive,
  12030.         destroy: destroy,
  12031.         clear: clear
  12032.       };
  12033.     }
  12034.  
  12035.     var nu$1 = function (baseFn) {
  12036.       var data = Optional.none();
  12037.       var callbacks = [];
  12038.       var map = function (f) {
  12039.         return nu$1(function (nCallback) {
  12040.           get(function (data) {
  12041.             nCallback(f(data));
  12042.           });
  12043.         });
  12044.       };
  12045.       var get = function (nCallback) {
  12046.         if (isReady()) {
  12047.           call(nCallback);
  12048.         } else {
  12049.           callbacks.push(nCallback);
  12050.         }
  12051.       };
  12052.       var set = function (x) {
  12053.         if (!isReady()) {
  12054.           data = Optional.some(x);
  12055.           run(callbacks);
  12056.           callbacks = [];
  12057.         }
  12058.       };
  12059.       var isReady = function () {
  12060.         return data.isSome();
  12061.       };
  12062.       var run = function (cbs) {
  12063.         each$1(cbs, call);
  12064.       };
  12065.       var call = function (cb) {
  12066.         data.each(function (x) {
  12067.           setTimeout(function () {
  12068.             cb(x);
  12069.           }, 0);
  12070.         });
  12071.       };
  12072.       baseFn(set);
  12073.       return {
  12074.         get: get,
  12075.         map: map,
  12076.         isReady: isReady
  12077.       };
  12078.     };
  12079.     var pure$1 = function (a) {
  12080.       return nu$1(function (callback) {
  12081.         callback(a);
  12082.       });
  12083.     };
  12084.     var LazyValue = {
  12085.       nu: nu$1,
  12086.       pure: pure$1
  12087.     };
  12088.  
  12089.     var errorReporter = function (err) {
  12090.       setTimeout(function () {
  12091.         throw err;
  12092.       }, 0);
  12093.     };
  12094.     var make = function (run) {
  12095.       var get = function (callback) {
  12096.         run().then(callback, errorReporter);
  12097.       };
  12098.       var map = function (fab) {
  12099.         return make(function () {
  12100.           return run().then(fab);
  12101.         });
  12102.       };
  12103.       var bind = function (aFutureB) {
  12104.         return make(function () {
  12105.           return run().then(function (v) {
  12106.             return aFutureB(v).toPromise();
  12107.           });
  12108.         });
  12109.       };
  12110.       var anonBind = function (futureB) {
  12111.         return make(function () {
  12112.           return run().then(function () {
  12113.             return futureB.toPromise();
  12114.           });
  12115.         });
  12116.       };
  12117.       var toLazy = function () {
  12118.         return LazyValue.nu(get);
  12119.       };
  12120.       var toCached = function () {
  12121.         var cache = null;
  12122.         return make(function () {
  12123.           if (cache === null) {
  12124.             cache = run();
  12125.           }
  12126.           return cache;
  12127.         });
  12128.       };
  12129.       var toPromise = run;
  12130.       return {
  12131.         map: map,
  12132.         bind: bind,
  12133.         anonBind: anonBind,
  12134.         toLazy: toLazy,
  12135.         toCached: toCached,
  12136.         toPromise: toPromise,
  12137.         get: get
  12138.       };
  12139.     };
  12140.     var nu = function (baseFn) {
  12141.       return make(function () {
  12142.         return new Promise$1(baseFn);
  12143.       });
  12144.     };
  12145.     var pure = function (a) {
  12146.       return make(function () {
  12147.         return Promise$1.resolve(a);
  12148.       });
  12149.     };
  12150.     var Future = {
  12151.       nu: nu,
  12152.       pure: pure
  12153.     };
  12154.  
  12155.     var adjust = function (value, destination, amount) {
  12156.       if (Math.abs(value - destination) <= amount) {
  12157.         return Optional.none();
  12158.       } else if (value < destination) {
  12159.         return Optional.some(value + amount);
  12160.       } else {
  12161.         return Optional.some(value - amount);
  12162.       }
  12163.     };
  12164.     var create$1 = function () {
  12165.       var interval = null;
  12166.       var animate = function (getCurrent, destination, amount, increment, doFinish, rate) {
  12167.         var finished = false;
  12168.         var finish = function (v) {
  12169.           finished = true;
  12170.           doFinish(v);
  12171.         };
  12172.         global$2.clearInterval(interval);
  12173.         var abort = function (v) {
  12174.           global$2.clearInterval(interval);
  12175.           finish(v);
  12176.         };
  12177.         interval = global$2.setInterval(function () {
  12178.           var value = getCurrent();
  12179.           adjust(value, destination, amount).fold(function () {
  12180.             global$2.clearInterval(interval);
  12181.             finish(destination);
  12182.           }, function (s) {
  12183.             increment(s, abort);
  12184.             if (!finished) {
  12185.               var newValue = getCurrent();
  12186.               if (newValue !== s || Math.abs(newValue - destination) > Math.abs(value - destination)) {
  12187.                 global$2.clearInterval(interval);
  12188.                 finish(destination);
  12189.               }
  12190.             }
  12191.           });
  12192.         }, rate);
  12193.       };
  12194.       return { animate: animate };
  12195.     };
  12196.  
  12197.     var findDevice = function (deviceWidth, deviceHeight) {
  12198.       var devices = [
  12199.         {
  12200.           width: 320,
  12201.           height: 480,
  12202.           keyboard: {
  12203.             portrait: 300,
  12204.             landscape: 240
  12205.           }
  12206.         },
  12207.         {
  12208.           width: 320,
  12209.           height: 568,
  12210.           keyboard: {
  12211.             portrait: 300,
  12212.             landscape: 240
  12213.           }
  12214.         },
  12215.         {
  12216.           width: 375,
  12217.           height: 667,
  12218.           keyboard: {
  12219.             portrait: 305,
  12220.             landscape: 240
  12221.           }
  12222.         },
  12223.         {
  12224.           width: 414,
  12225.           height: 736,
  12226.           keyboard: {
  12227.             portrait: 320,
  12228.             landscape: 240
  12229.           }
  12230.         },
  12231.         {
  12232.           width: 768,
  12233.           height: 1024,
  12234.           keyboard: {
  12235.             portrait: 320,
  12236.             landscape: 400
  12237.           }
  12238.         },
  12239.         {
  12240.           width: 1024,
  12241.           height: 1366,
  12242.           keyboard: {
  12243.             portrait: 380,
  12244.             landscape: 460
  12245.           }
  12246.         }
  12247.       ];
  12248.       return findMap(devices, function (device) {
  12249.         return someIf(deviceWidth <= device.width && deviceHeight <= device.height, device.keyboard);
  12250.       }).getOr({
  12251.         portrait: deviceHeight / 5,
  12252.         landscape: deviceWidth / 4
  12253.       });
  12254.     };
  12255.  
  12256.     var softKeyboardLimits = function (outerWindow) {
  12257.       return findDevice(outerWindow.screen.width, outerWindow.screen.height);
  12258.     };
  12259.     var accountableKeyboardHeight = function (outerWindow) {
  12260.       var portrait = get$1(outerWindow).isPortrait();
  12261.       var limits = softKeyboardLimits(outerWindow);
  12262.       var keyboard = portrait ? limits.portrait : limits.landscape;
  12263.       var visualScreenHeight = portrait ? outerWindow.screen.height : outerWindow.screen.width;
  12264.       return visualScreenHeight - outerWindow.innerHeight > keyboard ? 0 : keyboard;
  12265.     };
  12266.     var getGreenzone = function (socket, dropup) {
  12267.       var outerWindow = owner$2(socket).dom.defaultView;
  12268.       var viewportHeight = get$7(socket) + get$7(dropup);
  12269.       var acc = accountableKeyboardHeight(outerWindow);
  12270.       return viewportHeight - acc;
  12271.     };
  12272.     var updatePadding = function (contentBody, socket, dropup) {
  12273.       var greenzoneHeight = getGreenzone(socket, dropup);
  12274.       var deltaHeight = get$7(socket) + get$7(dropup) - greenzoneHeight;
  12275.       set$5(contentBody, 'padding-bottom', deltaHeight + 'px');
  12276.     };
  12277.  
  12278.     var fixture = Adt.generate([
  12279.       {
  12280.         fixed: [
  12281.           'element',
  12282.           'property',
  12283.           'offsetY'
  12284.         ]
  12285.       },
  12286.       {
  12287.         scroller: [
  12288.           'element',
  12289.           'offsetY'
  12290.         ]
  12291.       }
  12292.     ]);
  12293.     var yFixedData = 'data-' + resolve('position-y-fixed');
  12294.     var yFixedProperty = 'data-' + resolve('y-property');
  12295.     var yScrollingData = 'data-' + resolve('scrolling');
  12296.     var windowSizeData = 'data-' + resolve('last-window-height');
  12297.     var getYFixedData = function (element) {
  12298.       return safeParse(element, yFixedData);
  12299.     };
  12300.     var getYFixedProperty = function (element) {
  12301.       return get$b(element, yFixedProperty);
  12302.     };
  12303.     var getLastWindowSize = function (element) {
  12304.       return safeParse(element, windowSizeData);
  12305.     };
  12306.     var classifyFixed = function (element, offsetY) {
  12307.       var prop = getYFixedProperty(element);
  12308.       return fixture.fixed(element, prop, offsetY);
  12309.     };
  12310.     var classifyScrolling = function (element, offsetY) {
  12311.       return fixture.scroller(element, offsetY);
  12312.     };
  12313.     var classify = function (element) {
  12314.       var offsetY = getYFixedData(element);
  12315.       var classifier = get$b(element, yScrollingData) === 'true' ? classifyScrolling : classifyFixed;
  12316.       return classifier(element, offsetY);
  12317.     };
  12318.     var findFixtures = function (container) {
  12319.       var candidates = descendants(container, '[' + yFixedData + ']');
  12320.       return map$2(candidates, classify);
  12321.     };
  12322.     var takeoverToolbar = function (toolbar) {
  12323.       var oldToolbarStyle = get$b(toolbar, 'style');
  12324.       setAll(toolbar, {
  12325.         position: 'absolute',
  12326.         top: '0px'
  12327.       });
  12328.       set$8(toolbar, yFixedData, '0px');
  12329.       set$8(toolbar, yFixedProperty, 'top');
  12330.       var restore = function () {
  12331.         set$8(toolbar, 'style', oldToolbarStyle || '');
  12332.         remove$6(toolbar, yFixedData);
  12333.         remove$6(toolbar, yFixedProperty);
  12334.       };
  12335.       return { restore: restore };
  12336.     };
  12337.     var takeoverViewport = function (toolbarHeight, height, viewport) {
  12338.       var oldViewportStyle = get$b(viewport, 'style');
  12339.       register$2(viewport);
  12340.       setAll(viewport, {
  12341.         position: 'absolute',
  12342.         height: height + 'px',
  12343.         width: '100%',
  12344.         top: toolbarHeight + 'px'
  12345.       });
  12346.       set$8(viewport, yFixedData, toolbarHeight + 'px');
  12347.       set$8(viewport, yScrollingData, 'true');
  12348.       set$8(viewport, yFixedProperty, 'top');
  12349.       var restore = function () {
  12350.         deregister(viewport);
  12351.         set$8(viewport, 'style', oldViewportStyle || '');
  12352.         remove$6(viewport, yFixedData);
  12353.         remove$6(viewport, yScrollingData);
  12354.         remove$6(viewport, yFixedProperty);
  12355.       };
  12356.       return { restore: restore };
  12357.     };
  12358.     var takeoverDropup = function (dropup) {
  12359.       var oldDropupStyle = get$b(dropup, 'style');
  12360.       setAll(dropup, {
  12361.         position: 'absolute',
  12362.         bottom: '0px'
  12363.       });
  12364.       set$8(dropup, yFixedData, '0px');
  12365.       set$8(dropup, yFixedProperty, 'bottom');
  12366.       var restore = function () {
  12367.         set$8(dropup, 'style', oldDropupStyle || '');
  12368.         remove$6(dropup, yFixedData);
  12369.         remove$6(dropup, yFixedProperty);
  12370.       };
  12371.       return { restore: restore };
  12372.     };
  12373.     var deriveViewportHeight = function (viewport, toolbarHeight, dropupHeight) {
  12374.       var outerWindow = owner$2(viewport).dom.defaultView;
  12375.       var winH = outerWindow.innerHeight;
  12376.       set$8(viewport, windowSizeData, winH + 'px');
  12377.       return winH - toolbarHeight - dropupHeight;
  12378.     };
  12379.     var takeover = function (viewport, contentBody, toolbar, dropup) {
  12380.       var outerWindow = owner$2(viewport).dom.defaultView;
  12381.       var toolbarSetup = takeoverToolbar(toolbar);
  12382.       var toolbarHeight = get$7(toolbar);
  12383.       var dropupHeight = get$7(dropup);
  12384.       var viewportHeight = deriveViewportHeight(viewport, toolbarHeight, dropupHeight);
  12385.       var viewportSetup = takeoverViewport(toolbarHeight, viewportHeight, viewport);
  12386.       var dropupSetup = takeoverDropup(dropup);
  12387.       var isActive = true;
  12388.       var restore = function () {
  12389.         isActive = false;
  12390.         toolbarSetup.restore();
  12391.         viewportSetup.restore();
  12392.         dropupSetup.restore();
  12393.       };
  12394.       var isExpanding = function () {
  12395.         var currentWinHeight = outerWindow.innerHeight;
  12396.         var lastWinHeight = getLastWindowSize(viewport);
  12397.         return currentWinHeight > lastWinHeight;
  12398.       };
  12399.       var refresh = function () {
  12400.         if (isActive) {
  12401.           var newToolbarHeight = get$7(toolbar);
  12402.           var dropupHeight_1 = get$7(dropup);
  12403.           var newHeight = deriveViewportHeight(viewport, newToolbarHeight, dropupHeight_1);
  12404.           set$8(viewport, yFixedData, newToolbarHeight + 'px');
  12405.           set$5(viewport, 'height', newHeight + 'px');
  12406.           updatePadding(contentBody, viewport, dropup);
  12407.         }
  12408.       };
  12409.       var setViewportOffset = function (newYOffset) {
  12410.         var offsetPx = newYOffset + 'px';
  12411.         set$8(viewport, yFixedData, offsetPx);
  12412.         refresh();
  12413.       };
  12414.       updatePadding(contentBody, viewport, dropup);
  12415.       return {
  12416.         setViewportOffset: setViewportOffset,
  12417.         isExpanding: isExpanding,
  12418.         isShrinking: not(isExpanding),
  12419.         refresh: refresh,
  12420.         restore: restore
  12421.       };
  12422.     };
  12423.  
  12424.     var animator = create$1();
  12425.     var ANIMATION_STEP = 15;
  12426.     var NUM_TOP_ANIMATION_FRAMES = 10;
  12427.     var ANIMATION_RATE = 10;
  12428.     var lastScroll = 'data-' + resolve('last-scroll-top');
  12429.     var getTop = function (element) {
  12430.       var raw = getRaw(element, 'top').getOr('0');
  12431.       return parseInt(raw, 10);
  12432.     };
  12433.     var getScrollTop = function (element) {
  12434.       return parseInt(element.dom.scrollTop, 10);
  12435.     };
  12436.     var moveScrollAndTop = function (element, destination, finalTop) {
  12437.       return Future.nu(function (callback) {
  12438.         var getCurrent = curry(getScrollTop, element);
  12439.         var update = function (newScroll) {
  12440.           element.dom.scrollTop = newScroll;
  12441.           set$5(element, 'top', getTop(element) + ANIMATION_STEP + 'px');
  12442.         };
  12443.         var finish = function () {
  12444.           element.dom.scrollTop = destination;
  12445.           set$5(element, 'top', finalTop + 'px');
  12446.           callback(destination);
  12447.         };
  12448.         animator.animate(getCurrent, destination, ANIMATION_STEP, update, finish, ANIMATION_RATE);
  12449.       });
  12450.     };
  12451.     var moveOnlyScroll = function (element, destination) {
  12452.       return Future.nu(function (callback) {
  12453.         var getCurrent = curry(getScrollTop, element);
  12454.         set$8(element, lastScroll, getCurrent());
  12455.         var update = function (newScroll, abort) {
  12456.           var previous = safeParse(element, lastScroll);
  12457.           if (previous !== element.dom.scrollTop) {
  12458.             abort(element.dom.scrollTop);
  12459.           } else {
  12460.             element.dom.scrollTop = newScroll;
  12461.             set$8(element, lastScroll, newScroll);
  12462.           }
  12463.         };
  12464.         var finish = function () {
  12465.           element.dom.scrollTop = destination;
  12466.           set$8(element, lastScroll, destination);
  12467.           callback(destination);
  12468.         };
  12469.         var distance = Math.abs(destination - getCurrent());
  12470.         var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES);
  12471.         animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE);
  12472.       });
  12473.     };
  12474.     var moveOnlyTop = function (element, destination) {
  12475.       return Future.nu(function (callback) {
  12476.         var getCurrent = curry(getTop, element);
  12477.         var update = function (newTop) {
  12478.           set$5(element, 'top', newTop + 'px');
  12479.         };
  12480.         var finish = function () {
  12481.           update(destination);
  12482.           callback(destination);
  12483.         };
  12484.         var distance = Math.abs(destination - getCurrent());
  12485.         var step = Math.ceil(distance / NUM_TOP_ANIMATION_FRAMES);
  12486.         animator.animate(getCurrent, destination, step, update, finish, ANIMATION_RATE);
  12487.       });
  12488.     };
  12489.     var updateTop = function (element, amount) {
  12490.       var newTop = amount + getYFixedData(element) + 'px';
  12491.       set$5(element, 'top', newTop);
  12492.     };
  12493.     var moveWindowScroll = function (toolbar, viewport, destY) {
  12494.       var outerWindow = owner$2(toolbar).dom.defaultView;
  12495.       return Future.nu(function (callback) {
  12496.         updateTop(toolbar, destY);
  12497.         updateTop(viewport, destY);
  12498.         outerWindow.scrollTo(0, destY);
  12499.         callback(destY);
  12500.       });
  12501.     };
  12502.  
  12503.     function BackgroundActivity (doAction) {
  12504.       var action = Cell(LazyValue.pure({}));
  12505.       var start = function (value) {
  12506.         var future = LazyValue.nu(function (callback) {
  12507.           return doAction(value).get(callback);
  12508.         });
  12509.         action.set(future);
  12510.       };
  12511.       var idle = function (g) {
  12512.         action.get().get(function () {
  12513.           g();
  12514.         });
  12515.       };
  12516.       return {
  12517.         start: start,
  12518.         idle: idle
  12519.       };
  12520.     }
  12521.  
  12522.     var scrollIntoView = function (cWin, socket, dropup, top, bottom) {
  12523.       var greenzone = getGreenzone(socket, dropup);
  12524.       var refreshCursor = curry(refresh, cWin);
  12525.       if (top > greenzone || bottom > greenzone) {
  12526.         moveOnlyScroll(socket, socket.dom.scrollTop - greenzone + bottom).get(refreshCursor);
  12527.       } else if (top < 0) {
  12528.         moveOnlyScroll(socket, socket.dom.scrollTop + top).get(refreshCursor);
  12529.       } else ;
  12530.     };
  12531.  
  12532.     var par$1 = function (asyncValues, nu) {
  12533.       return nu(function (callback) {
  12534.         var r = [];
  12535.         var count = 0;
  12536.         var cb = function (i) {
  12537.           return function (value) {
  12538.             r[i] = value;
  12539.             count++;
  12540.             if (count >= asyncValues.length) {
  12541.               callback(r);
  12542.             }
  12543.           };
  12544.         };
  12545.         if (asyncValues.length === 0) {
  12546.           callback([]);
  12547.         } else {
  12548.           each$1(asyncValues, function (asyncValue, i) {
  12549.             asyncValue.get(cb(i));
  12550.           });
  12551.         }
  12552.       });
  12553.     };
  12554.  
  12555.     var par = function (futures) {
  12556.       return par$1(futures, Future.nu);
  12557.     };
  12558.  
  12559.     var updateFixed = function (element, property, winY, offsetY) {
  12560.       var destination = winY + offsetY;
  12561.       set$5(element, property, destination + 'px');
  12562.       return Future.pure(offsetY);
  12563.     };
  12564.     var updateScrollingFixed = function (element, winY, offsetY) {
  12565.       var destTop = winY + offsetY;
  12566.       var oldProp = getRaw(element, 'top').getOr(offsetY);
  12567.       var delta = destTop - parseInt(oldProp, 10);
  12568.       var destScroll = element.dom.scrollTop + delta;
  12569.       return moveScrollAndTop(element, destScroll, destTop);
  12570.     };
  12571.     var updateFixture = function (fixture, winY) {
  12572.       return fixture.fold(function (element, property, offsetY) {
  12573.         return updateFixed(element, property, winY, offsetY);
  12574.       }, function (element, offsetY) {
  12575.         return updateScrollingFixed(element, winY, offsetY);
  12576.       });
  12577.     };
  12578.     var updatePositions = function (container, winY) {
  12579.       var fixtures = findFixtures(container);
  12580.       var updates = map$2(fixtures, function (fixture) {
  12581.         return updateFixture(fixture, winY);
  12582.       });
  12583.       return par(updates);
  12584.     };
  12585.  
  12586.     var VIEW_MARGIN = 5;
  12587.     var register = function (toolstrip, socket, container, outerWindow, structure, cWin) {
  12588.       var scroller = BackgroundActivity(function (y) {
  12589.         return moveWindowScroll(toolstrip, socket, y);
  12590.       });
  12591.       var scrollBounds = function () {
  12592.         var rects = getRectangles(cWin);
  12593.         return Optional.from(rects[0]).bind(function (rect) {
  12594.           var viewTop = rect.top - socket.dom.scrollTop;
  12595.           var outside = viewTop > outerWindow.innerHeight + VIEW_MARGIN || viewTop < -VIEW_MARGIN;
  12596.           return outside ? Optional.some({
  12597.             top: viewTop,
  12598.             bottom: viewTop + rect.height
  12599.           }) : Optional.none();
  12600.         });
  12601.       };
  12602.       var scrollThrottle = last(function () {
  12603.         scroller.idle(function () {
  12604.           updatePositions(container, outerWindow.pageYOffset).get(function () {
  12605.             var extraScroll = scrollBounds();
  12606.             extraScroll.each(function (extra) {
  12607.               socket.dom.scrollTop = socket.dom.scrollTop + extra.top;
  12608.             });
  12609.             scroller.start(0);
  12610.             structure.refresh();
  12611.           });
  12612.         });
  12613.       }, 1000);
  12614.       var onScroll = bind(SugarElement.fromDom(outerWindow), 'scroll', function () {
  12615.         if (outerWindow.pageYOffset < 0) {
  12616.           return;
  12617.         }
  12618.         scrollThrottle.throttle();
  12619.       });
  12620.       updatePositions(container, outerWindow.pageYOffset).get(identity);
  12621.       return { unbind: onScroll.unbind };
  12622.     };
  12623.     var setup = function (bag) {
  12624.       var cWin = bag.cWin;
  12625.       var ceBody = bag.ceBody;
  12626.       var socket = bag.socket;
  12627.       var toolstrip = bag.toolstrip;
  12628.       var contentElement = bag.contentElement;
  12629.       var keyboardType = bag.keyboardType;
  12630.       var outerWindow = bag.outerWindow;
  12631.       var dropup = bag.dropup;
  12632.       var outerBody = bag.outerBody;
  12633.       var structure = takeover(socket, ceBody, toolstrip, dropup);
  12634.       var keyboardModel = keyboardType(outerBody, cWin, body(), contentElement);
  12635.       var toEditing = function () {
  12636.         keyboardModel.toEditing();
  12637.         clearSelection();
  12638.       };
  12639.       var toReading = function () {
  12640.         keyboardModel.toReading();
  12641.       };
  12642.       var onToolbarTouch = function (_event) {
  12643.         keyboardModel.onToolbarTouch();
  12644.       };
  12645.       var onOrientation = onChange(outerWindow, {
  12646.         onChange: noop,
  12647.         onReady: structure.refresh
  12648.       });
  12649.       onOrientation.onAdjustment(function () {
  12650.         structure.refresh();
  12651.       });
  12652.       var onResize = bind(SugarElement.fromDom(outerWindow), 'resize', function () {
  12653.         if (structure.isExpanding()) {
  12654.           structure.refresh();
  12655.         }
  12656.       });
  12657.       var onScroll = register(toolstrip, socket, outerBody, outerWindow, structure, cWin);
  12658.       var unfocusedSelection = FakeSelection(cWin, contentElement);
  12659.       var refreshSelection = function () {
  12660.         if (unfocusedSelection.isActive()) {
  12661.           unfocusedSelection.update();
  12662.         }
  12663.       };
  12664.       var highlightSelection = function () {
  12665.         unfocusedSelection.update();
  12666.       };
  12667.       var clearSelection = function () {
  12668.         unfocusedSelection.clear();
  12669.       };
  12670.       var scrollIntoView$1 = function (top, bottom) {
  12671.         scrollIntoView(cWin, socket, dropup, top, bottom);
  12672.       };
  12673.       var syncHeight = function () {
  12674.         set$5(contentElement, 'height', contentElement.dom.contentWindow.document.body.scrollHeight + 'px');
  12675.       };
  12676.       var setViewportOffset = function (newYOffset) {
  12677.         structure.setViewportOffset(newYOffset);
  12678.         moveOnlyTop(socket, newYOffset).get(identity);
  12679.       };
  12680.       var destroy = function () {
  12681.         structure.restore();
  12682.         onOrientation.destroy();
  12683.         onScroll.unbind();
  12684.         onResize.unbind();
  12685.         keyboardModel.destroy();
  12686.         unfocusedSelection.destroy();
  12687.         input(body(), blur$1);
  12688.       };
  12689.       return {
  12690.         toEditing: toEditing,
  12691.         toReading: toReading,
  12692.         onToolbarTouch: onToolbarTouch,
  12693.         refreshSelection: refreshSelection,
  12694.         clearSelection: clearSelection,
  12695.         highlightSelection: highlightSelection,
  12696.         scrollIntoView: scrollIntoView$1,
  12697.         updateToolbarPadding: noop,
  12698.         setViewportOffset: setViewportOffset,
  12699.         syncHeight: syncHeight,
  12700.         refreshStructure: structure.refresh,
  12701.         destroy: destroy
  12702.       };
  12703.     };
  12704.  
  12705.     var create = function (platform, mask) {
  12706.       var meta = tag();
  12707.       var priorState = value();
  12708.       var scrollEvents = value();
  12709.       var iosApi = api$2();
  12710.       var iosEvents = api$2();
  12711.       var enter = function () {
  12712.         mask.hide();
  12713.         var doc = SugarElement.fromDom(document);
  12714.         getActiveApi(platform.editor).each(function (editorApi) {
  12715.           priorState.set({
  12716.             socketHeight: getRaw(platform.socket, 'height'),
  12717.             iframeHeight: getRaw(editorApi.frame, 'height'),
  12718.             outerScroll: document.body.scrollTop
  12719.           });
  12720.           scrollEvents.set({ exclusives: exclusive(doc, '.' + scrollable) });
  12721.           add$1(platform.container, resolve('fullscreen-maximized'));
  12722.           clobberStyles(platform.container, editorApi.body);
  12723.           meta.maximize();
  12724.           set$5(platform.socket, 'overflow', 'scroll');
  12725.           set$5(platform.socket, '-webkit-overflow-scrolling', 'touch');
  12726.           focus$3(editorApi.body);
  12727.           iosApi.set(setup({
  12728.             cWin: editorApi.win,
  12729.             ceBody: editorApi.body,
  12730.             socket: platform.socket,
  12731.             toolstrip: platform.toolstrip,
  12732.             dropup: platform.dropup.element,
  12733.             contentElement: editorApi.frame,
  12734.             outerBody: platform.body,
  12735.             outerWindow: platform.win,
  12736.             keyboardType: stubborn
  12737.           }));
  12738.           iosApi.run(function (api) {
  12739.             api.syncHeight();
  12740.           });
  12741.           iosEvents.set(initEvents(editorApi, iosApi, platform.toolstrip, platform.socket, platform.dropup));
  12742.         });
  12743.       };
  12744.       var exit = function () {
  12745.         meta.restore();
  12746.         iosEvents.clear();
  12747.         iosApi.clear();
  12748.         mask.show();
  12749.         priorState.on(function (s) {
  12750.           s.socketHeight.each(function (h) {
  12751.             set$5(platform.socket, 'height', h);
  12752.           });
  12753.           s.iframeHeight.each(function (h) {
  12754.             set$5(platform.editor.getFrame(), 'height', h);
  12755.           });
  12756.           document.body.scrollTop = s.scrollTop;
  12757.         });
  12758.         priorState.clear();
  12759.         scrollEvents.on(function (s) {
  12760.           s.exclusives.unbind();
  12761.         });
  12762.         scrollEvents.clear();
  12763.         remove$3(platform.container, resolve('fullscreen-maximized'));
  12764.         restoreStyles();
  12765.         deregister(platform.toolbar);
  12766.         remove$2(platform.socket, 'overflow');
  12767.         remove$2(platform.socket, '-webkit-overflow-scrolling');
  12768.         blur$1(platform.editor.getFrame());
  12769.         getActiveApi(platform.editor).each(function (editorApi) {
  12770.           editorApi.clearSelection();
  12771.         });
  12772.       };
  12773.       var refreshStructure = function () {
  12774.         iosApi.run(function (api) {
  12775.           api.refreshStructure();
  12776.         });
  12777.       };
  12778.       return {
  12779.         enter: enter,
  12780.         refreshStructure: refreshStructure,
  12781.         exit: exit
  12782.       };
  12783.     };
  12784.  
  12785.     var produce = function (raw) {
  12786.       var mobile = asRawOrDie$1('Getting IosWebapp schema', MobileSchema, raw);
  12787.       set$5(mobile.toolstrip, 'width', '100%');
  12788.       set$5(mobile.container, 'position', 'relative');
  12789.       var onView = function () {
  12790.         mobile.setReadOnly(mobile.readOnlyOnInit());
  12791.         mode.enter();
  12792.       };
  12793.       var mask = build$1(sketch(onView, mobile.translate));
  12794.       mobile.alloy.add(mask);
  12795.       var maskApi = {
  12796.         show: function () {
  12797.           mobile.alloy.add(mask);
  12798.         },
  12799.         hide: function () {
  12800.           mobile.alloy.remove(mask);
  12801.         }
  12802.       };
  12803.       var mode = create(mobile, maskApi);
  12804.       return {
  12805.         setReadOnly: mobile.setReadOnly,
  12806.         refreshStructure: mode.refreshStructure,
  12807.         enter: mode.enter,
  12808.         exit: mode.exit,
  12809.         destroy: noop
  12810.       };
  12811.     };
  12812.  
  12813.     function IosRealm (scrollIntoView) {
  12814.       var alloy = OuterContainer({ classes: [resolve('ios-container')] });
  12815.       var toolbar = ScrollingToolbar();
  12816.       var webapp = api$2();
  12817.       var switchToEdit = makeEditSwitch(webapp);
  12818.       var socket = makeSocket();
  12819.       var dropup = build(function () {
  12820.         webapp.run(function (w) {
  12821.           w.refreshStructure();
  12822.         });
  12823.       }, scrollIntoView);
  12824.       alloy.add(toolbar.wrapper);
  12825.       alloy.add(socket);
  12826.       alloy.add(dropup.component);
  12827.       var setToolbarGroups = function (rawGroups) {
  12828.         var groups = toolbar.createGroups(rawGroups);
  12829.         toolbar.setGroups(groups);
  12830.       };
  12831.       var setContextToolbar = function (rawGroups) {
  12832.         var groups = toolbar.createGroups(rawGroups);
  12833.         toolbar.setContextToolbar(groups);
  12834.       };
  12835.       var focusToolbar = function () {
  12836.         toolbar.focus();
  12837.       };
  12838.       var restoreToolbar = function () {
  12839.         toolbar.restoreToolbar();
  12840.       };
  12841.       var init = function (spec) {
  12842.         webapp.set(produce(spec));
  12843.       };
  12844.       var exit = function () {
  12845.         webapp.run(function (w) {
  12846.           Replacing.remove(socket, switchToEdit);
  12847.           w.exit();
  12848.         });
  12849.       };
  12850.       var updateMode$1 = function (readOnly) {
  12851.         updateMode(socket, switchToEdit, readOnly, alloy.root);
  12852.       };
  12853.       return {
  12854.         system: alloy,
  12855.         element: alloy.element,
  12856.         init: init,
  12857.         exit: exit,
  12858.         setToolbarGroups: setToolbarGroups,
  12859.         setContextToolbar: setContextToolbar,
  12860.         focusToolbar: focusToolbar,
  12861.         restoreToolbar: restoreToolbar,
  12862.         updateMode: updateMode$1,
  12863.         socket: socket,
  12864.         dropup: dropup
  12865.       };
  12866.     }
  12867.  
  12868.     var global$1 = tinymce.util.Tools.resolve('tinymce.EditorManager');
  12869.  
  12870.     var derive = function (editor) {
  12871.       var base = Optional.from(getSkinUrl(editor)).getOrThunk(function () {
  12872.         return global$1.baseURL + '/skins/ui/oxide';
  12873.       });
  12874.       return {
  12875.         content: base + '/content.mobile.min.css',
  12876.         ui: base + '/skin.mobile.min.css'
  12877.       };
  12878.     };
  12879.  
  12880.     var fireChange = function (realm, command, state) {
  12881.       realm.system.broadcastOn([formatChanged], {
  12882.         command: command,
  12883.         state: state
  12884.       });
  12885.     };
  12886.     var init = function (realm, editor) {
  12887.       var allFormats = keys(editor.formatter.get());
  12888.       each$1(allFormats, function (command) {
  12889.         editor.formatter.formatChanged(command, function (state) {
  12890.           fireChange(realm, command, state);
  12891.         });
  12892.       });
  12893.       each$1([
  12894.         'ul',
  12895.         'ol'
  12896.       ], function (command) {
  12897.         editor.selection.selectorChanged(command, function (state, _data) {
  12898.           fireChange(realm, command, state);
  12899.         });
  12900.       });
  12901.     };
  12902.  
  12903.     var fireSkinLoaded = function (editor) {
  12904.       return function () {
  12905.         var done = function () {
  12906.           editor._skinLoaded = true;
  12907.           editor.fire('SkinLoaded');
  12908.         };
  12909.         if (editor.initialized) {
  12910.           done();
  12911.         } else {
  12912.           editor.on('init', done);
  12913.         }
  12914.       };
  12915.     };
  12916.  
  12917.     var READING = 'toReading';
  12918.     var EDITING = 'toEditing';
  12919.     var renderMobileTheme = function (editor) {
  12920.       var renderUI = function () {
  12921.         var targetNode = editor.getElement();
  12922.         var cssUrls = derive(editor);
  12923.         if (isSkinDisabled(editor) === false) {
  12924.           var styleSheetLoader_1 = global$5.DOM.styleSheetLoader;
  12925.           editor.contentCSS.push(cssUrls.content);
  12926.           styleSheetLoader_1.load(cssUrls.ui, fireSkinLoaded(editor));
  12927.           editor.on('remove', function () {
  12928.             return styleSheetLoader_1.unload(cssUrls.ui);
  12929.           });
  12930.         } else {
  12931.           fireSkinLoaded(editor)();
  12932.         }
  12933.         var doScrollIntoView = function () {
  12934.           editor.fire('ScrollIntoView');
  12935.         };
  12936.         var realm = detect$1().os.isAndroid() ? AndroidRealm(doScrollIntoView) : IosRealm(doScrollIntoView);
  12937.         var original = SugarElement.fromDom(targetNode);
  12938.         attachSystemAfter(original, realm.system);
  12939.         var findFocusIn = function (elem) {
  12940.           return search(elem).bind(function (focused) {
  12941.             return realm.system.getByDom(focused).toOptional();
  12942.           });
  12943.         };
  12944.         var outerWindow = targetNode.ownerDocument.defaultView;
  12945.         var orientation = onChange(outerWindow, {
  12946.           onChange: function () {
  12947.             var alloy = realm.system;
  12948.             alloy.broadcastOn([orientationChanged], { width: getActualWidth(outerWindow) });
  12949.           },
  12950.           onReady: noop
  12951.         });
  12952.         var setReadOnly = function (dynamicGroup, readOnlyGroups, mainGroups, ro) {
  12953.           if (ro === false) {
  12954.             editor.selection.collapse();
  12955.           }
  12956.           var toolbars = configureToolbar(dynamicGroup, readOnlyGroups, mainGroups);
  12957.           realm.setToolbarGroups(ro === true ? toolbars.readOnly : toolbars.main);
  12958.           editor.setMode(ro === true ? 'readonly' : 'design');
  12959.           editor.fire(ro === true ? READING : EDITING);
  12960.           realm.updateMode(ro);
  12961.         };
  12962.         var configureToolbar = function (dynamicGroup, readOnlyGroups, mainGroups) {
  12963.           var dynamic = dynamicGroup.get();
  12964.           var toolbars = {
  12965.             readOnly: dynamic.backToMask.concat(readOnlyGroups.get()),
  12966.             main: dynamic.backToMask.concat(mainGroups.get())
  12967.           };
  12968.           return toolbars;
  12969.         };
  12970.         var bindHandler = function (label, handler) {
  12971.           editor.on(label, handler);
  12972.           return {
  12973.             unbind: function () {
  12974.               editor.off(label);
  12975.             }
  12976.           };
  12977.         };
  12978.         editor.on('init', function () {
  12979.           realm.init({
  12980.             editor: {
  12981.               getFrame: function () {
  12982.                 return SugarElement.fromDom(editor.contentAreaContainer.querySelector('iframe'));
  12983.               },
  12984.               onDomChanged: function () {
  12985.                 return { unbind: noop };
  12986.               },
  12987.               onToReading: function (handler) {
  12988.                 return bindHandler(READING, handler);
  12989.               },
  12990.               onToEditing: function (handler) {
  12991.                 return bindHandler(EDITING, handler);
  12992.               },
  12993.               onScrollToCursor: function (handler) {
  12994.                 editor.on('ScrollIntoView', function (tinyEvent) {
  12995.                   handler(tinyEvent);
  12996.                 });
  12997.                 var unbind = function () {
  12998.                   editor.off('ScrollIntoView');
  12999.                   orientation.destroy();
  13000.                 };
  13001.                 return { unbind: unbind };
  13002.               },
  13003.               onTouchToolstrip: function () {
  13004.                 hideDropup();
  13005.               },
  13006.               onTouchContent: function () {
  13007.                 var toolbar = SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar')));
  13008.                 findFocusIn(toolbar).each(emitExecute);
  13009.                 realm.restoreToolbar();
  13010.                 hideDropup();
  13011.               },
  13012.               onTapContent: function (evt) {
  13013.                 var target = evt.target;
  13014.                 if (name$1(target) === 'img') {
  13015.                   editor.selection.select(target.dom);
  13016.                   evt.kill();
  13017.                 } else if (name$1(target) === 'a') {
  13018.                   var component = realm.system.getByDom(SugarElement.fromDom(editor.editorContainer));
  13019.                   component.each(function (container) {
  13020.                     if (Swapping.isAlpha(container)) {
  13021.                       openLink(target.dom);
  13022.                     }
  13023.                   });
  13024.                 }
  13025.               }
  13026.             },
  13027.             container: SugarElement.fromDom(editor.editorContainer),
  13028.             socket: SugarElement.fromDom(editor.contentAreaContainer),
  13029.             toolstrip: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolstrip'))),
  13030.             toolbar: SugarElement.fromDom(editor.editorContainer.querySelector('.' + resolve('toolbar'))),
  13031.             dropup: realm.dropup,
  13032.             alloy: realm.system,
  13033.             translate: noop,
  13034.             setReadOnly: function (ro) {
  13035.               setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, ro);
  13036.             },
  13037.             readOnlyOnInit: function () {
  13038.               return readOnlyOnInit();
  13039.             }
  13040.           });
  13041.           var hideDropup = function () {
  13042.             realm.dropup.disappear(function () {
  13043.               realm.system.broadcastOn([dropupDismissed], {});
  13044.             });
  13045.           };
  13046.           var backToMaskGroup = {
  13047.             label: 'The first group',
  13048.             scrollable: false,
  13049.             items: [forToolbar('back', function () {
  13050.                 editor.selection.collapse();
  13051.                 realm.exit();
  13052.               }, {}, editor)]
  13053.           };
  13054.           var backToReadOnlyGroup = {
  13055.             label: 'Back to read only',
  13056.             scrollable: false,
  13057.             items: [forToolbar('readonly-back', function () {
  13058.                 setReadOnly(dynamicGroup, readOnlyGroups, mainGroups, true);
  13059.               }, {}, editor)]
  13060.           };
  13061.           var readOnlyGroup = {
  13062.             label: 'The read only mode group',
  13063.             scrollable: true,
  13064.             items: []
  13065.           };
  13066.           var features = setup$3(realm, editor);
  13067.           var items = detect(editor, features);
  13068.           var actionGroup = {
  13069.             label: 'the action group',
  13070.             scrollable: true,
  13071.             items: items
  13072.           };
  13073.           var extraGroup = {
  13074.             label: 'The extra group',
  13075.             scrollable: false,
  13076.             items: []
  13077.           };
  13078.           var mainGroups = Cell([
  13079.             actionGroup,
  13080.             extraGroup
  13081.           ]);
  13082.           var readOnlyGroups = Cell([
  13083.             readOnlyGroup,
  13084.             extraGroup
  13085.           ]);
  13086.           var dynamicGroup = Cell({
  13087.             backToMask: [backToMaskGroup],
  13088.             backToReadOnly: [backToReadOnlyGroup]
  13089.           });
  13090.           init(realm, editor);
  13091.         });
  13092.         editor.on('remove', function () {
  13093.           realm.exit();
  13094.         });
  13095.         editor.on('detach', function () {
  13096.           detachSystem(realm.system);
  13097.           realm.system.destroy();
  13098.         });
  13099.         return {
  13100.           iframeContainer: realm.socket.element.dom,
  13101.           editorContainer: realm.element.dom
  13102.         };
  13103.       };
  13104.       return {
  13105.         getNotificationManagerImpl: function () {
  13106.           return {
  13107.             open: constant$1({
  13108.               progressBar: { value: noop },
  13109.               close: noop,
  13110.               text: noop,
  13111.               getEl: constant$1(null),
  13112.               moveTo: noop,
  13113.               moveRel: noop,
  13114.               settings: {}
  13115.             }),
  13116.             close: noop,
  13117.             reposition: noop,
  13118.             getArgs: constant$1({})
  13119.           };
  13120.         },
  13121.         renderUI: renderUI
  13122.       };
  13123.     };
  13124.     function Theme () {
  13125.       global$4.add('mobile', renderMobileTheme);
  13126.     }
  13127.  
  13128.     Theme();
  13129.  
  13130. }());
  13131.