var proxy = function (tt, name) {
    return new Proxy(tt, {
        get(target, p, receiver) {
            let res = Reflect.get(target, p, receiver);
            console.log(`${name} get`, p, typeof res)
            return res;
        }
    })
}
var v_saf;
!function () {
    var n = Function.toString, t = [], i = [], o = [].indexOf.bind(t), e = [].push.bind(t), r = [].push.bind(i);

    function u(n, t, tag) {
        return -1 == o(n) && (e(n), r(`function ${tag ? tag : ""}${t || n.name || ""}() { [native code] }`.replaceAll("get get", 'get'))), n
    }

    Object.defineProperty(Function.prototype, "toString", {
        enumerable: !1,
        configurable: !0,
        writable: !0,
        value: function () {
            return "function" == typeof this && i[o(this)] || n.call(this)
        }
    }), u(Function.prototype.toString, "toString"), v_saf = u
}();
"use strict";
const HTMLElementImpl = require("./HTMLElement-impl").implementation;
const notImplemented = require("../../browser/not-implemented");
const idlUtils = require("../generated/utils");
const {Canvas} = require("../../utils");
const util = require("util");
let metrics = {
    "₹": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 714,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -64,
            "actualBoundingBoxRight": 537,
            "width": 600
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 711,
            "actualBoundingBoxDescent": -56,
            "actualBoundingBoxLeft": 4,
            "actualBoundingBoxRight": 575,
            "width": 568
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 714,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -64,
            "actualBoundingBoxRight": 537,
            "width": 600
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 708,
            "actualBoundingBoxDescent": -59,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 571,
            "width": 568
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 714,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -64,
            "actualBoundingBoxRight": 537,
            "width": 600
        }
    },
    "▁": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": -11,
            "actualBoundingBoxDescent": 140,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": -75,
            "actualBoundingBoxDescent": 200,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": -11,
            "actualBoundingBoxDescent": 140,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": -75,
            "actualBoundingBoxDescent": 200,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": -11,
            "actualBoundingBoxDescent": 140,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        }
    },
    "₺": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 702.63671875,
            "actualBoundingBoxDescent": 2.44140625,
            "actualBoundingBoxLeft": -45.8984375,
            "actualBoundingBoxRight": 514.16015625,
            "width": 556.15234375
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 702.63671875,
            "actualBoundingBoxDescent": 2.44140625,
            "actualBoundingBoxLeft": -45.8984375,
            "actualBoundingBoxRight": 514.16015625,
            "width": 556.15234375
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 702.63671875,
            "actualBoundingBoxDescent": 2.44140625,
            "actualBoundingBoxLeft": -45.8984375,
            "actualBoundingBoxRight": 514.16015625,
            "width": 556.15234375
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 702.63671875,
            "actualBoundingBoxDescent": 2.44140625,
            "actualBoundingBoxLeft": -45.8984375,
            "actualBoundingBoxRight": 514.16015625,
            "width": 556.15234375
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 702.63671875,
            "actualBoundingBoxDescent": 2.44140625,
            "actualBoundingBoxLeft": -45.8984375,
            "actualBoundingBoxRight": 514.16015625,
            "width": 556.15234375
        }
    },
    "ꜽ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 561.03515625,
            "actualBoundingBoxDescent": 211.9140625,
            "actualBoundingBoxLeft": -42.96875,
            "actualBoundingBoxRight": 717.28515625,
            "width": 739.2578125
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 561.03515625,
            "actualBoundingBoxDescent": 211.9140625,
            "actualBoundingBoxLeft": -42.96875,
            "actualBoundingBoxRight": 717.28515625,
            "width": 739.2578125
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 561.03515625,
            "actualBoundingBoxDescent": 211.9140625,
            "actualBoundingBoxLeft": -42.96875,
            "actualBoundingBoxRight": 717.28515625,
            "width": 739.2578125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 561.03515625,
            "actualBoundingBoxDescent": 211.9140625,
            "actualBoundingBoxLeft": -42.96875,
            "actualBoundingBoxRight": 717.28515625,
            "width": 739.2578125
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 561.03515625,
            "actualBoundingBoxDescent": 211.9140625,
            "actualBoundingBoxLeft": -42.96875,
            "actualBoundingBoxRight": 717.28515625,
            "width": 739.2578125
        }
    },
    "�": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 875,
            "actualBoundingBoxDescent": 125,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 875,
            "actualBoundingBoxDescent": 125,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 886.71875,
            "actualBoundingBoxDescent": 83.984375,
            "actualBoundingBoxLeft": -40.0390625,
            "actualBoundingBoxRight": 561.5234375,
            "width": 602.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 875,
            "actualBoundingBoxDescent": 125,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 875,
            "actualBoundingBoxDescent": 125,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 1000,
            "width": 1000
        }
    },
    "₸": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 696.77734375,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 532.2265625,
            "width": 556.15234375
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 696.77734375,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 532.2265625,
            "width": 556.15234375
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 696.77734375,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 532.2265625,
            "width": 556.15234375
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 696.77734375,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 532.2265625,
            "width": 556.15234375
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 696.77734375,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 532.2265625,
            "width": 556.15234375
        }
    },
    "׆": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 596.1319580078125,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -83.04891967773438,
            "actualBoundingBoxRight": 367.4630126953125,
            "width": 401.5927429199219
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 596.1319580078125,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -83.04891967773438,
            "actualBoundingBoxRight": 367.4630126953125,
            "width": 401.5927429199219
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 478.02734375,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -183.10546875,
            "actualBoundingBoxRight": 417.96875,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 596.1319580078125,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -83.04891967773438,
            "actualBoundingBoxRight": 367.4630126953125,
            "width": 401.5927429199219
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 596.1319580078125,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -83.04891967773438,
            "actualBoundingBoxRight": 367.4630126953125,
            "width": 401.5927429199219
        }
    },
    "ẞ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 693.84765625,
            "actualBoundingBoxDescent": 12.6953125,
            "actualBoundingBoxLeft": -78.61328125,
            "actualBoundingBoxRight": 631.34765625,
            "width": 679.19921875
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 693.84765625,
            "actualBoundingBoxDescent": 12.6953125,
            "actualBoundingBoxLeft": -78.61328125,
            "actualBoundingBoxRight": 631.34765625,
            "width": 679.19921875
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 693.84765625,
            "actualBoundingBoxDescent": 12.6953125,
            "actualBoundingBoxLeft": -78.61328125,
            "actualBoundingBoxRight": 631.34765625,
            "width": 679.19921875
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 693.84765625,
            "actualBoundingBoxDescent": 12.6953125,
            "actualBoundingBoxLeft": -78.61328125,
            "actualBoundingBoxRight": 631.34765625,
            "width": 679.19921875
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 693.84765625,
            "actualBoundingBoxDescent": 12.6953125,
            "actualBoundingBoxLeft": -78.61328125,
            "actualBoundingBoxRight": 631.34765625,
            "width": 679.19921875
        }
    },
    "ॿ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 642,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": 22,
            "actualBoundingBoxRight": 589,
            "width": 567
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 651,
            "actualBoundingBoxDescent": 5,
            "actualBoundingBoxLeft": 48,
            "actualBoundingBoxRight": 595,
            "width": 560
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 642,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": 22,
            "actualBoundingBoxRight": 589,
            "width": 567
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 651,
            "actualBoundingBoxDescent": 5,
            "actualBoundingBoxLeft": 48,
            "actualBoundingBoxRight": 595,
            "width": 560
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 642,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": 22,
            "actualBoundingBoxRight": 589,
            "width": 567
        }
    },
    "": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 705.078125,
            "actualBoundingBoxDescent": 176.7578125,
            "actualBoundingBoxLeft": -49.8046875,
            "actualBoundingBoxRight": 549.8046875,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 500
        }
    },
    "᳚": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 809,
            "actualBoundingBoxDescent": -598,
            "actualBoundingBoxLeft": 377,
            "actualBoundingBoxRight": -179,
            "width": 0
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 809,
            "actualBoundingBoxDescent": -598,
            "actualBoundingBoxLeft": 377,
            "actualBoundingBoxRight": -179,
            "width": 0
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 809,
            "actualBoundingBoxDescent": -598,
            "actualBoundingBoxLeft": 377,
            "actualBoundingBoxRight": -179,
            "width": 0
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 809,
            "actualBoundingBoxDescent": -598,
            "actualBoundingBoxLeft": 377,
            "actualBoundingBoxRight": -179,
            "width": 0
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 809,
            "actualBoundingBoxDescent": -598,
            "actualBoundingBoxLeft": 377,
            "actualBoundingBoxRight": -179,
            "width": 0
        }
    },
    "៝": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 890.13671875,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 17.08984375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 477.05078125
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 908.203125,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -64.94140625,
            "actualBoundingBoxRight": 532.71484375,
            "width": 600.5859375
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 890.13671875,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 17.08984375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 477.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 908.203125,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -64.94140625,
            "actualBoundingBoxRight": 532.71484375,
            "width": 600.5859375
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 890.13671875,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 17.08984375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 477.05078125
        }
    },
    "⎮": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 769.53125,
            "actualBoundingBoxDescent": 250,
            "actualBoundingBoxLeft": -250.48828125,
            "actualBoundingBoxRight": 347.16796875,
            "width": 602.05078125
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 772.94921875,
            "actualBoundingBoxDescent": 246.09375,
            "actualBoundingBoxLeft": -290.0390625,
            "actualBoundingBoxRight": 391.11328125,
            "width": 686.03515625
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 769.53125,
            "actualBoundingBoxDescent": 250,
            "actualBoundingBoxLeft": -250.48828125,
            "actualBoundingBoxRight": 347.16796875,
            "width": 602.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 772.94921875,
            "actualBoundingBoxDescent": 246.09375,
            "actualBoundingBoxLeft": -290.0390625,
            "actualBoundingBoxRight": 391.11328125,
            "width": 686.03515625
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 769.53125,
            "actualBoundingBoxDescent": 250,
            "actualBoundingBoxLeft": -250.48828125,
            "actualBoundingBoxRight": 347.16796875,
            "width": 602.05078125
        }
    },
    "ം": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 330.078125,
            "actualBoundingBoxDescent": 5.859375,
            "actualBoundingBoxLeft": -31.25,
            "actualBoundingBoxRight": 344.7265625,
            "width": 385.25390625
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 268.5546875,
            "actualBoundingBoxDescent": 5.859375,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 321.2890625,
            "width": 392.578125
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 330.078125,
            "actualBoundingBoxDescent": 5.859375,
            "actualBoundingBoxLeft": -31.25,
            "actualBoundingBoxRight": 344.7265625,
            "width": 385.25390625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 268.5546875,
            "actualBoundingBoxDescent": 5.859375,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 321.2890625,
            "width": 392.578125
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 330.078125,
            "actualBoundingBoxDescent": 5.859375,
            "actualBoundingBoxLeft": -31.25,
            "actualBoundingBoxRight": 344.7265625,
            "width": 385.25390625
        }
    },
    "ஂ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 746.09375,
            "actualBoundingBoxDescent": 11.23046875,
            "actualBoundingBoxLeft": -55.17578125,
            "actualBoundingBoxRight": 571.77734375,
            "width": 626.953125
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 746.09375,
            "actualBoundingBoxDescent": 11.23046875,
            "actualBoundingBoxLeft": -55.17578125,
            "actualBoundingBoxRight": 571.77734375,
            "width": 626.953125
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 746.09375,
            "actualBoundingBoxDescent": 11.23046875,
            "actualBoundingBoxLeft": -55.17578125,
            "actualBoundingBoxRight": 571.77734375,
            "width": 626.953125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 746.09375,
            "actualBoundingBoxDescent": 11.23046875,
            "actualBoundingBoxLeft": -55.17578125,
            "actualBoundingBoxRight": 571.77734375,
            "width": 626.953125
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 746.09375,
            "actualBoundingBoxDescent": 11.23046875,
            "actualBoundingBoxLeft": -55.17578125,
            "actualBoundingBoxRight": 571.77734375,
            "width": 626.953125
        }
    },
    "ᅚ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 705.078125,
            "actualBoundingBoxDescent": 176.7578125,
            "actualBoundingBoxLeft": -49.8046875,
            "actualBoundingBoxRight": 549.8046875,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 500
        }
    },
    "␥": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 543.45703125,
            "actualBoundingBoxDescent": -40.0390625,
            "actualBoundingBoxLeft": -62.5,
            "actualBoundingBoxRight": 565.91796875,
            "width": 628.41796875
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 543.45703125,
            "actualBoundingBoxDescent": -40.0390625,
            "actualBoundingBoxLeft": -62.5,
            "actualBoundingBoxRight": 565.91796875,
            "width": 628.41796875
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 543.45703125,
            "actualBoundingBoxDescent": -40.0390625,
            "actualBoundingBoxLeft": -62.5,
            "actualBoundingBoxRight": 565.91796875,
            "width": 628.41796875
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 543.45703125,
            "actualBoundingBoxDescent": -40.0390625,
            "actualBoundingBoxLeft": -62.5,
            "actualBoundingBoxRight": 565.91796875,
            "width": 628.41796875
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 543.45703125,
            "actualBoundingBoxDescent": -40.0390625,
            "actualBoundingBoxLeft": -62.5,
            "actualBoundingBoxRight": 565.91796875,
            "width": 628.41796875
        }
    },
    "〮": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 588.8671875,
            "actualBoundingBoxDescent": -161.1328125,
            "actualBoundingBoxLeft": -84.9609375,
            "actualBoundingBoxRight": 1514.16015625,
            "width": 1600.09765625
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 588.8671875,
            "actualBoundingBoxDescent": -161.1328125,
            "actualBoundingBoxLeft": -84.9609375,
            "actualBoundingBoxRight": 1514.16015625,
            "width": 1600.09765625
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 588.8671875,
            "actualBoundingBoxDescent": -161.1328125,
            "actualBoundingBoxLeft": -84.9609375,
            "actualBoundingBoxRight": 1514.16015625,
            "width": 1600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 588.8671875,
            "actualBoundingBoxDescent": -161.1328125,
            "actualBoundingBoxLeft": -84.9609375,
            "actualBoundingBoxRight": 1514.16015625,
            "width": 1600.09765625
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 588.8671875,
            "actualBoundingBoxDescent": -161.1328125,
            "actualBoundingBoxLeft": -84.9609375,
            "actualBoundingBoxRight": 1514.16015625,
            "width": 1600.09765625
        }
    },
    "꠰": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 622,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -78,
            "actualBoundingBoxRight": 159,
            "width": 237
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 622,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -78,
            "actualBoundingBoxRight": 159,
            "width": 237
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 622,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -78,
            "actualBoundingBoxRight": 159,
            "width": 237
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 622,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -78,
            "actualBoundingBoxRight": 159,
            "width": 237
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 622,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -78,
            "actualBoundingBoxRight": 159,
            "width": 237
        }
    },
    "⬆": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 834,
            "actualBoundingBoxDescent": 62,
            "actualBoundingBoxLeft": -133,
            "actualBoundingBoxRight": 867,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 834,
            "actualBoundingBoxDescent": 62,
            "actualBoundingBoxLeft": -133,
            "actualBoundingBoxRight": 867,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 834,
            "actualBoundingBoxDescent": 62,
            "actualBoundingBoxLeft": -133,
            "actualBoundingBoxRight": 867,
            "width": 1000
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 834,
            "actualBoundingBoxDescent": 62,
            "actualBoundingBoxLeft": -133,
            "actualBoundingBoxRight": 867,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 834,
            "actualBoundingBoxDescent": 62,
            "actualBoundingBoxLeft": -133,
            "actualBoundingBoxRight": 867,
            "width": 1000
        }
    },
    "⇤": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 572.265625,
            "actualBoundingBoxDescent": -150.390625,
            "actualBoundingBoxLeft": -84.47265625,
            "actualBoundingBoxRight": 916.015625,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 572.265625,
            "actualBoundingBoxDescent": -150.390625,
            "actualBoundingBoxLeft": -84.47265625,
            "actualBoundingBoxRight": 916.015625,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 436.03515625,
            "actualBoundingBoxDescent": -111.81640625,
            "actualBoundingBoxLeft": -32.2265625,
            "actualBoundingBoxRight": 569.82421875,
            "width": 602.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 572.265625,
            "actualBoundingBoxDescent": -150.390625,
            "actualBoundingBoxLeft": -84.47265625,
            "actualBoundingBoxRight": 916.015625,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 572.265625,
            "actualBoundingBoxDescent": -150.390625,
            "actualBoundingBoxLeft": -84.47265625,
            "actualBoundingBoxRight": 916.015625,
            "width": 1000
        }
    },
    "₽": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 630,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -26,
            "actualBoundingBoxRight": 470,
            "width": 495
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 630,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -26,
            "actualBoundingBoxRight": 470,
            "width": 495
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 630,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -26,
            "actualBoundingBoxRight": 470,
            "width": 495
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 630,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -26,
            "actualBoundingBoxRight": 470,
            "width": 495
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 630,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -26,
            "actualBoundingBoxRight": 470,
            "width": 495
        }
    },
    "ⱻ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 545.41015625,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.4140625,
            "actualBoundingBoxRight": 382.8125,
            "width": 407.2265625
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 545.41015625,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.4140625,
            "actualBoundingBoxRight": 382.8125,
            "width": 407.2265625
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 545.41015625,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.4140625,
            "actualBoundingBoxRight": 382.8125,
            "width": 407.2265625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 545.41015625,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.4140625,
            "actualBoundingBoxRight": 382.8125,
            "width": 407.2265625
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 545.41015625,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.4140625,
            "actualBoundingBoxRight": 382.8125,
            "width": 407.2265625
        }
    },
    "₰": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 734.86328125,
            "actualBoundingBoxDescent": 96.19140625,
            "actualBoundingBoxLeft": -96.19140625,
            "actualBoundingBoxRight": 901.3671875,
            "width": 901.85546875
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 734.86328125,
            "actualBoundingBoxDescent": 96.19140625,
            "actualBoundingBoxLeft": -96.19140625,
            "actualBoundingBoxRight": 901.3671875,
            "width": 901.85546875
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 742.1875,
            "actualBoundingBoxDescent": 14.16015625,
            "actualBoundingBoxLeft": -22.4609375,
            "actualBoundingBoxRight": 569.3359375,
            "width": 602.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 734.86328125,
            "actualBoundingBoxDescent": 96.19140625,
            "actualBoundingBoxLeft": -96.19140625,
            "actualBoundingBoxRight": 901.3671875,
            "width": 901.85546875
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 734.86328125,
            "actualBoundingBoxDescent": 96.19140625,
            "actualBoundingBoxLeft": -96.19140625,
            "actualBoundingBoxRight": 901.3671875,
            "width": 901.85546875
        }
    },
    "ﯮ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 661.844482421875,
            "actualBoundingBoxDescent": 181.283935546875,
            "actualBoundingBoxLeft": 68.2640380859375,
            "actualBoundingBoxRight": 683.9963989257812,
            "width": 687.1609497070312
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 661.844482421875,
            "actualBoundingBoxDescent": 181.283935546875,
            "actualBoundingBoxLeft": 68.2640380859375,
            "actualBoundingBoxRight": 683.9963989257812,
            "width": 687.1609497070312
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 661.844482421875,
            "actualBoundingBoxDescent": 181.283935546875,
            "actualBoundingBoxLeft": 68.2640380859375,
            "actualBoundingBoxRight": 683.9963989257812,
            "width": 687.1609497070312
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 661.844482421875,
            "actualBoundingBoxDescent": 181.283935546875,
            "actualBoundingBoxLeft": 68.2640380859375,
            "actualBoundingBoxRight": 683.9963989257812,
            "width": 687.1609497070312
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 661.844482421875,
            "actualBoundingBoxDescent": 181.283935546875,
            "actualBoundingBoxLeft": 68.2640380859375,
            "actualBoundingBoxRight": 683.9963989257812,
            "width": 687.1609497070312
        }
    },
    "": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 705.078125,
            "actualBoundingBoxDescent": 176.7578125,
            "actualBoundingBoxLeft": -49.8046875,
            "actualBoundingBoxRight": 549.8046875,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 500
        }
    },
    "": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 705.078125,
            "actualBoundingBoxDescent": 176.7578125,
            "actualBoundingBoxLeft": -49.8046875,
            "actualBoundingBoxRight": 549.8046875,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 500
        }
    },
    "": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 501
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 501
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        }
    },
    "Ⴀ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 715.8203125,
            "actualBoundingBoxDescent": 15.13671875,
            "actualBoundingBoxLeft": -41.9921875,
            "actualBoundingBoxRight": 632.8125,
            "width": 662.109375
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 715.8203125,
            "actualBoundingBoxDescent": 15.13671875,
            "actualBoundingBoxLeft": -41.9921875,
            "actualBoundingBoxRight": 632.8125,
            "width": 662.109375
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 715.8203125,
            "actualBoundingBoxDescent": 15.13671875,
            "actualBoundingBoxLeft": -41.9921875,
            "actualBoundingBoxRight": 632.8125,
            "width": 662.109375
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 715.8203125,
            "actualBoundingBoxDescent": 15.13671875,
            "actualBoundingBoxLeft": -41.9921875,
            "actualBoundingBoxRight": 632.8125,
            "width": 662.109375
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 715.8203125,
            "actualBoundingBoxDescent": 15.13671875,
            "actualBoundingBoxLeft": -41.9921875,
            "actualBoundingBoxRight": 632.8125,
            "width": 662.109375
        }
    },
    "𝞐": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 657,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 66,
            "actualBoundingBoxRight": 512,
            "width": 553
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 657,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 66,
            "actualBoundingBoxRight": 512,
            "width": 553
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 657,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 66,
            "actualBoundingBoxRight": 512,
            "width": 553
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 657,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 66,
            "actualBoundingBoxRight": 512,
            "width": 553
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 657,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 66,
            "actualBoundingBoxRight": 512,
            "width": 553
        }
    },
    "܀": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 382,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 478,
            "width": 591
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 382,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 478,
            "width": 591
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 382,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 478,
            "width": 591
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 382,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 478,
            "width": 591
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 382,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 478,
            "width": 591
        }
    },
    "ᥐ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 546,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": 10,
            "actualBoundingBoxRight": 469,
            "width": 513
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 546,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": 10,
            "actualBoundingBoxRight": 469,
            "width": 513
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 546,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": 10,
            "actualBoundingBoxRight": 469,
            "width": 513
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 546,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": 10,
            "actualBoundingBoxRight": 469,
            "width": 513
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 546,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": 10,
            "actualBoundingBoxRight": 469,
            "width": 513
        }
    },
    "ゕ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 629,
            "actualBoundingBoxDescent": 44,
            "actualBoundingBoxLeft": -150,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 620,
            "actualBoundingBoxDescent": 13,
            "actualBoundingBoxLeft": -175,
            "actualBoundingBoxRight": 867,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 629,
            "actualBoundingBoxDescent": 44,
            "actualBoundingBoxLeft": -150,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 620,
            "actualBoundingBoxDescent": 13,
            "actualBoundingBoxLeft": -175,
            "actualBoundingBoxRight": 867,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 629,
            "actualBoundingBoxDescent": 44,
            "actualBoundingBoxLeft": -150,
            "actualBoundingBoxRight": 875,
            "width": 1000
        }
    },
    "匭": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 784,
            "actualBoundingBoxDescent": 86,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 952,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 759,
            "actualBoundingBoxDescent": 153,
            "actualBoundingBoxLeft": -63,
            "actualBoundingBoxRight": 936,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 784,
            "actualBoundingBoxDescent": 86,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 952,
            "width": 1000
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 682,
            "actualBoundingBoxDescent": 107,
            "actualBoundingBoxLeft": -108,
            "actualBoundingBoxRight": 855,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 784,
            "actualBoundingBoxDescent": 86,
            "actualBoundingBoxLeft": -114,
            "actualBoundingBoxRight": 952,
            "width": 1000
        }
    },
    "؜": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 0
        }
    },
    "⃣": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 1010.7421875,
            "actualBoundingBoxDescent": 270.99609375,
            "actualBoundingBoxLeft": 1015.13671875,
            "actualBoundingBoxRight": 266.6015625,
            "width": 0
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 1010.7421875,
            "actualBoundingBoxDescent": 270.99609375,
            "actualBoundingBoxLeft": 1015.13671875,
            "actualBoundingBoxRight": 266.6015625,
            "width": 0
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 1010.7421875,
            "actualBoundingBoxDescent": 270.99609375,
            "actualBoundingBoxLeft": 1015.13671875,
            "actualBoundingBoxRight": 266.6015625,
            "width": 0
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 1010.7421875,
            "actualBoundingBoxDescent": 270.99609375,
            "actualBoundingBoxLeft": 1015.13671875,
            "actualBoundingBoxRight": 266.6015625,
            "width": 0
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 1010.7421875,
            "actualBoundingBoxDescent": 270.99609375,
            "actualBoundingBoxLeft": 1015.13671875,
            "actualBoundingBoxRight": 266.6015625,
            "width": 0
        }
    },
    "￹": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 602.05078125
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 602.05078125
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 602.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 602.05078125
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 602.05078125
        }
    },
    "Ș": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 728,
            "actualBoundingBoxDescent": 211,
            "actualBoundingBoxLeft": -32,
            "actualBoundingBoxRight": 943,
            "width": 632
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 695,
            "actualBoundingBoxDescent": 189.5,
            "actualBoundingBoxLeft": -36,
            "actualBoundingBoxRight": 437,
            "width": 477
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 596.19140625,
            "actualBoundingBoxDescent": 359.177734375,
            "actualBoundingBoxLeft": -69.82421875,
            "actualBoundingBoxRight": 524.90234375,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 695,
            "actualBoundingBoxDescent": 189.5,
            "actualBoundingBoxLeft": -38,
            "actualBoundingBoxRight": 437,
            "width": 484
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 665.0390625,
            "actualBoundingBoxDescent": 282.71484375,
            "actualBoundingBoxLeft": -9.765625,
            "actualBoundingBoxRight": 611.81640625,
            "width": 651.85546875
        }
    },
    "֏": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 724,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -59,
            "actualBoundingBoxRight": 708,
            "width": 732
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 724,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -59,
            "actualBoundingBoxRight": 708,
            "width": 732
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 724,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -59,
            "actualBoundingBoxRight": 708,
            "width": 732
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 724,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -59,
            "actualBoundingBoxRight": 708,
            "width": 732
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 724,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -59,
            "actualBoundingBoxRight": 708,
            "width": 732
        }
    },
    "ࣤ": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 619.62890625,
            "actualBoundingBoxDescent": -469.23828125,
            "actualBoundingBoxLeft": -73.2421875,
            "actualBoundingBoxRight": 285.64453125,
            "width": 0
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 619.62890625,
            "actualBoundingBoxDescent": -469.23828125,
            "actualBoundingBoxLeft": -73.2421875,
            "actualBoundingBoxRight": 285.64453125,
            "width": 0
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 619.62890625,
            "actualBoundingBoxDescent": -469.23828125,
            "actualBoundingBoxLeft": -73.2421875,
            "actualBoundingBoxRight": 285.64453125,
            "width": 0
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 619.62890625,
            "actualBoundingBoxDescent": -469.23828125,
            "actualBoundingBoxLeft": -73.2421875,
            "actualBoundingBoxRight": 285.64453125,
            "width": 0
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 619.62890625,
            "actualBoundingBoxDescent": -469.23828125,
            "actualBoundingBoxLeft": -73.2421875,
            "actualBoundingBoxRight": 285.64453125,
            "width": 0
        }
    },
    "঳": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 0,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": 0,
            "actualBoundingBoxRight": 0,
            "width": 1000
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 705.078125,
            "actualBoundingBoxDescent": 176.7578125,
            "actualBoundingBoxLeft": -49.8046875,
            "actualBoundingBoxRight": 549.8046875,
            "width": 600.09765625
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -125,
            "actualBoundingBoxRight": 875,
            "width": 1000
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 750,
            "actualBoundingBoxDescent": 0,
            "actualBoundingBoxLeft": -24.90234375,
            "actualBoundingBoxRight": 475.09765625,
            "width": 500
        }
    },
    "᱐": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 725,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": -49,
            "actualBoundingBoxRight": 523,
            "width": 572
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 725,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": -49,
            "actualBoundingBoxRight": 523,
            "width": 572
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 725,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": -49,
            "actualBoundingBoxRight": 523,
            "width": 572
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 725,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": -49,
            "actualBoundingBoxRight": 523,
            "width": 572
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 725,
            "actualBoundingBoxDescent": 10,
            "actualBoundingBoxLeft": -49,
            "actualBoundingBoxRight": 523,
            "width": 572
        }
    },
    "☙": {
        "1000px sans-serif": {
            "actualBoundingBoxAscent": 556.640625,
            "actualBoundingBoxDescent": -203.61328125,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 579.1015625,
            "width": 602.05078125
        },
        "1000px serif": {
            "actualBoundingBoxAscent": 556.640625,
            "actualBoundingBoxDescent": -203.61328125,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 579.1015625,
            "width": 602.05078125
        },
        "1000px monospace": {
            "actualBoundingBoxAscent": 556.640625,
            "actualBoundingBoxDescent": -203.61328125,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 579.1015625,
            "width": 602.05078125
        },
        "1000px cursive": {
            "actualBoundingBoxAscent": 556.640625,
            "actualBoundingBoxDescent": -203.61328125,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 579.1015625,
            "width": 602.05078125
        },
        "1000px fantasy": {
            "actualBoundingBoxAscent": 556.640625,
            "actualBoundingBoxDescent": -203.61328125,
            "actualBoundingBoxLeft": -22.94921875,
            "actualBoundingBoxRight": 579.1015625,
            "width": 602.05078125
        }
    },
    "0-_{w.": {
        "50px  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Andale Mono',  sans-serif": {
            "actualBoundingBoxAscent": 35.107421875,
            "actualBoundingBoxDescent": 10.888671875,
            "actualBoundingBoxLeft": -3.5888671875,
            "actualBoundingBoxRight": 167.919921875,
            "width": 180.029296875
        },
        "50px 'Andale Mono',  serif": {
            "actualBoundingBoxAscent": 35.107421875,
            "actualBoundingBoxDescent": 10.888671875,
            "actualBoundingBoxLeft": -3.5888671875,
            "actualBoundingBoxRight": 167.919921875,
            "width": 180.029296875
        },
        "50px 'Arial Narrow',  sans-serif": {
            "actualBoundingBoxAscent": 36.4013671875,
            "actualBoundingBoxDescent": 10.5224609375,
            "actualBoundingBoxLeft": -1.6357421875,
            "actualBoundingBoxRight": 108.1787109375,
            "width": 111.6943359375
        },
        "50px 'Arial Narrow',  serif": {
            "actualBoundingBoxAscent": 36.4013671875,
            "actualBoundingBoxDescent": 10.5224609375,
            "actualBoundingBoxLeft": -1.6357421875,
            "actualBoundingBoxRight": 108.1787109375,
            "width": 111.6943359375
        },
        "50px 'Arial Unicode MS',  sans-serif": {
            "actualBoundingBoxAscent": 36.4013671875,
            "actualBoundingBoxDescent": 10.498046875,
            "actualBoundingBoxLeft": -2.24609375,
            "actualBoundingBoxRight": 131.7138671875,
            "width": 136.1572265625
        },
        "50px 'Arial Unicode MS',  serif": {
            "actualBoundingBoxAscent": 36.4013671875,
            "actualBoundingBoxDescent": 10.498046875,
            "actualBoundingBoxLeft": -2.24609375,
            "actualBoundingBoxRight": 131.7138671875,
            "width": 136.1572265625
        },
        "50px 'Batang',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Batang',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Bell MT',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Bell MT',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Brush Script',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Brush Script',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Brush Script MT',  sans-serif": {
            "actualBoundingBoxAscent": 32.958984375,
            "actualBoundingBoxDescent": 13.9892578125,
            "actualBoundingBoxLeft": -0.29296875,
            "actualBoundingBoxRight": 124.4873046875,
            "width": 133.740234375
        },
        "50px 'Brush Script MT',  serif": {
            "actualBoundingBoxAscent": 32.958984375,
            "actualBoundingBoxDescent": 13.9892578125,
            "actualBoundingBoxLeft": -0.29296875,
            "actualBoundingBoxRight": 124.4873046875,
            "width": 133.740234375
        },
        "50px 'Calibri',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Calibri',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Charter',  sans-serif": {
            "actualBoundingBoxAscent": 35.15625,
            "actualBoundingBoxDescent": 11.7919921875,
            "actualBoundingBoxLeft": -2.05078125,
            "actualBoundingBoxRight": 135.7666015625,
            "width": 139.55078125
        },
        "50px 'Charter',  serif": {
            "actualBoundingBoxAscent": 35.15625,
            "actualBoundingBoxDescent": 11.7919921875,
            "actualBoundingBoxLeft": -2.05078125,
            "actualBoundingBoxRight": 135.7666015625,
            "width": 139.55078125
        },
        "50px 'Courier',  sans-serif": {
            "actualBoundingBoxAscent": 31.640625,
            "actualBoundingBoxDescent": 11.7919921875,
            "actualBoundingBoxLeft": -5.0048828125,
            "actualBoundingBoxRight": 169.82421875,
            "width": 180.029296875
        },
        "50px 'Courier',  serif": {
            "actualBoundingBoxAscent": 31.640625,
            "actualBoundingBoxDescent": 11.7919921875,
            "actualBoundingBoxLeft": -5.0048828125,
            "actualBoundingBoxRight": 169.82421875,
            "width": 180.029296875
        },
        "50px 'Courier New',  sans-serif": {
            "actualBoundingBoxAscent": 31.3720703125,
            "actualBoundingBoxDescent": 13.6962890625,
            "actualBoundingBoxLeft": -5.5908203125,
            "actualBoundingBoxRight": 168.798828125,
            "width": 180.029296875
        },
        "50px 'Courier New',  serif": {
            "actualBoundingBoxAscent": 31.3720703125,
            "actualBoundingBoxDescent": 13.6962890625,
            "actualBoundingBoxLeft": -5.5908203125,
            "actualBoundingBoxRight": 168.798828125,
            "width": 180.029296875
        },
        "50px 'Curlz MT',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Curlz MT',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'DejaVu Sans',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'DejaVu Sans',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'DejaVu Sans Mono',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'DejaVu Sans Mono',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'DejaVu Serif Condensed',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'DejaVu Serif Condensed',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Droid Sans',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Droid Sans',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Droid Sans Fallback',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Droid Sans Fallback',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Droid Serif',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Droid Serif',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Forte',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Forte',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Futura',  sans-serif": {
            "actualBoundingBoxAscent": 41.650390625,
            "actualBoundingBoxDescent": 10.44921875,
            "actualBoundingBoxLeft": -2.1240234375,
            "actualBoundingBoxRight": 135.0341796875,
            "width": 139.35546875
        },
        "50px 'Futura',  serif": {
            "actualBoundingBoxAscent": 41.650390625,
            "actualBoundingBoxDescent": 10.44921875,
            "actualBoundingBoxLeft": -2.1240234375,
            "actualBoundingBoxRight": 135.0341796875,
            "width": 139.35546875
        },
        "50px 'Geneva',  sans-serif": {
            "actualBoundingBoxAscent": 40.1611328125,
            "actualBoundingBoxDescent": 9.08203125,
            "actualBoundingBoxLeft": -2.83203125,
            "actualBoundingBoxRight": 157.9345703125,
            "width": 162.3046875
        },
        "50px 'Geneva',  serif": {
            "actualBoundingBoxAscent": 40.1611328125,
            "actualBoundingBoxDescent": 9.08203125,
            "actualBoundingBoxLeft": -2.83203125,
            "actualBoundingBoxRight": 157.9345703125,
            "width": 162.3046875
        },
        "50px 'Hei',  sans-serif": {
            "actualBoundingBoxAscent": 38.3544921875,
            "actualBoundingBoxDescent": 5.0048828125,
            "actualBoundingBoxLeft": -2.294921875,
            "actualBoundingBoxRight": 150.3662109375,
            "width": 153.41796875
        },
        "50px 'Hei',  serif": {
            "actualBoundingBoxAscent": 38.3544921875,
            "actualBoundingBoxDescent": 5.0048828125,
            "actualBoundingBoxLeft": -2.294921875,
            "actualBoundingBoxRight": 150.3662109375,
            "width": 153.41796875
        },
        "50px 'Leelawadee',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Leelawadee',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Levenim MT',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Levenim MT',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Liberation Sans',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Liberation Sans',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Liberation Sans Narrow',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Liberation Sans Narrow',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Marlett',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Marlett',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Meiryo UI',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Meiryo UI',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Microsoft Uighur',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Microsoft Uighur',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Microsoft YaHei UI',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Microsoft YaHei UI',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'MS Mincho',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'MS Mincho',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'MS UI Gothic',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'MS UI Gothic',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'NanumGothic',  sans-serif": {
            "actualBoundingBoxAscent": 38.95000076293945,
            "actualBoundingBoxDescent": 8.800003051757812,
            "actualBoundingBoxLeft": -3.049999952316284,
            "actualBoundingBoxRight": 143.64996337890625,
            "width": 148.39996337890625
        },
        "50px 'NanumGothic',  serif": {
            "actualBoundingBoxAscent": 38.95000076293945,
            "actualBoundingBoxDescent": 8.800003051757812,
            "actualBoundingBoxLeft": -3.049999952316284,
            "actualBoundingBoxRight": 143.64996337890625,
            "width": 148.39996337890625
        },
        "50px 'Nirmala UI',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Nirmala UI',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Palatino',  sans-serif": {
            "actualBoundingBoxAscent": 36.3037109375,
            "actualBoundingBoxDescent": 8.69140625,
            "actualBoundingBoxLeft": -1.513671875,
            "actualBoundingBoxRight": 129.5654296875,
            "width": 132.91015625
        },
        "50px 'Palatino',  serif": {
            "actualBoundingBoxAscent": 36.3037109375,
            "actualBoundingBoxDescent": 8.69140625,
            "actualBoundingBoxLeft": -1.513671875,
            "actualBoundingBoxRight": 129.5654296875,
            "width": 132.91015625
        },
        "50px 'Papyrus',  sans-serif": {
            "actualBoundingBoxAscent": 34.08203125,
            "actualBoundingBoxDescent": 10.2783203125,
            "actualBoundingBoxLeft": -1.66015625,
            "actualBoundingBoxRight": 136.1572265625,
            "width": 139.84375
        },
        "50px 'Papyrus',  serif": {
            "actualBoundingBoxAscent": 34.08203125,
            "actualBoundingBoxDescent": 10.2783203125,
            "actualBoundingBoxLeft": -1.66015625,
            "actualBoundingBoxRight": 136.1572265625,
            "width": 139.84375
        },
        "50px 'PMingLiU',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'PMingLiU',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'PT Serif',  sans-serif": {
            "actualBoundingBoxAscent": 35.60000228881836,
            "actualBoundingBoxDescent": 11.5,
            "actualBoundingBoxLeft": -1.75,
            "actualBoundingBoxRight": 130.54998779296875,
            "width": 134.0999755859375
        },
        "50px 'PT Serif',  serif": {
            "actualBoundingBoxAscent": 35.60000228881836,
            "actualBoundingBoxDescent": 11.5,
            "actualBoundingBoxLeft": -1.75,
            "actualBoundingBoxRight": 130.54998779296875,
            "width": 134.0999755859375
        },
        "50px 'SimHei',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'SimHei',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'STIXVariants',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 12.200000762939453,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 137.3000030517578,
            "width": 140.84999084472656
        },
        "50px 'STIXVariants',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 12.200000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 121.9999771118164,
            "width": 124.79997253417969
        },
        "50px 'STSong',  sans-serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.649999976158142,
            "actualBoundingBoxRight": 130.0999755859375,
            "width": 132.94996643066406
        },
        "50px 'STSong',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.649999976158142,
            "actualBoundingBoxRight": 130.0999755859375,
            "width": 132.94996643066406
        },
        "50px 'Traditional Arabic',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Traditional Arabic',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Urdu Typesetting',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Urdu Typesetting',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        },
        "50px 'Verdana',  sans-serif": {
            "actualBoundingBoxAscent": 37.98828125,
            "actualBoundingBoxDescent": 9.5703125,
            "actualBoundingBoxLeft": -3.3447265625,
            "actualBoundingBoxRight": 169.23828125,
            "width": 175.4150390625
        },
        "50px 'Verdana',  serif": {
            "actualBoundingBoxAscent": 37.98828125,
            "actualBoundingBoxDescent": 9.5703125,
            "actualBoundingBoxLeft": -3.3447265625,
            "actualBoundingBoxRight": 169.23828125,
            "width": 175.4150390625
        },
        "50px 'Wingdings',  sans-serif": {
            "actualBoundingBoxAscent": 39.5751953125,
            "actualBoundingBoxDescent": 10.2294921875,
            "actualBoundingBoxLeft": -4.2236328125,
            "actualBoundingBoxRight": 307.3974609375,
            "width": 311.5966796875
        },
        "50px 'Wingdings',  serif": {
            "actualBoundingBoxAscent": 39.5751953125,
            "actualBoundingBoxDescent": 10.2294921875,
            "actualBoundingBoxLeft": -4.2236328125,
            "actualBoundingBoxRight": 307.3974609375,
            "width": 311.5966796875
        },
        "50px 'Wingdings 3',  sans-serif": {
            "actualBoundingBoxAscent": 38.9404296875,
            "actualBoundingBoxDescent": 2.783203125,
            "actualBoundingBoxLeft": -4.8095703125,
            "actualBoundingBoxRight": 240.3076171875,
            "width": 244.5068359375
        },
        "50px 'Wingdings 3',  serif": {
            "actualBoundingBoxAscent": 38.9404296875,
            "actualBoundingBoxDescent": 2.783203125,
            "actualBoundingBoxLeft": -4.8095703125,
            "actualBoundingBoxRight": 240.3076171875,
            "width": 244.5068359375
        },
        "50px 'Helkevtrica',  sans-serif": {
            "actualBoundingBoxAscent": 41.35000228881836,
            "actualBoundingBoxDescent": 7,
            "actualBoundingBoxLeft": -2.5,
            "actualBoundingBoxRight": 149.3000030517578,
            "width": 152.84999084472656
        },
        "50px 'Helkevtrica',  serif": {
            "actualBoundingBoxAscent": 38.70000076293945,
            "actualBoundingBoxDescent": 6.950000762939453,
            "actualBoundingBoxLeft": -1.600000023841858,
            "actualBoundingBoxRight": 129.59996032714844,
            "width": 132.39996337890625
        }
    }

}
let textRandom = parseInt(Math.random() * 79 + 930) / 1000

class TextMetrics {
    constructor(text, context, font) {
        this._text = text
        this._font = font
        this._context = context
        // this._TextMetrics = context.measureText(text)
        try {
            this._TextMetrics = metrics[this._text][this._font]
        } catch (e) {
            console.log('_TextMetrics', this._text, this._font)
            this._TextMetrics = {
                width: 180.55
            }
        }
    }

    get width() {
        let res = this._TextMetrics.width;
        if (res.toString().indexOf('.') !== -1) {
            res = res * textRandom;
        } else {
            res = parseInt(res * textRandom);
        }
        return res;
    }

    get actualBoundingBoxAscent() {
        let res = this._TextMetrics.actualBoundingBoxAscent;
        if (res.toString().indexOf('.') !== -1) {
            res = res * textRandom;
        } else {
            res = parseInt(res * textRandom);
        }
        return res;

    }

    get actualBoundingBoxDescent() {
        let res = this._TextMetrics.actualBoundingBoxDescent;
        if (res.toString().indexOf('.') !== -1) {
            res = res * textRandom;
        } else {
            res = parseInt(res * textRandom);
        }
        // console.log(this._TextMetrics.actualBoundingBoxDescent, res)
        return res;

    }

    get actualBoundingBoxLeft() {
        let res = this._TextMetrics.actualBoundingBoxLeft;
        if (res.toString().indexOf('.') !== -1) {
            res = res * textRandom;
        } else {
            res = parseInt(res * textRandom);
        }
        return res;

    }

    get actualBoundingBoxRight() {
        let res = this._TextMetrics.actualBoundingBoxRight;
        if (res.toString().indexOf('.') !== -1) {
            res = res * textRandom;
        } else {
            res = parseInt(res * textRandom);
        }
        return res;

    }
}

function randInt(a, b) {
    return parseInt(Math.random() * (b - a) + a)
}


class CanvasRenderingContext2D {

    imageDatas = {
        "18,90,1,1": [214, 122, 6, 255],
        "38,77,1,1": [255, 255, 255, 255],
        "48,28,1,1": [0, 0, 0, 0],
        "94,23,1,1": [0, 0, 0, 0],
        "26,46,1,1": [253, 243, 245, 255],
        "47,23,1,1": [0, 0, 0, 0],
        "37,17,1,1": [0, 0, 0, 255],
        "62,28,1,1": [204, 131, 217, 255]
    }
    constructor(w, h, context) {
        console.log('OffscreenCanvasRenderingContext2D.new', w, h)
        this.width = w;
        this.height = h;
        if (context) {
            this._context = context

        } else {
            this._context = Canvas.createCanvas(w, h).getContext('2d')

        }
    }

    set font(f) {
        console.log('1.font', f)
        this._font = f;
        this._context.font = f;
    }

    measureText(text) {
        console.log('OffscreenCanvasRenderingContext2D.measureText', text)
        this._text = text;
        window.fonts.push({
            font: this._font,
            text: text
        })
        let res = new TextMetrics(text, this._context, this._font);
        // return proxy(res, 'TextMetrics')
        return res;
    }

    get canvas() {
        console.log('CanvasRenderingContext2D.canvas.get')
    }

    get globalAlpha() {
        console.log('CanvasRenderingContext2D.globalAlpha.get')
    }

    set globalAlpha(args) {
        console.log('CanvasRenderingContext2D.globalAlpha.set', args)
    }

    get globalCompositeOperation() {
        console.log('CanvasRenderingContext2D.globalCompositeOperation.get')
    }

    set globalCompositeOperation(args) {
        console.log('CanvasRenderingContext2D.globalCompositeOperation.set', args)
    }

    get filter() {
        console.log('CanvasRenderingContext2D.filter.get')
    }

    set filter(args) {
        console.log('CanvasRenderingContext2D.filter.set', args)
    }

    get imageSmoothingEnabled() {
        console.log('CanvasRenderingContext2D.imageSmoothingEnabled.get')
    }

    set imageSmoothingEnabled(args) {
        console.log('CanvasRenderingContext2D.imageSmoothingEnabled.set', args)
    }

    get imageSmoothingQuality() {
        console.log('CanvasRenderingContext2D.imageSmoothingQuality.get')
    }

    set imageSmoothingQuality(args) {
        console.log('CanvasRenderingContext2D.imageSmoothingQuality.set', args)
    }

    get strokeStyle() {
        console.log('CanvasRenderingContext2D.strokeStyle.get')
    }

    set strokeStyle(args) {
        console.log('CanvasRenderingContext2D.strokeStyle.set', args)
        return this._context.strokeStyle = args
    }

    get fillStyle() {
        console.log('CanvasRenderingContext2D.fillStyle.get')
    }

    set fillStyle(args) {
        console.log('CanvasRenderingContext2D.fillStyle.set', args)
        this._context.canvas.fillStyle = args
        this._fillStyle = args

    }

    get shadowOffsetX() {
        console.log('CanvasRenderingContext2D.shadowOffsetX.get')
    }

    set shadowOffsetX(args) {
        console.log('CanvasRenderingContext2D.shadowOffsetX.set', args)
        this._context.shadowOffsetX = args
    }

    get shadowOffsetY() {
        console.log('CanvasRenderingContext2D.shadowOffsetY.get')
    }

    set shadowOffsetY(args) {
        console.log('CanvasRenderingContext2D.shadowOffsetY.set', args)
        this._context.shadowOffsetY = args

    }

    get shadowBlur() {
        console.log('CanvasRenderingContext2D.shadowBlur.get')
    }

    set shadowBlur(args) {
        console.log('CanvasRenderingContext2D.shadowBlur.set', args)
        this._context.shadowBlur = args

    }

    get shadowColor() {
        console.log('CanvasRenderingContext2D.shadowColor.get')

    }

    set shadowColor(args) {
        console.log('CanvasRenderingContext2D.shadowColor.set', args)
        this._context.shadowColor = args

    }

    get lineWidth() {
        console.log('CanvasRenderingContext2D.lineWidth.get')
    }

    set lineWidth(args) {
        console.log('CanvasRenderingContext2D.lineWidth.set', args)
        this._context.lineWidth = args;
    }

    get lineCap() {
        console.log('CanvasRenderingContext2D.lineCap.get')
    }

    set lineCap(args) {
        console.log('CanvasRenderingContext2D.lineCap.set', args)
    }

    get lineJoin() {
        console.log('CanvasRenderingContext2D.lineJoin.get')
    }

    set lineJoin(args) {
        console.log('CanvasRenderingContext2D.lineJoin.set', args)
    }

    get miterLimit() {
        console.log('CanvasRenderingContext2D.miterLimit.get')
    }

    set miterLimit(args) {
        console.log('CanvasRenderingContext2D.miterLimit.set', args)
    }

    get lineDashOffset() {
        console.log('CanvasRenderingContext2D.lineDashOffset.get')
    }

    set lineDashOffset(args) {
        console.log('CanvasRenderingContext2D.lineDashOffset.set', args)
    }

    get font() {
        console.log('CanvasRenderingContext2D.font.get')
        return this._context.font;
    }

    get textAlign() {
        console.log('CanvasRenderingContext2D.textAlign.get')
    }

    set textAlign(args) {
        console.log('CanvasRenderingContext2D.textAlign.set', args)
    }

    get textBaseline() {
        console.log('CanvasRenderingContext2D.textBaseline.get')
        return this._context.textBaseline
    }

    set textBaseline(args) {
        console.log('CanvasRenderingContext2D.textBaseline.set', args)
        this._context.textBaseline = args
    }

    get direction() {
        console.log('CanvasRenderingContext2D.direction.get')
        return this._context.direction;
    }

    set direction(args) {
        console.log('CanvasRenderingContext2D.direction.set', args)
        this._context.direction = args

    }

    get fontKerning() {
        console.log('CanvasRenderingContext2D.fontKerning.get')
    }

    set fontKerning(args) {
        console.log('CanvasRenderingContext2D.fontKerning.set', args)
    }

    get fontStretch() {
        console.log('CanvasRenderingContext2D.fontStretch.get')
    }

    set fontStretch(args) {
        console.log('CanvasRenderingContext2D.fontStretch.set', args)
    }

    get fontVariantCaps() {
        console.log('CanvasRenderingContext2D.fontVariantCaps.get')
    }

    set fontVariantCaps(args) {
        console.log('CanvasRenderingContext2D.fontVariantCaps.set', args)
    }

    get letterSpacing() {
        console.log('CanvasRenderingContext2D.letterSpacing.get')
    }

    set letterSpacing(args) {
        console.log('CanvasRenderingContext2D.letterSpacing.set', args)
    }

    get textRendering() {
        console.log('CanvasRenderingContext2D.textRendering.get')
    }

    set textRendering(args) {
        console.log('CanvasRenderingContext2D.textRendering.set', args)
    }

    get wordSpacing() {
        console.log('CanvasRenderingContext2D.wordSpacing.get')
    }

    set wordSpacing(args) {
        console.log('CanvasRenderingContext2D.wordSpacing.set', args)
    }

    clip() {
        console.log('CanvasRenderingContext2D.clip')
    }

    createConicGradient() {
        console.log('CanvasRenderingContext2D.createConicGradient')
    }

    createImageData() {
        console.log('CanvasRenderingContext2D.createImageData')
    }

    createLinearGradient() {
        console.log('CanvasRenderingContext2D.createLinearGradient')

        return this._context.createLinearGradient(...arguments)
    }

    createPattern() {
        console.log('CanvasRenderingContext2D.createPattern')
    }

    createRadialGradient() {
        console.log('CanvasRenderingContext2D.createRadialGradient')
    }

    drawFocusIfNeeded() {
        console.log('CanvasRenderingContext2D.drawFocusIfNeeded')
    }

    drawImage() {
        console.log('CanvasRenderingContext2D.drawImage')
        this._context.drawImage(...arguments)
    }

    fill() {
        console.log('CanvasRenderingContext2D.fill')
    }

    fillText() {
        console.log('CanvasRenderingContext2D.fillText', ...arguments)
        this._context.fillText(...arguments)
        this._fillText = [arguments[0], arguments[1], arguments[2]]
    }

    getContextAttributes() {
        console.log('CanvasRenderingContext2D.getContextAttributes')
    }

    getImageData() {
        let res = this._context.getImageData(...arguments)
        window.imageDatas.push({
            font: this._context.font,
            fillStyle: this._fillStyle,
            fillText: this._fillText,
            imageData: [arguments[0], arguments[1], arguments[2], arguments[3]]
        })
        let tdata = this.imageDatas[[arguments[0], arguments[1], arguments[2], arguments[3]]+''];
        if (tdata){
            res.data[0] = tdata[0]
            res.data[1] = tdata[1]
            res.data[2] = tdata[2]
            res.data[3] = tdata[3]
        }
        console.log('CanvasRenderingContext2D.getImageData', ...arguments, res)

        return res
    }

    getLineDash() {
        console.log('CanvasRenderingContext2D.getLineDash')
    }

    getTransform() {
        console.log('CanvasRenderingContext2D.getTransform')
    }

    isContextLost() {
        console.log('CanvasRenderingContext2D.isContextLost')
    }

    isPointInPath() {
        console.log('CanvasRenderingContext2D.isPointInPath')
    }

    isPointInStroke() {
        console.log('CanvasRenderingContext2D.isPointInStroke')
    }

    putImageData() {
        console.log('CanvasRenderingContext2D.putImageData')
    }

    reset() {
        console.log('CanvasRenderingContext2D.reset')
    }

    roundRect() {
        console.log('CanvasRenderingContext2D.roundRect')
    }

    save() {
        console.log('CanvasRenderingContext2D.save')
    }

    scale() {
        console.log('CanvasRenderingContext2D.scale')
    }

    setLineDash() {
        console.log('CanvasRenderingContext2D.setLineDash')
    }

    setTransform() {
        console.log('CanvasRenderingContext2D.setTransform')
    }

    stroke() {
        console.log('CanvasRenderingContext2D.stroke')
        this._context.stroke()
    }

    strokeText() {
        console.log('CanvasRenderingContext2D.strokeText')
    }

    transform() {
        console.log('CanvasRenderingContext2D.transform')
    }

    translate() {
        console.log('CanvasRenderingContext2D.translate')
    }

    arc() {
        console.log('CanvasRenderingContext2D.arc')
        return this._context.arc(...arguments)
    }

    arcTo() {
        console.log('CanvasRenderingContext2D.arcTo')
    }

    beginPath() {
        console.log('CanvasRenderingContext2D.beginPath')
        return this._context.beginPath()
    }

    bezierCurveTo() {
        console.log('CanvasRenderingContext2D.bezierCurveTo')
    }

    clearRect() {
        console.log('CanvasRenderingContext2D.clearRect')
    }

    closePath() {
        console.log('CanvasRenderingContext2D.closePath')
        return this._context.closePath(...arguments)

    }

    ellipse() {
        console.log('CanvasRenderingContext2D.ellipse')
    }

    fillRect() {
        console.log('CanvasRenderingContext2D.fillRect')
        return this._context.fillRect(...arguments)
    }

    lineTo() {
        console.log('CanvasRenderingContext2D.lineTo')
        return this._context.lineTo(...arguments)

    }

    moveTo() {
        console.log('CanvasRenderingContext2D.moveTo')
        return this._context.moveTo(...arguments)
    }

    quadraticCurveTo() {
        console.log('CanvasRenderingContext2D.quadraticCurveTo')
    }

    rect() {
        console.log('CanvasRenderingContext2D.rect')
    }

    resetTransform() {
        console.log('CanvasRenderingContext2D.resetTransform')
    }

    restore() {
        console.log('CanvasRenderingContext2D.restore')
    }

    rotate() {
        console.log('CanvasRenderingContext2D.rotate')
    }

    strokeRect() {
        console.log('CanvasRenderingContext2D.strokeRect')
    }


}

Object.defineProperties(CanvasRenderingContext2D.prototype, {
    canvas: {enumerable: true},
    globalAlpha: {enumerable: true},
    globalCompositeOperation: {enumerable: true},
    filter: {enumerable: true},
    imageSmoothingEnabled: {enumerable: true},
    imageSmoothingQuality: {enumerable: true},
    strokeStyle: {enumerable: true},
    fillStyle: {enumerable: true},
    shadowOffsetX: {enumerable: true},
    shadowOffsetY: {enumerable: true},
    shadowBlur: {enumerable: true},
    shadowColor: {enumerable: true},
    lineWidth: {enumerable: true},
    lineCap: {enumerable: true},
    lineJoin: {enumerable: true},
    miterLimit: {enumerable: true},
    lineDashOffset: {enumerable: true},
    font: {enumerable: true},
    textAlign: {enumerable: true},
    textBaseline: {enumerable: true},
    direction: {enumerable: true},
    fontKerning: {enumerable: true},
    fontStretch: {enumerable: true},
    fontVariantCaps: {enumerable: true},
    letterSpacing: {enumerable: true},
    textRendering: {enumerable: true},
    wordSpacing: {enumerable: true},
    clip: {enumerable: true},
    createConicGradient: {enumerable: true},
    createImageData: {enumerable: true},
    createLinearGradient: {enumerable: true},
    createPattern: {enumerable: true},
    createRadialGradient: {enumerable: true},
    drawFocusIfNeeded: {enumerable: true},
    drawImage: {enumerable: true},
    fill: {enumerable: true},
    fillText: {enumerable: true},
    getContextAttributes: {enumerable: true},
    getImageData: {enumerable: true},
    getLineDash: {enumerable: true},
    getTransform: {enumerable: true},
    isContextLost: {enumerable: true},
    isPointInPath: {enumerable: true},
    isPointInStroke: {enumerable: true},
    measureText: {enumerable: true},
    putImageData: {enumerable: true},
    reset: {enumerable: true},
    roundRect: {enumerable: true},
    save: {enumerable: true},
    scale: {enumerable: true},
    setLineDash: {enumerable: true},
    setTransform: {enumerable: true},
    stroke: {enumerable: true},
    strokeText: {enumerable: true},
    transform: {enumerable: true},
    translate: {enumerable: true},
    arc: {enumerable: true},
    arcTo: {enumerable: true},
    beginPath: {enumerable: true},
    bezierCurveTo: {enumerable: true},
    clearRect: {enumerable: true},
    closePath: {enumerable: true},
    ellipse: {enumerable: true},
    fillRect: {enumerable: true},
    lineTo: {enumerable: true},
    moveTo: {enumerable: true},
    quadraticCurveTo: {enumerable: true},
    rect: {enumerable: true},
    resetTransform: {enumerable: true},
    restore: {enumerable: true},
    rotate: {enumerable: true},
    strokeRect: {enumerable: true},
    [Symbol.toStringTag]: {value: "CanvasRenderingContext2D", configurable: true}

})

class HTMLCanvasElementImpl extends HTMLElementImpl {
    _attrModified(name, value, oldValue) {
        if (this._canvas && (name === "width" || name === "height")) {
            this._canvas[name] = parseInt(value);
        }

        super._attrModified(name, value, oldValue);
    }

    _getCanvas() {
        if (Canvas && !this._canvas) {
            this._canvas = Canvas.createCanvas(this.width, this.height);
        }
        return this._canvas;
    }

    getContext(contextId) {
        console.log('contextId', contextId)
        const canvas = this._getCanvas();
        if (canvas) {
            if (contextId == '2d') {
                console.log('new ctx2d', this.width, this.height)
                this._context = new CanvasRenderingContext2D(this.width, this.height, this._canvas.getContext('2d'))
            }
            // if (!this._context) {
            //     this._context = canvas.getContext(contextId) || null;
            //     if (this._context) {
            //         // Override the native canvas reference with our wrapper. This is the
            //         // reason why we need to locally cache _context, since each call to
            //         // canvas.getContext(contextId) would replace this reference again.
            //         // Perhaps in the longer term, a better solution would be to create a
            //         // full wrapper for the Context object as well.
            //         this._context.canvas = idlUtils.wrapperForImpl(this);
            //         wrapNodeCanvasMethod(this._context, "createPattern");
            //         wrapNodeCanvasMethod(this._context, "drawImage");
            //     }
            // }
            if (contextId === 'webgl' || contextId === 'webgl2') {
                var v_new_toggle = true
                var v_new = function (v) {
                    var temp = v_new_toggle;
                    v_new_toggle = true;
                    var r = new v;
                    v_new_toggle = temp;
                    return r
                }

                function WebGLBuffer() {
                }

                function WebGLProgram() {
                }

                function WebGLShader() {
                }

                var WebGLRenderingContext = class WebGLRenderingContext {
                    constructor(aaa) {
                        console.log('new WebGLRenderingContext', aaa)
                    }

                    createBuffer() {
                        v_console_log('  [*] WebGLRenderingContext -> createBuffer[func]');
                        return v_new(WebGLBuffer)
                    }

                    bindBuffer(target, buffer) {
                        v_console_log('  [*] WebGLRenderingContext -> bindBuffer[func]', target, buffer);
                        return v_new(WebGLBuffer)
                    }

                    getAttribLocation(program, name) {
                        v_console_log('  [*] WebGLRenderingContext -> getAttribLocation[func]', program, name);
                        switch (name){
                            case 'aPosition':
                                return 0;
                            case 'aColor':
                                return 1;
                        }
                    }

                    vertexAttribPointer(index, size, type, normalized, stride, offset) {
                        v_console_log('  [*] WebGLRenderingContext -> vertexAttribPointer[func]', index, size, type, normalized, stride, offset);
                    }

                    enableVertexAttribArray(index) {
                        v_console_log('  [*] WebGLRenderingContext -> enableVertexAttribArray[func]', index);
                    }

                    useProgram(index) {
                        v_console_log('  [*] WebGLRenderingContext -> useProgram[func]', index);
                    }

                    getUniformLocation(program, name) {
                        v_console_log('  [*] WebGLRenderingContext -> getUniformLocation[func]', program, name);
                        return proxy({},'getUniformLocation')
                    }

                    uniform4fv(program, name) {
                        v_console_log('  [*] WebGLRenderingContext -> uniform4fv[func]', program, name);
                    }

                    drawArrays(mode, first, count) {
                        v_console_log('  [*] WebGLRenderingContext -> drawArrays[func]', mode, first, count);
                    }

                    readPixels(x, y, width, height, format, type, pixels) {
                        // for (let i = 0; i < pixels.length - 1; i++) {
                        //     pixels.fill(parseInt(Math.random() * 210 + 10), i, i + 1)
                        // }
                        v_console_log('  [*] WebGLRenderingContext -> readPixels[func]', x, y, width, height, format, type, pixels)
                    }

                    bufferData(target, size, srcData, usage, srcOffSet, length) {
                        v_console_log('  [*] WebGLRenderingContext -> bufferData[func]', target, size, srcData, usage, srcOffSet, length);
                        return v_new(WebGLBuffer)
                    }

                    createProgram() {
                        v_console_log('  [*] WebGLRenderingContext -> createProgram[func]');
                        return v_new(WebGLProgram)
                    }

                    createShader(a) {
                        v_console_log('  [*] WebGLRenderingContext -> createShader[func]', a);
                        return v_new(WebGLShader)
                    }

                    shaderSource(shader, originalSource) {
                        v_console_log('  [*] WebGLRenderingContext -> shaderSource[func]', shader, originalSource);
                        this._originalSource = originalSource;
                    }

                    compileShader(shader) {
                        v_console_log('  [*] WebGLRenderingContext -> compileShader[func]', shader);
                        // this._originalSource = originalSource;
                    }

                    getShaderParameter(shader, pname) {
                        v_console_log('  [*] WebGLRenderingContext -> getShaderParameter[func]', shader, pname);
                        switch (pname) {
                            case 35713:
                                return true;
                                break;
                        }
                    }

                    attachShader(program, shader) {
                        v_console_log('  [*] WebGLRenderingContext -> attachShader[func]', program, shader);

                    }

                    linkProgram(program, shader) {
                        v_console_log('  [*] WebGLRenderingContext -> linkProgram[func]', program, shader);

                    }

                    getProgramParameter(program, pname) {
                        v_console_log('  [*] WebGLRenderingContext -> getProgramParameter[func]', program, pname);
                        if (pname === 35714) {
                            return true;
                        }

                    }

                    getSupportedExtensions() {
                        // window.debug = true;
                        v_console_log('  [*] WebGLRenderingContext -> getSupportedExtensions[func]')
                        return [
                            "ANGLE_instanced_arrays", "EXT_blend_minmax", "EXT_color_buffer_half_float", "EXT_disjoint_timer_query", "EXT_float_blend", "EXT_frag_depth",
                            "EXT_shader_texture_lod", "EXT_texture_compression_bptc", "EXT_texture_compression_rgtc", "EXT_texture_filter_anisotropic", "WEBKIT_EXT_texture_filter_anisotropic", "EXT_sRGB",
                            "KHR_parallel_shader_compile", "OES_element_index_uint", "OES_fbo_render_mipmap", "OES_standard_derivatives", "OES_texture_float", "OES_texture_float_linear",
                            "OES_texture_half_float", "OES_texture_half_float_linear", "OES_vertex_array_object", "WEBGL_color_buffer_float", "WEBGL_compressed_texture_s3tc",
                            "WEBKIT_WEBGL_compressed_texture_s3tc", "WEBGL_compressed_texture_s3tc_srgb", "WEBGL_debug_renderer_info", "WEBGL_debug_shaders",
                            "WEBGL_depth_texture", "WEBKIT_WEBGL_depth_texture", "WEBGL_draw_buffers", "WEBGL_lose_context", "WEBKIT_WEBGL_lose_context", "WEBGL_multi_draw",
                        ]
                    }

                    getExtension(key) {
                        v_console_log('  [*] WebGLRenderingContext -> getExtension[func]:', key)

                        class WebGLDebugRendererInfo {
                            get UNMASKED_VENDOR_WEBGL() {
                                return 37445
                            }

                            get UNMASKED_RENDERER_WEBGL() {
                                return 37446
                            }
                        }

                        class EXTTextureFilterAnisotropic {
                        }

                        class WebGLLoseContext {
                            loseContext() {
                            }

                            restoreContext() {
                            }
                        }

                        if (key == 'WEBGL_debug_renderer_info') {
                            var r = new WebGLDebugRendererInfo
                        }
                        if (key == 'EXT_texture_filter_anisotropic') {
                            var r = new EXTTextureFilterAnisotropic
                        }
                        if (key == 'WEBGL_lose_context') {
                            var r = new WebGLLoseContext
                        } else {
                            var r = new WebGLDebugRendererInfo
                        }
                        return proxy(r, 'new ' + key)
                    }

                    getParameter(key) {
                        v_console_log('  [*] WebGLRenderingContext -> getParameter[func]:', key)
                        let res;
                        let _toggle = {
                            3413: 8,
                            3412: 8,
                            3411: 8,
                            3410: 8,
                            3414: 24,
                            35661: 32,
                            34076: 16384,
                            36349: 1024,
                            34024: 16384,
                            34930: 16,
                            3379: 16384,
                            36348: 31,
                            34921: 16,
                            35660: 16,
                            36347: 1024,
                            7937: 'WebKit WebGL',
                            35724: 'WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)',
                            3415: 0,
                            7936: 'WebKit',
                            7938: 'WebGL 1.0 (OpenGL ES 2.0 Chromium)',
                            37445: 'Google Inc.',
                            // 37446: 'ANGLE (Apple, Apple M1 Max, OpenGL 4.1)',
                            37446: window.GRAPHIC_DRIVER,
                            34047: null
                        }
                        if (_toggle[key]) {
                            res = _toggle[key]

                        } else {
                            if (key == 33902) {
                                return new Float32Array([1, 1])
                            }
                            if (key == 33901) {
                                return new Float32Array([1, 64])
                            }
                            if (key == 35661) {
                                return 32
                            }
                            if (key == 34047) {
                                return null
                            }
                            if (key == 34076) {
                                return 16384
                            }
                            if (key == 36349) {
                                return 1024
                            }
                            if (key == 34024) {
                                return 16384
                            }
                            if (key == 34930) {
                                return 16
                            }
                            if (key == 3379) {
                                return 16384
                            }
                            if (key == 36348) {
                                return 30
                            }
                            if (key == 34921) {
                                return 16
                            }
                            if (key == 35660) {
                                return 16
                            }
                            if (key == 36347) {
                                return 4095
                            }
                            if (key == 3386) {
                                return new Int32Array([16384, 16384])
                            }
                            if (key == 3410) {
                                return 8
                            }
                            if (key == 7937) {
                                return "WebKit WebGL"
                            }
                            if (key == 35724) {
                                return "WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)"
                            }
                            if (key == 3415) {
                                return 0
                            }
                            if (key == 7936) {
                                return "WebKit"
                            }
                            if (key == 7938) {
                                return "WebGL 1.0 (OpenGL ES 2.0 Chromium)"
                            }
                            if (key == 3411) {
                                return 8
                            }
                            if (key == 3412) {
                                return 8
                            }
                            if (key == 3413) {
                                return 8
                            }
                            if (key == 3414) {
                                return 24
                            }
                        }
                        v_console_log('  [*] WebGLRenderingContext -> getParameter[func]:', key, res)

                        return res;
                    }

                    getContextAttributes() {
                        v_console_log('  [*] WebGLRenderingContext -> getContextAttributes[func]')
                        return {
                            alpha: true,
                            antialias: true,
                            depth: true,
                            desynchronized: false,
                            failIfMajorPerformanceCaveat: false,
                            powerPreference: "default",
                            premultipliedAlpha: true,
                            preserveDrawingBuffer: false,
                            stencil: false,
                            xrCompatible: false,
                        }
                    }

                    getShaderPrecisionFormat(a, b) {
                        v_console_log('  [*] WebGLRenderingContext -> getShaderPrecisionFormat[func]', a, b)

                        function WebGLShaderPrecisionFormat() {
                        }

                        var r1 = v_new(WebGLShaderPrecisionFormat)
                        r1.rangeMin = 127
                        r1.rangeMax = 127
                        r1.precision = 23
                        var r2 = v_new(WebGLShaderPrecisionFormat)
                        r2.rangeMin = 31
                        r2.rangeMax = 30
                        r2.precision = 0
                        if (a == 35633 && b == 36338) {
                            return r1
                        }
                        if (a == 35633 && b == 36337) {
                            return r1
                        }
                        if (a == 35633 && b == 36336) {
                            return r1
                        }
                        if (a == 35633 && b == 36341) {
                            return r2
                        }
                        if (a == 35633 && b == 36340) {
                            return r2
                        }
                        if (a == 35633 && b == 36339) {
                            return r2
                        }
                        if (a == 35632 && b == 36338) {
                            return r1
                        }
                        if (a == 35632 && b == 36337) {
                            return r1
                        }
                        if (a == 35632 && b == 36336) {
                            return r1
                        }
                        if (a == 35632 && b == 36341) {
                            return r2
                        }
                        if (a == 35632 && b == 36340) {
                            return r2
                        }
                        if (a == 35632 && b == 36339) {
                            return r2
                        }
                        throw Error('getShaderPrecisionFormat')
                    }
                }
                Object.defineProperties(WebGLRenderingContext.prototype, {
canvas: {writable: undefined, enumerable: true, configurable: true},
                    drawingBufferWidth: {writable: undefined, enumerable: true, configurable: true},
                    drawingBufferHeight: {writable: undefined, enumerable: true, configurable: true},
                    drawingBufferColorSpace: {writable: undefined, enumerable: true, configurable: true},
                    unpackColorSpace: {writable: undefined, enumerable: true, configurable: true},
                    DEPTH_BUFFER_BIT: {value: 256, writable: false, enumerable: true, configurable: false},
                    STENCIL_BUFFER_BIT: {value: 1024, writable: false, enumerable: true, configurable: false},
                    COLOR_BUFFER_BIT: {value: 16384, writable: false, enumerable: true, configurable: false},
                    POINTS: {writable: false, enumerable: true, configurable: false},
                    LINES: {value: 1, writable: false, enumerable: true, configurable: false},
                    LINE_LOOP: {value: 2, writable: false, enumerable: true, configurable: false},
                    LINE_STRIP: {value: 3, writable: false, enumerable: true, configurable: false},
                    TRIANGLES: {value: 4, writable: false, enumerable: true, configurable: false},
                    TRIANGLE_STRIP: {value: 5, writable: false, enumerable: true, configurable: false},
                    TRIANGLE_FAN: {value: 6, writable: false, enumerable: true, configurable: false},
                    ZERO: {writable: false, enumerable: true, configurable: false},
                    ONE: {value: 1, writable: false, enumerable: true, configurable: false},
                    SRC_COLOR: {value: 768, writable: false, enumerable: true, configurable: false},
                    ONE_MINUS_SRC_COLOR: {value: 769, writable: false, enumerable: true, configurable: false},
                    SRC_ALPHA: {value: 770, writable: false, enumerable: true, configurable: false},
                    ONE_MINUS_SRC_ALPHA: {value: 771, writable: false, enumerable: true, configurable: false},
                    DST_ALPHA: {value: 772, writable: false, enumerable: true, configurable: false},
                    ONE_MINUS_DST_ALPHA: {value: 773, writable: false, enumerable: true, configurable: false},
                    DST_COLOR: {value: 774, writable: false, enumerable: true, configurable: false},
                    ONE_MINUS_DST_COLOR: {value: 775, writable: false, enumerable: true, configurable: false},
                    SRC_ALPHA_SATURATE: {value: 776, writable: false, enumerable: true, configurable: false},
                    FUNC_ADD: {value: 32774, writable: false, enumerable: true, configurable: false},
                    BLEND_EQUATION: {value: 32777, writable: false, enumerable: true, configurable: false},
                    BLEND_EQUATION_RGB: {value: 32777, writable: false, enumerable: true, configurable: false},
                    BLEND_EQUATION_ALPHA: {value: 34877, writable: false, enumerable: true, configurable: false},
                    FUNC_SUBTRACT: {value: 32778, writable: false, enumerable: true, configurable: false},
                    FUNC_REVERSE_SUBTRACT: {value: 32779, writable: false, enumerable: true, configurable: false},
                    BLEND_DST_RGB: {value: 32968, writable: false, enumerable: true, configurable: false},
                    BLEND_SRC_RGB: {value: 32969, writable: false, enumerable: true, configurable: false},
                    BLEND_DST_ALPHA: {value: 32970, writable: false, enumerable: true, configurable: false},
                    BLEND_SRC_ALPHA: {value: 32971, writable: false, enumerable: true, configurable: false},
                    CONSTANT_COLOR: {value: 32769, writable: false, enumerable: true, configurable: false},
                    ONE_MINUS_CONSTANT_COLOR: {value: 32770, writable: false, enumerable: true, configurable: false},
                    CONSTANT_ALPHA: {value: 32771, writable: false, enumerable: true, configurable: false},
                    ONE_MINUS_CONSTANT_ALPHA: {value: 32772, writable: false, enumerable: true, configurable: false},
                    BLEND_COLOR: {value: 32773, writable: false, enumerable: true, configurable: false},
                    ARRAY_BUFFER: {value: 34962, writable: false, enumerable: true, configurable: false},
                    ELEMENT_ARRAY_BUFFER: {value: 34963, writable: false, enumerable: true, configurable: false},
                    ARRAY_BUFFER_BINDING: {value: 34964, writable: false, enumerable: true, configurable: false},
                    ELEMENT_ARRAY_BUFFER_BINDING: {value: 34965, writable: false, enumerable: true, configurable: false},
                    STREAM_DRAW: {value: 35040, writable: false, enumerable: true, configurable: false},
                    STATIC_DRAW: {value: 35044, writable: false, enumerable: true, configurable: false},
                    DYNAMIC_DRAW: {value: 35048, writable: false, enumerable: true, configurable: false},
                    BUFFER_SIZE: {value: 34660, writable: false, enumerable: true, configurable: false},
                    BUFFER_USAGE: {value: 34661, writable: false, enumerable: true, configurable: false},
                    CURRENT_VERTEX_ATTRIB: {value: 34342, writable: false, enumerable: true, configurable: false},
                    FRONT: {value: 1028, writable: false, enumerable: true, configurable: false},
                    BACK: {value: 1029, writable: false, enumerable: true, configurable: false},
                    FRONT_AND_BACK: {value: 1032, writable: false, enumerable: true, configurable: false},
                    TEXTURE_2D: {value: 3553, writable: false, enumerable: true, configurable: false},
                    CULL_FACE: {value: 2884, writable: false, enumerable: true, configurable: false},
                    BLEND: {value: 3042, writable: false, enumerable: true, configurable: false},
                    DITHER: {value: 3024, writable: false, enumerable: true, configurable: false},
                    STENCIL_TEST: {value: 2960, writable: false, enumerable: true, configurable: false},
                    DEPTH_TEST: {value: 2929, writable: false, enumerable: true, configurable: false},
                    SCISSOR_TEST: {value: 3089, writable: false, enumerable: true, configurable: false},
                    POLYGON_OFFSET_FILL: {value: 32823, writable: false, enumerable: true, configurable: false},
                    SAMPLE_ALPHA_TO_COVERAGE: {value: 32926, writable: false, enumerable: true, configurable: false},
                    SAMPLE_COVERAGE: {value: 32928, writable: false, enumerable: true, configurable: false},
                    NO_ERROR: {writable: false, enumerable: true, configurable: false},
                    INVALID_ENUM: {value: 1280, writable: false, enumerable: true, configurable: false},
                    INVALID_VALUE: {value: 1281, writable: false, enumerable: true, configurable: false},
                    INVALID_OPERATION: {value: 1282, writable: false, enumerable: true, configurable: false},
                    OUT_OF_MEMORY: {value: 1285, writable: false, enumerable: true, configurable: false},
                    CW: {value: 2304, writable: false, enumerable: true, configurable: false},
                    CCW: {value: 2305, writable: false, enumerable: true, configurable: false},
                    LINE_WIDTH: {value: 2849, writable: false, enumerable: true, configurable: false},
                    ALIASED_POINT_SIZE_RANGE: {value: 33901, writable: false, enumerable: true, configurable: false},
                    ALIASED_LINE_WIDTH_RANGE: {value: 33902, writable: false, enumerable: true, configurable: false},
                    CULL_FACE_MODE: {value: 2885, writable: false, enumerable: true, configurable: false},
                    FRONT_FACE: {value: 2886, writable: false, enumerable: true, configurable: false},
                    DEPTH_RANGE: {value: 2928, writable: false, enumerable: true, configurable: false},
                    DEPTH_WRITEMASK: {value: 2930, writable: false, enumerable: true, configurable: false},
                    DEPTH_CLEAR_VALUE: {value: 2931, writable: false, enumerable: true, configurable: false},
                    DEPTH_FUNC: {value: 2932, writable: false, enumerable: true, configurable: false},
                    STENCIL_CLEAR_VALUE: {value: 2961, writable: false, enumerable: true, configurable: false},
                    STENCIL_FUNC: {value: 2962, writable: false, enumerable: true, configurable: false},
                    STENCIL_FAIL: {value: 2964, writable: false, enumerable: true, configurable: false},
                    STENCIL_PASS_DEPTH_FAIL: {value: 2965, writable: false, enumerable: true, configurable: false},
                    STENCIL_PASS_DEPTH_PASS: {value: 2966, writable: false, enumerable: true, configurable: false},
                    STENCIL_REF: {value: 2967, writable: false, enumerable: true, configurable: false},
                    STENCIL_VALUE_MASK: {value: 2963, writable: false, enumerable: true, configurable: false},
                    STENCIL_WRITEMASK: {value: 2968, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_FUNC: {value: 34816, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_FAIL: {value: 34817, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_PASS_DEPTH_FAIL: {value: 34818, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_PASS_DEPTH_PASS: {value: 34819, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_REF: {value: 36003, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_VALUE_MASK: {value: 36004, writable: false, enumerable: true, configurable: false},
                    STENCIL_BACK_WRITEMASK: {value: 36005, writable: false, enumerable: true, configurable: false},
                    VIEWPORT: {value: 2978, writable: false, enumerable: true, configurable: false},
                    SCISSOR_BOX: {value: 3088, writable: false, enumerable: true, configurable: false},
                    COLOR_CLEAR_VALUE: {value: 3106, writable: false, enumerable: true, configurable: false},
                    COLOR_WRITEMASK: {value: 3107, writable: false, enumerable: true, configurable: false},
                    UNPACK_ALIGNMENT: {value: 3317, writable: false, enumerable: true, configurable: false},
                    PACK_ALIGNMENT: {value: 3333, writable: false, enumerable: true, configurable: false},
                    MAX_TEXTURE_SIZE: {value: 3379, writable: false, enumerable: true, configurable: false},
                    MAX_VIEWPORT_DIMS: {value: 3386, writable: false, enumerable: true, configurable: false},
                    SUBPIXEL_BITS: {value: 3408, writable: false, enumerable: true, configurable: false},
                    RED_BITS: {value: 3410, writable: false, enumerable: true, configurable: false},
                    GREEN_BITS: {value: 3411, writable: false, enumerable: true, configurable: false},
                    BLUE_BITS: {value: 3412, writable: false, enumerable: true, configurable: false},
                    ALPHA_BITS: {value: 3413, writable: false, enumerable: true, configurable: false},
                    DEPTH_BITS: {value: 3414, writable: false, enumerable: true, configurable: false},
                    STENCIL_BITS: {value: 3415, writable: false, enumerable: true, configurable: false},
                    POLYGON_OFFSET_UNITS: {value: 10752, writable: false, enumerable: true, configurable: false},
                    POLYGON_OFFSET_FACTOR: {value: 32824, writable: false, enumerable: true, configurable: false},
                    TEXTURE_BINDING_2D: {value: 32873, writable: false, enumerable: true, configurable: false},
                    SAMPLE_BUFFERS: {value: 32936, writable: false, enumerable: true, configurable: false},
                    SAMPLES: {value: 32937, writable: false, enumerable: true, configurable: false},
                    SAMPLE_COVERAGE_VALUE: {value: 32938, writable: false, enumerable: true, configurable: false},
                    SAMPLE_COVERAGE_INVERT: {value: 32939, writable: false, enumerable: true, configurable: false},
                    COMPRESSED_TEXTURE_FORMATS: {value: 34467, writable: false, enumerable: true, configurable: false},
                    DONT_CARE: {value: 4352, writable: false, enumerable: true, configurable: false},
                    FASTEST: {value: 4353, writable: false, enumerable: true, configurable: false},
                    NICEST: {value: 4354, writable: false, enumerable: true, configurable: false},
                    GENERATE_MIPMAP_HINT: {value: 33170, writable: false, enumerable: true, configurable: false},
                    BYTE: {value: 5120, writable: false, enumerable: true, configurable: false},
                    UNSIGNED_BYTE: {value: 5121, writable: false, enumerable: true, configurable: false},
                    SHORT: {value: 5122, writable: false, enumerable: true, configurable: false},
                    UNSIGNED_SHORT: {value: 5123, writable: false, enumerable: true, configurable: false},
                    INT: {value: 5124, writable: false, enumerable: true, configurable: false},
                    UNSIGNED_INT: {value: 5125, writable: false, enumerable: true, configurable: false},
                    FLOAT: {value: 5126, writable: false, enumerable: true, configurable: false},
                    DEPTH_COMPONENT: {value: 6402, writable: false, enumerable: true, configurable: false},
                    ALPHA: {value: 6406, writable: false, enumerable: true, configurable: false},
                    RGB: {value: 6407, writable: false, enumerable: true, configurable: false},
                    RGBA: {value: 6408, writable: false, enumerable: true, configurable: false},
                    LUMINANCE: {value: 6409, writable: false, enumerable: true, configurable: false},
                    LUMINANCE_ALPHA: {value: 6410, writable: false, enumerable: true, configurable: false},
                    UNSIGNED_SHORT_4_4_4_4: {value: 32819, writable: false, enumerable: true, configurable: false},
                    UNSIGNED_SHORT_5_5_5_1: {value: 32820, writable: false, enumerable: true, configurable: false},
                    UNSIGNED_SHORT_5_6_5: {value: 33635, writable: false, enumerable: true, configurable: false},
                    FRAGMENT_SHADER: {value: 35632, writable: false, enumerable: true, configurable: false},
                    VERTEX_SHADER: {value: 35633, writable: false, enumerable: true, configurable: false},
                    MAX_VERTEX_ATTRIBS: {value: 34921, writable: false, enumerable: true, configurable: false},
                    MAX_VERTEX_UNIFORM_VECTORS: {value: 36347, writable: false, enumerable: true, configurable: false},
                    MAX_VARYING_VECTORS: {value: 36348, writable: false, enumerable: true, configurable: false},
                    MAX_COMBINED_TEXTURE_IMAGE_UNITS: {value: 35661, writable: false, enumerable: true, configurable: false},
                    MAX_VERTEX_TEXTURE_IMAGE_UNITS: {value: 35660, writable: false, enumerable: true, configurable: false},
                    MAX_TEXTURE_IMAGE_UNITS: {value: 34930, writable: false, enumerable: true, configurable: false},
                    MAX_FRAGMENT_UNIFORM_VECTORS: {value: 36349, writable: false, enumerable: true, configurable: false},
                    SHADER_TYPE: {value: 35663, writable: false, enumerable: true, configurable: false},
                    DELETE_STATUS: {value: 35712, writable: false, enumerable: true, configurable: false},
                    LINK_STATUS: {value: 35714, writable: false, enumerable: true, configurable: false},
                    VALIDATE_STATUS: {value: 35715, writable: false, enumerable: true, configurable: false},
                    ATTACHED_SHADERS: {value: 35717, writable: false, enumerable: true, configurable: false},
                    ACTIVE_UNIFORMS: {value: 35718, writable: false, enumerable: true, configurable: false},
                    ACTIVE_ATTRIBUTES: {value: 35721, writable: false, enumerable: true, configurable: false},
                    SHADING_LANGUAGE_VERSION: {value: 35724, writable: false, enumerable: true, configurable: false},
                    CURRENT_PROGRAM: {value: 35725, writable: false, enumerable: true, configurable: false},
                    NEVER: {value: 512, writable: false, enumerable: true, configurable: false},
                    LESS: {value: 513, writable: false, enumerable: true, configurable: false},
                    EQUAL: {value: 514, writable: false, enumerable: true, configurable: false},
                    LEQUAL: {value: 515, writable: false, enumerable: true, configurable: false},
                    GREATER: {value: 516, writable: false, enumerable: true, configurable: false},
                    NOTEQUAL: {value: 517, writable: false, enumerable: true, configurable: false},
                    GEQUAL: {value: 518, writable: false, enumerable: true, configurable: false},
                    ALWAYS: {value: 519, writable: false, enumerable: true, configurable: false},
                    KEEP: {value: 7680, writable: false, enumerable: true, configurable: false},
                    REPLACE: {value: 7681, writable: false, enumerable: true, configurable: false},
                    INCR: {value: 7682, writable: false, enumerable: true, configurable: false},
                    DECR: {value: 7683, writable: false, enumerable: true, configurable: false},
                    INVERT: {value: 5386, writable: false, enumerable: true, configurable: false},
                    INCR_WRAP: {value: 34055, writable: false, enumerable: true, configurable: false},
                    DECR_WRAP: {value: 34056, writable: false, enumerable: true, configurable: false},
                    VENDOR: {value: 7936, writable: false, enumerable: true, configurable: false},
                    RENDERER: {value: 7937, writable: false, enumerable: true, configurable: false},
                    VERSION: {value: 7938, writable: false, enumerable: true, configurable: false},
                    NEAREST: {value: 9728, writable: false, enumerable: true, configurable: false},
                    LINEAR: {value: 9729, writable: false, enumerable: true, configurable: false},
                    NEAREST_MIPMAP_NEAREST: {value: 9984, writable: false, enumerable: true, configurable: false},
                    LINEAR_MIPMAP_NEAREST: {value: 9985, writable: false, enumerable: true, configurable: false},
                    NEAREST_MIPMAP_LINEAR: {value: 9986, writable: false, enumerable: true, configurable: false},
                    LINEAR_MIPMAP_LINEAR: {value: 9987, writable: false, enumerable: true, configurable: false},
                    TEXTURE_MAG_FILTER: {value: 10240, writable: false, enumerable: true, configurable: false},
                    TEXTURE_MIN_FILTER: {value: 10241, writable: false, enumerable: true, configurable: false},
                    TEXTURE_WRAP_S: {value: 10242, writable: false, enumerable: true, configurable: false},
                    TEXTURE_WRAP_T: {value: 10243, writable: false, enumerable: true, configurable: false},
                    TEXTURE: {value: 5890, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP: {value: 34067, writable: false, enumerable: true, configurable: false},
                    TEXTURE_BINDING_CUBE_MAP: {value: 34068, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP_POSITIVE_X: {value: 34069, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP_NEGATIVE_X: {value: 34070, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP_POSITIVE_Y: {value: 34071, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP_NEGATIVE_Y: {value: 34072, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP_POSITIVE_Z: {value: 34073, writable: false, enumerable: true, configurable: false},
                    TEXTURE_CUBE_MAP_NEGATIVE_Z: {value: 34074, writable: false, enumerable: true, configurable: false},
                    MAX_CUBE_MAP_TEXTURE_SIZE: {value: 34076, writable: false, enumerable: true, configurable: false},
                    TEXTURE0: {value: 33984, writable: false, enumerable: true, configurable: false},
                    TEXTURE1: {value: 33985, writable: false, enumerable: true, configurable: false},
                    TEXTURE2: {value: 33986, writable: false, enumerable: true, configurable: false},
                    TEXTURE3: {value: 33987, writable: false, enumerable: true, configurable: false},
                    TEXTURE4: {value: 33988, writable: false, enumerable: true, configurable: false},
                    TEXTURE5: {value: 33989, writable: false, enumerable: true, configurable: false},
                    TEXTURE6: {value: 33990, writable: false, enumerable: true, configurable: false},
                    TEXTURE7: {value: 33991, writable: false, enumerable: true, configurable: false},
                    TEXTURE8: {value: 33992, writable: false, enumerable: true, configurable: false},
                    TEXTURE9: {value: 33993, writable: false, enumerable: true, configurable: false},
                    TEXTURE10: {value: 33994, writable: false, enumerable: true, configurable: false},
                    TEXTURE11: {value: 33995, writable: false, enumerable: true, configurable: false},
                    TEXTURE12: {value: 33996, writable: false, enumerable: true, configurable: false},
                    TEXTURE13: {value: 33997, writable: false, enumerable: true, configurable: false},
                    TEXTURE14: {value: 33998, writable: false, enumerable: true, configurable: false},
                    TEXTURE15: {value: 33999, writable: false, enumerable: true, configurable: false},
                    TEXTURE16: {value: 34000, writable: false, enumerable: true, configurable: false},
                    TEXTURE17: {value: 34001, writable: false, enumerable: true, configurable: false},
                    TEXTURE18: {value: 34002, writable: false, enumerable: true, configurable: false},
                    TEXTURE19: {value: 34003, writable: false, enumerable: true, configurable: false},
                    TEXTURE20: {value: 34004, writable: false, enumerable: true, configurable: false},
                    TEXTURE21: {value: 34005, writable: false, enumerable: true, configurable: false},
                    TEXTURE22: {value: 34006, writable: false, enumerable: true, configurable: false},
                    TEXTURE23: {value: 34007, writable: false, enumerable: true, configurable: false},
                    TEXTURE24: {value: 34008, writable: false, enumerable: true, configurable: false},
                    TEXTURE25: {value: 34009, writable: false, enumerable: true, configurable: false},
                    TEXTURE26: {value: 34010, writable: false, enumerable: true, configurable: false},
                    TEXTURE27: {value: 34011, writable: false, enumerable: true, configurable: false},
                    TEXTURE28: {value: 34012, writable: false, enumerable: true, configurable: false},
                    TEXTURE29: {value: 34013, writable: false, enumerable: true, configurable: false},
                    TEXTURE30: {value: 34014, writable: false, enumerable: true, configurable: false},
                    TEXTURE31: {value: 34015, writable: false, enumerable: true, configurable: false},
                    ACTIVE_TEXTURE: {value: 34016, writable: false, enumerable: true, configurable: false},
                    REPEAT: {value: 10497, writable: false, enumerable: true, configurable: false},
                    CLAMP_TO_EDGE: {value: 33071, writable: false, enumerable: true, configurable: false},
                    MIRRORED_REPEAT: {value: 33648, writable: false, enumerable: true, configurable: false},
                    FLOAT_VEC2: {value: 35664, writable: false, enumerable: true, configurable: false},
                    FLOAT_VEC3: {value: 35665, writable: false, enumerable: true, configurable: false},
                    FLOAT_VEC4: {value: 35666, writable: false, enumerable: true, configurable: false},
                    INT_VEC2: {value: 35667, writable: false, enumerable: true, configurable: false},
                    INT_VEC3: {value: 35668, writable: false, enumerable: true, configurable: false},
                    INT_VEC4: {value: 35669, writable: false, enumerable: true, configurable: false},
                    BOOL: {value: 35670, writable: false, enumerable: true, configurable: false},
                    BOOL_VEC2: {value: 35671, writable: false, enumerable: true, configurable: false},
                    BOOL_VEC3: {value: 35672, writable: false, enumerable: true, configurable: false},
                    BOOL_VEC4: {value: 35673, writable: false, enumerable: true, configurable: false},
                    FLOAT_MAT2: {value: 35674, writable: false, enumerable: true, configurable: false},
                    FLOAT_MAT3: {value: 35675, writable: false, enumerable: true, configurable: false},
                    FLOAT_MAT4: {value: 35676, writable: false, enumerable: true, configurable: false},
                    SAMPLER_2D: {value: 35678, writable: false, enumerable: true, configurable: false},
                    SAMPLER_CUBE: {value: 35680, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_ENABLED: {value: 34338, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_SIZE: {value: 34339, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_STRIDE: {value: 34340, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_TYPE: {value: 34341, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_NORMALIZED: {value: 34922, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_POINTER: {value: 34373, writable: false, enumerable: true, configurable: false},
                    VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: {value: 34975, writable: false, enumerable: true, configurable: false},
                    IMPLEMENTATION_COLOR_READ_TYPE: {value: 35738, writable: false, enumerable: true, configurable: false},
                    IMPLEMENTATION_COLOR_READ_FORMAT: {value: 35739, writable: false, enumerable: true, configurable: false},
                    COMPILE_STATUS: {value: 35713, writable: false, enumerable: true, configurable: false},
                    LOW_FLOAT: {value: 36336, writable: false, enumerable: true, configurable: false},
                    MEDIUM_FLOAT: {value: 36337, writable: false, enumerable: true, configurable: false},
                    HIGH_FLOAT: {value: 36338, writable: false, enumerable: true, configurable: false},
                    LOW_INT: {value: 36339, writable: false, enumerable: true, configurable: false},
                    MEDIUM_INT: {value: 36340, writable: false, enumerable: true, configurable: false},
                    HIGH_INT: {value: 36341, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER: {value: 36160, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER: {value: 36161, writable: false, enumerable: true, configurable: false},
                    RGBA4: {value: 32854, writable: false, enumerable: true, configurable: false},
                    RGB5_A1: {value: 32855, writable: false, enumerable: true, configurable: false},
                    RGB565: {value: 36194, writable: false, enumerable: true, configurable: false},
                    DEPTH_COMPONENT16: {value: 33189, writable: false, enumerable: true, configurable: false},
                    STENCIL_INDEX8: {value: 36168, writable: false, enumerable: true, configurable: false},
                    DEPTH_STENCIL: {value: 34041, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_WIDTH: {value: 36162, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_HEIGHT: {value: 36163, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_INTERNAL_FORMAT: {value: 36164, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_RED_SIZE: {value: 36176, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_GREEN_SIZE: {value: 36177, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_BLUE_SIZE: {value: 36178, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_ALPHA_SIZE: {value: 36179, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_DEPTH_SIZE: {value: 36180, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_STENCIL_SIZE: {value: 36181, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: {value: 36048, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: {value: 36049, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: {value: 36050, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: {value: 36051, writable: false, enumerable: true, configurable: false},
                    COLOR_ATTACHMENT0: {value: 36064, writable: false, enumerable: true, configurable: false},
                    DEPTH_ATTACHMENT: {value: 36096, writable: false, enumerable: true, configurable: false},
                    STENCIL_ATTACHMENT: {value: 36128, writable: false, enumerable: true, configurable: false},
                    DEPTH_STENCIL_ATTACHMENT: {value: 33306, writable: false, enumerable: true, configurable: false},
                    NONE: {writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_COMPLETE: {value: 36053, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_INCOMPLETE_ATTACHMENT: {value: 36054, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: {value: 36055, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_INCOMPLETE_DIMENSIONS: {value: 36057, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_UNSUPPORTED: {value: 36061, writable: false, enumerable: true, configurable: false},
                    FRAMEBUFFER_BINDING: {value: 36006, writable: false, enumerable: true, configurable: false},
                    RENDERBUFFER_BINDING: {value: 36007, writable: false, enumerable: true, configurable: false},
                    MAX_RENDERBUFFER_SIZE: {value: 34024, writable: false, enumerable: true, configurable: false},
                    INVALID_FRAMEBUFFER_OPERATION: {value: 1286, writable: false, enumerable: true, configurable: false},
                    UNPACK_FLIP_Y_WEBGL: {value: 37440, writable: false, enumerable: true, configurable: false},
                    UNPACK_PREMULTIPLY_ALPHA_WEBGL: {value: 37441, writable: false, enumerable: true, configurable: false},
                    CONTEXT_LOST_WEBGL: {value: 37442, writable: false, enumerable: true, configurable: false},
                    UNPACK_COLORSPACE_CONVERSION_WEBGL: {value: 37443, writable: false, enumerable: true, configurable: false},
                    BROWSER_DEFAULT_WEBGL: {value: 37444, writable: false, enumerable: true, configurable: false},
                    activeTexture: {writable: true, enumerable: true, configurable: true},
                    attachShader: {writable: true, enumerable: true, configurable: true},
                    bindAttribLocation: {writable: true, enumerable: true, configurable: true},
                    bindRenderbuffer: {writable: true, enumerable: true, configurable: true},
                    blendColor: {writable: true, enumerable: true, configurable: true},
                    blendEquation: {writable: true, enumerable: true, configurable: true},
                    blendEquationSeparate: {writable: true, enumerable: true, configurable: true},
                    blendFunc: {writable: true, enumerable: true, configurable: true},
                    blendFuncSeparate: {writable: true, enumerable: true, configurable: true},
                    bufferData: {writable: true, enumerable: true, configurable: true},
                    bufferSubData: {writable: true, enumerable: true, configurable: true},
                    checkFramebufferStatus: {writable: true, enumerable: true, configurable: true},
                    compileShader: {writable: true, enumerable: true, configurable: true},
                    compressedTexImage2D: {writable: true, enumerable: true, configurable: true},
                    compressedTexSubImage2D: {writable: true, enumerable: true, configurable: true},
                    copyTexImage2D: {writable: true, enumerable: true, configurable: true},
                    copyTexSubImage2D: {writable: true, enumerable: true, configurable: true},
                    createBuffer: {writable: true, enumerable: true, configurable: true},
                    createFramebuffer: {writable: true, enumerable: true, configurable: true},
                    createProgram: {writable: true, enumerable: true, configurable: true},
                    createRenderbuffer: {writable: true, enumerable: true, configurable: true},
                    createShader: {writable: true, enumerable: true, configurable: true},
                    createTexture: {writable: true, enumerable: true, configurable: true},
                    cullFace: {writable: true, enumerable: true, configurable: true},
                    deleteBuffer: {writable: true, enumerable: true, configurable: true},
                    deleteFramebuffer: {writable: true, enumerable: true, configurable: true},
                    deleteProgram: {writable: true, enumerable: true, configurable: true},
                    deleteRenderbuffer: {writable: true, enumerable: true, configurable: true},
                    deleteShader: {writable: true, enumerable: true, configurable: true},
                    deleteTexture: {writable: true, enumerable: true, configurable: true},
                    depthFunc: {writable: true, enumerable: true, configurable: true},
                    depthMask: {writable: true, enumerable: true, configurable: true},
                    depthRange: {writable: true, enumerable: true, configurable: true},
                    detachShader: {writable: true, enumerable: true, configurable: true},
                    disable: {writable: true, enumerable: true, configurable: true},
                    enable: {writable: true, enumerable: true, configurable: true},
                    finish: {writable: true, enumerable: true, configurable: true},
                    flush: {writable: true, enumerable: true, configurable: true},
                    framebufferRenderbuffer: {writable: true, enumerable: true, configurable: true},
                    framebufferTexture2D: {writable: true, enumerable: true, configurable: true},
                    frontFace: {writable: true, enumerable: true, configurable: true},
                    generateMipmap: {writable: true, enumerable: true, configurable: true},
                    getActiveAttrib: {writable: true, enumerable: true, configurable: true},
                    getActiveUniform: {writable: true, enumerable: true, configurable: true},
                    getAttachedShaders: {writable: true, enumerable: true, configurable: true},
                    getAttribLocation: {writable: true, enumerable: true, configurable: true},
                    getBufferParameter: {writable: true, enumerable: true, configurable: true},
                    getContextAttributes: {writable: true, enumerable: true, configurable: true},
                    getError: {writable: true, enumerable: true, configurable: true},
                    getExtension: {writable: true, enumerable: true, configurable: true},
                    getFramebufferAttachmentParameter: {writable: true, enumerable: true, configurable: true},
                    getParameter: {writable: true, enumerable: true, configurable: true},
                    getProgramInfoLog: {writable: true, enumerable: true, configurable: true},
                    getProgramParameter: {writable: true, enumerable: true, configurable: true},
                    getRenderbufferParameter: {writable: true, enumerable: true, configurable: true},
                    getShaderInfoLog: {writable: true, enumerable: true, configurable: true},
                    getShaderParameter: {writable: true, enumerable: true, configurable: true},
                    getShaderPrecisionFormat: {writable: true, enumerable: true, configurable: true},
                    getShaderSource: {writable: true, enumerable: true, configurable: true},
                    getSupportedExtensions: {writable: true, enumerable: true, configurable: true},
                    getTexParameter: {writable: true, enumerable: true, configurable: true},
                    getUniform: {writable: true, enumerable: true, configurable: true},
                    getUniformLocation: {writable: true, enumerable: true, configurable: true},
                    getVertexAttrib: {writable: true, enumerable: true, configurable: true},
                    getVertexAttribOffset: {writable: true, enumerable: true, configurable: true},
                    hint: {writable: true, enumerable: true, configurable: true},
                    isBuffer: {writable: true, enumerable: true, configurable: true},
                    isContextLost: {writable: true, enumerable: true, configurable: true},
                    isEnabled: {writable: true, enumerable: true, configurable: true},
                    isFramebuffer: {writable: true, enumerable: true, configurable: true},
                    isProgram: {writable: true, enumerable: true, configurable: true},
                    isRenderbuffer: {writable: true, enumerable: true, configurable: true},
                    isShader: {writable: true, enumerable: true, configurable: true},
                    isTexture: {writable: true, enumerable: true, configurable: true},
                    lineWidth: {writable: true, enumerable: true, configurable: true},
                    linkProgram: {writable: true, enumerable: true, configurable: true},
                    pixelStorei: {writable: true, enumerable: true, configurable: true},
                    polygonOffset: {writable: true, enumerable: true, configurable: true},
                    readPixels: {writable: true, enumerable: true, configurable: true},
                    renderbufferStorage: {writable: true, enumerable: true, configurable: true},
                    sampleCoverage: {writable: true, enumerable: true, configurable: true},
                    shaderSource: {writable: true, enumerable: true, configurable: true},
                    stencilFunc: {writable: true, enumerable: true, configurable: true},
                    stencilFuncSeparate: {writable: true, enumerable: true, configurable: true},
                    stencilMask: {writable: true, enumerable: true, configurable: true},
                    stencilMaskSeparate: {writable: true, enumerable: true, configurable: true},
                    stencilOp: {writable: true, enumerable: true, configurable: true},
                    stencilOpSeparate: {writable: true, enumerable: true, configurable: true},
                    texImage2D: {writable: true, enumerable: true, configurable: true},
                    texParameterf: {writable: true, enumerable: true, configurable: true},
                    texParameteri: {writable: true, enumerable: true, configurable: true},
                    texSubImage2D: {writable: true, enumerable: true, configurable: true},
                    useProgram: {writable: true, enumerable: true, configurable: true},
                    validateProgram: {writable: true, enumerable: true, configurable: true},
                    bindBuffer: {writable: true, enumerable: true, configurable: true},
                    bindFramebuffer: {writable: true, enumerable: true, configurable: true},
                    bindTexture: {writable: true, enumerable: true, configurable: true},
                    clear: {writable: true, enumerable: true, configurable: true},
                    clearColor: {writable: true, enumerable: true, configurable: true},
                    clearDepth: {writable: true, enumerable: true, configurable: true},
                    clearStencil: {writable: true, enumerable: true, configurable: true},
                    colorMask: {writable: true, enumerable: true, configurable: true},
                    disableVertexAttribArray: {writable: true, enumerable: true, configurable: true},
                    drawArrays: {writable: true, enumerable: true, configurable: true},
                    drawElements: {writable: true, enumerable: true, configurable: true},
                    enableVertexAttribArray: {writable: true, enumerable: true, configurable: true},
                    scissor: {writable: true, enumerable: true, configurable: true},
                    uniform1f: {writable: true, enumerable: true, configurable: true},
                    uniform1fv: {writable: true, enumerable: true, configurable: true},
                    uniform1i: {writable: true, enumerable: true, configurable: true},
                    uniform1iv: {writable: true, enumerable: true, configurable: true},
                    uniform2f: {writable: true, enumerable: true, configurable: true},
                    uniform2fv: {writable: true, enumerable: true, configurable: true},
                    uniform2i: {writable: true, enumerable: true, configurable: true},
                    uniform2iv: {writable: true, enumerable: true, configurable: true},
                    uniform3f: {writable: true, enumerable: true, configurable: true},
                    uniform3fv: {writable: true, enumerable: true, configurable: true},
                    uniform3i: {writable: true, enumerable: true, configurable: true},
                    uniform3iv: {writable: true, enumerable: true, configurable: true},
                    uniform4f: {writable: true, enumerable: true, configurable: true},
                    uniform4fv: {writable: true, enumerable: true, configurable: true},
                    uniform4i: {writable: true, enumerable: true, configurable: true},
                    uniform4iv: {writable: true, enumerable: true, configurable: true},
                    uniformMatrix2fv: {writable: true, enumerable: true, configurable: true},
                    uniformMatrix3fv: {writable: true, enumerable: true, configurable: true},
                    uniformMatrix4fv: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib1f: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib1fv: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib2f: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib2fv: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib3f: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib3fv: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib4f: {writable: true, enumerable: true, configurable: true},
                    vertexAttrib4fv: {writable: true, enumerable: true, configurable: true},
                    vertexAttribPointer: {writable: true, enumerable: true, configurable: true},
                    viewport: {writable: true, enumerable: true, configurable: true},
                    constructor: {writable: true, enumerable: false, configurable: true},
                    makeXRCompatible: {writable: true, enumerable: true, configurable: true},
                    [Symbol.toStringTag]: {
                        value: "WebGLRenderingContext",
                        writable: false,
                        enumerable: false,
                        configurable: true
                    },
                })
                let t = proxy(new WebGLRenderingContext(), 'WebGLRenderingContext11')
                // let t = new WebGLRenderingContext()
                this._context = t;
            }
            // console.log('contextId res', this._context)
            this._context = idlUtils.proxy(this._context, 'context' + contextId)
            return this._context;
        }

        notImplemented(
            "HTMLCanvasElement.prototype.getContext (without installing the canvas npm package)",
            this._ownerDocument._defaultView
        );
        return null;
    }

    toDataURL(...args) {
        const canvas = this._getCanvas();
        if (canvas) {
            // //
            // // ctx.clearRect(0, 0, 200, 200); // 擦除(0,0)位置大小为200x200的矩形，擦除的意思是把该区域变为透明
            // ctx.fillStyle = '#dddddd'; // 设置颜色
            // ctx.fillRect(parseInt(Math.random() * 20 + 20), parseInt(Math.random() * 20 + 20), parseInt(Math.random() * 20 + 20), parseInt(Math.random() * 20 + 20)); // 把(10,10)位置大小为130x130的矩形涂色
            if (this.width > 100 && this.height > 100) {
                for (let i = 0; i < randInt(10, 20); i++) {
                    let ctx = canvas.getContext('2d');

                    let color = Math.floor(Math.random() * 150);
                    ctx.fillStyle = "rgba(" + color + "," + color + "," + color + ",1)";
                    ctx.fillRect(randInt(0, this.width), randInt(0, this.height), 1, 1)
                }
            }

            let res = canvas.toDataURL(...args);
            console.log(this.width, this.height, 'canvas.toDataUrl', res)
            return res;
            // return 'data:image/png;base64, ';
        }

        notImplemented(
            "HTMLCanvasElement.prototype.toDataURL (without installing the canvas npm package)",
            this._ownerDocument._defaultView
        );
        return null;
    }

    toBlob(callback, type, qualityArgument) {
        const window = this._ownerDocument._defaultView;
        const canvas = this._getCanvas();
        if (canvas) {
            const options = {};
            switch (type) {
                case "image/jpg":
                case "image/jpeg":
                    type = "image/jpeg";
                    options.quality = qualityArgument;
                    break;
                default:
                    type = "image/png";
            }
            canvas.toBuffer((err, buff) => {
                if (err) {
                    throw err;
                }
                callback(new window.Blob([buff], {type}));
            }, type, options);
        } else {
            notImplemented(
                "HTMLCanvasElement.prototype.toBlob (without installing the canvas npm package)",
                window
            );
        }
    }

    get width() {
        const parsed = parseInt(this.getAttributeNS(null, "width"));
        return isNaN(parsed) || parsed < 0 || parsed > 2147483647 ? 300 : parsed;
    }

    set width(v) {
        v = v > 2147483647 ? 300 : v;
        this.setAttributeNS(null, "width", String(v));
    }

    get height() {
        const parsed = parseInt(this.getAttributeNS(null, "height"));
        return isNaN(parsed) || parsed < 0 || parsed > 2147483647 ? 150 : parsed;
    }

    set height(v) {
        v = v > 2147483647 ? 150 : v;
        this.setAttributeNS(null, "height", String(v));
    }
}

// We need to wrap the methods that receive an image or canvas object
// (luckily, always as the first argument), so that these objects can be
// unwrapped an the expected types passed.
function wrapNodeCanvasMethod(ctx, name) {
    const prev = ctx[name];
    ctx[name] = function (image, ...rest) {
        const impl = idlUtils.implForWrapper(image);
        if (impl) {
            if (impl instanceof HTMLCanvasElementImpl && !impl._canvas) {
                impl._getCanvas();
            }
            image = impl._image || impl._canvas;
        }
        return prev.call(ctx, image, ...rest);
    };
}

module.exports = {
    implementation: HTMLCanvasElementImpl
};
