// TurtleToy-compatible "Grid over Image" with barrel & swirl transforms
// Paste into https://turtletoy.net/ (or your local equivalent).
// The grid density/offset responds to the embedded luminance map below.
// Controls are at the top (use TurtleToy sliders).

Canvas.setpenopacity(1);

// -------- Controls --------
const seed = 1;                 //min=0 max=999999 step=1
const rows = 40;                //min=10 max=120 step=1
const cols = 30;                //min=10 max=120 step=1
const padding = 8;              //min=0 max=40 step=1
const subLines = 8;             //min=1 max=30 step=1  (max hatch per cell)
const subMin = 1;               //min=0 max=20 step=1  (min hatch per cell)
const jitter = .20;             //min=0 max=1 step=.01 (random line jitter inside cell)
const bias = .15;               //min=0 max=1 step=.01 (bias to dark areas)
const displace = .35;           //min=0 max=2 step=.01 (bezier-ish bend amount)
const type = 2;                 //min=0 max=2 step=1 (Linear, Fixed Bezier, Dynamic Bezier)

// Field transforms
const barrel = 0.35;            //min=-2 max=2 step=.01 (>0 bulge, <0 pinch)
const barrelOffsetX = 0;        //min=-100 max=100 step=1
const barrelOffsetY = 0;        //min=-100 max=100 step=1
const swirl = 0.25;             //min=-2 max=2 step=.01 (rotation strength)
const swirlRadius = 120;        //min=1 max=300 step=1

// Image mapping
const imgContrast = 1.20;       //min=.2 max=3 step=.01
const imgGamma = 0.9;           //min=.2 max=3 step=.01
const imgInvert = 0;            //min=0 max=1 step=1 (No, Yes)
const imgExpand = 1.00;         //min=.5 max=2 step=.01 (scale image mapping)

// -------- Setup --------
const turtle = new Turtle();
const CANVAS = 200;
const left = -CANVAS/2, top = -CANVAS/2;

const CELL_W = (CANVAS - padding*2) / cols;
const CELL_H = (CANVAS - padding*2) / rows;

// Embedded luminance (0..1; 0=black, 1=white), portrait oriented.
const IMG_W = 55;
const IMG_H = 96;
const IMG = [
  0.32, 0.44, 0.42, 0.45, 0.36, 0.17, 0.19, 0.19, 0.21, 0.22, 0.24, 0.25, 0.26, 0.27, 0.28, 0.25, 0.38, 0.52, 0.51, 0.53, 0.55, 0.56, 0.56, 0.55,
  0.58, 0.56, 0.59, 0.60, 0.60, 0.67, 0.67, 0.66, 0.71, 0.73, 0.71, 0.70, 0.70, 0.70, 0.69, 0.68, 0.67, 0.65, 0.64, 0.63, 0.62, 0.62, 0.60, 0.59,
  0.58, 0.58, 0.58, 0.59, 0.59, 0.58, 0.60, 0.16, 0.33, 0.44, 0.44, 0.36, 0.18, 0.19, 0.20, 0.21, 0.22, 0.24, 0.25, 0.27, 0.27, 0.28, 0.26, 0.38,
  0.51, 0.51, 0.53, 0.55, 0.56, 0.55, 0.55, 0.58, 0.56, 0.59, 0.60, 0.61, 0.68, 0.67, 0.66, 0.72, 0.74, 0.72, 0.70, 0.70, 0.70, 0.69, 0.68, 0.67,
  0.65, 0.64, 0.63, 0.62, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57, 0.58, 0.59, 0.58, 0.59, 0.18, 0.22, 0.33, 0.45, 0.35, 0.18, 0.19, 0.20, 0.22, 0.22,
  0.24, 0.26, 0.27, 0.27, 0.28, 0.26, 0.37, 0.51, 0.51, 0.54, 0.55, 0.56, 0.56, 0.55, 0.58, 0.56, 0.59, 0.60, 0.62, 0.69, 0.69, 0.66, 0.72, 0.74,
  0.72, 0.71, 0.71, 0.71, 0.70, 0.69, 0.67, 0.65, 0.64, 0.63, 0.62, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57, 0.57, 0.58, 0.58, 0.60, 0.18, 0.26, 0.22,
  0.35, 0.37, 0.18, 0.20, 0.20, 0.22, 0.23, 0.24, 0.26, 0.27, 0.27, 0.28, 0.26, 0.37, 0.50, 0.51, 0.53, 0.55, 0.56, 0.56, 0.55, 0.58, 0.56, 0.59,
  0.60, 0.62, 0.71, 0.70, 0.67, 0.73, 0.75, 0.72, 0.71, 0.72, 0.71, 0.70, 0.69, 0.67, 0.66, 0.64, 0.64, 0.63, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57,
  0.57, 0.58, 0.58, 0.59, 0.18, 0.25, 0.26, 0.23, 0.29, 0.19, 0.19, 0.20, 0.22, 0.23, 0.24, 0.27, 0.28, 0.27, 0.27, 0.27, 0.37, 0.50, 0.50, 0.53,
  0.55, 0.57, 0.56, 0.55, 0.58, 0.56, 0.60, 0.61, 0.62, 0.72, 0.71, 0.68, 0.73, 0.75, 0.73, 0.72, 0.72, 0.72, 0.71, 0.69, 0.68, 0.66, 0.65, 0.64,
  0.63, 0.62, 0.60, 0.58, 0.57, 0.57, 0.57, 0.57, 0.58, 0.58, 0.58, 0.18, 0.25, 0.26, 0.25, 0.20, 0.20, 0.20, 0.21, 0.22, 0.23, 0.25, 0.27, 0.27,
  0.27, 0.28, 0.26, 0.38, 0.50, 0.51, 0.53, 0.55, 0.57, 0.56, 0.55, 0.58, 0.56, 0.60, 0.61, 0.64, 0.73, 0.72, 0.69, 0.74, 0.76, 0.74, 0.73, 0.73,
  0.73, 0.71, 0.70, 0.68, 0.65, 0.65, 0.64, 0.63, 0.62, 0.60, 0.58, 0.58, 0.58, 0.56, 0.56, 0.58, 0.58, 0.59, 0.18, 0.24, 0.25, 0.25, 0.22, 0.18,
  0.22, 0.21, 0.22, 0.24, 0.25, 0.27, 0.28, 0.28, 0.28, 0.26, 0.38, 0.50, 0.51, 0.53, 0.56, 0.57, 0.56, 0.55, 0.59, 0.57, 0.61, 0.62, 0.64, 0.75,
  0.73, 0.70, 0.75, 0.77, 0.75, 0.73, 0.74, 0.73, 0.71, 0.70, 0.69, 0.66, 0.65, 0.64, 0.63, 0.62, 0.60, 0.58, 0.59, 0.57, 0.55, 0.56, 0.58, 0.58,
  0.59, 0.17, 0.24, 0.24, 0.25, 0.22, 0.15, 0.18, 0.23, 0.23, 0.24, 0.25, 0.27, 0.28, 0.28, 0.28, 0.26, 0.38, 0.51, 0.51, 0.53, 0.56, 0.57, 0.56,
  0.56, 0.59, 0.57, 0.61, 0.62, 0.65, 0.76, 0.75, 0.72, 0.76, 0.78, 0.75, 0.74, 0.75, 0.74, 0.72, 0.71, 0.69, 0.67, 0.65, 0.64, 0.63, 0.62, 0.60,
  0.60, 0.58, 0.55, 0.55, 0.56, 0.58, 0.58, 0.58, 0.17, 0.24, 0.24, 0.24, 0.21, 0.15, 0.14, 0.19, 0.25, 0.24, 0.25, 0.27, 0.29, 0.28, 0.28, 0.26,
  0.38, 0.51, 0.51, 0.54, 0.56, 0.58, 0.57, 0.56, 0.59, 0.57, 0.61, 0.62, 0.66, 0.78, 0.76, 0.73, 0.77, 0.79, 0.76, 0.75, 0.76, 0.75, 0.73, 0.71,
  0.69, 0.67, 0.65, 0.64, 0.63, 0.62, 0.62, 0.59, 0.55, 0.55, 0.54, 0.56, 0.57, 0.57, 0.58, 0.17, 0.24, 0.24, 0.24, 0.21, 0.15, 0.14, 0.14, 0.20,
  0.27, 0.25, 0.28, 0.29, 0.30, 0.28, 0.26, 0.38, 0.51, 0.52, 0.54, 0.56, 0.58, 0.57, 0.56, 0.60, 0.58, 0.62, 0.63, 0.67, 0.79, 0.77, 0.74, 0.78,
  0.80, 0.77, 0.76, 0.77, 0.75, 0.74, 0.72, 0.71, 0.67, 0.64, 0.64, 0.63, 0.64, 0.62, 0.55, 0.55, 0.55, 0.54, 0.56, 0.57, 0.57, 0.58, 0.17, 0.24,
  0.24, 0.24, 0.21, 0.15, 0.15, 0.14, 0.14, 0.20, 0.28, 0.28, 0.29, 0.31, 0.33, 0.25, 0.38, 0.51, 0.53, 0.55, 0.57, 0.58, 0.58, 0.57, 0.60, 0.58,
  0.62, 0.63, 0.67, 0.81, 0.79, 0.75, 0.79, 0.80, 0.78, 0.77, 0.77, 0.76, 0.75, 0.73, 0.71, 0.65, 0.64, 0.64, 0.66, 0.61, 0.44, 0.55, 0.55, 0.55,
  0.54, 0.56, 0.57, 0.57, 0.58, 0.17, 0.23, 0.24, 0.24, 0.20, 0.15, 0.15, 0.15, 0.15, 0.13, 0.21, 0.32, 0.30, 0.30, 0.33, 0.32, 0.38, 0.50, 0.52,
  0.56, 0.58, 0.59, 0.59, 0.58, 0.60, 0.58, 0.63, 0.64, 0.69, 0.82, 0.81, 0.77, 0.80, 0.81, 0.78, 0.78, 0.78, 0.77, 0.76, 0.74, 0.67, 0.65, 0.65,
  0.66, 0.67, 0.39, 0.39, 0.57, 0.55, 0.55, 0.54, 0.56, 0.58, 0.57, 0.57, 0.17, 0.22, 0.24, 0.23, 0.20, 0.15, 0.14, 0.14, 0.15, 0.15, 0.12, 0.23,
  0.34, 0.31, 0.31, 0.33, 0.42, 0.50, 0.50, 0.56, 0.58, 0.60, 0.59, 0.58, 0.61, 0.58, 0.63, 0.64, 0.70, 0.84, 0.82, 0.78, 0.81, 0.82, 0.79, 0.78,
  0.80, 0.78, 0.76, 0.69, 0.67, 0.67, 0.66, 0.69, 0.45, 0.31, 0.42, 0.56, 0.55, 0.55, 0.54, 0.55, 0.57, 0.57, 0.57, 0.17, 0.23, 0.24, 0.23, 0.20,
  0.15, 0.15, 0.15, 0.14, 0.15, 0.15, 0.13, 0.25, 0.35, 0.33, 0.31, 0.42, 0.51, 0.49, 0.54, 0.59, 0.60, 0.60, 0.59, 0.62, 0.59, 0.64, 0.65, 0.71,
  0.85, 0.84, 0.80, 0.81, 0.82, 0.80, 0.80, 0.81, 0.80, 0.70, 0.67, 0.68, 0.67, 0.71, 0.48, 0.34, 0.35, 0.41, 0.56, 0.55, 0.56, 0.54, 0.55, 0.56,
  0.56, 0.57, 0.17, 0.22, 0.24, 0.23, 0.20, 0.14, 0.14, 0.16, 0.15, 0.14, 0.15, 0.16, 0.13, 0.28, 0.37, 0.32, 0.41, 0.49, 0.49, 0.50, 0.59, 0.61,
  0.60, 0.60, 0.62, 0.59, 0.64, 0.65, 0.71, 0.87, 0.85, 0.81, 0.82, 0.84, 0.80, 0.81, 0.83, 0.72, 0.67, 0.69, 0.68, 0.72, 0.53, 0.35, 0.38, 0.34,
  0.41, 0.57, 0.55, 0.55, 0.53, 0.55, 0.56, 0.56, 0.56, 0.17, 0.22, 0.23, 0.22, 0.19, 0.14, 0.13, 0.14, 0.16, 0.16, 0.15, 0.16, 0.18, 0.15, 0.31,
  0.37, 0.42, 0.49, 0.49, 0.48, 0.56, 0.62, 0.61, 0.61, 0.62, 0.59, 0.64, 0.65, 0.71, 0.88, 0.86, 0.82, 0.84, 0.84, 0.81, 0.84, 0.74, 0.66, 0.69,
  0.69, 0.73, 0.59, 0.37, 0.39, 0.37, 0.34, 0.41, 0.57, 0.54, 0.55, 0.53, 0.55, 0.57, 0.56, 0.56, 0.17, 0.22, 0.23, 0.22, 0.19, 0.14, 0.14, 0.14,
  0.13, 0.17, 0.19, 0.18, 0.20, 0.21, 0.18, 0.31, 0.46, 0.49, 0.49, 0.50, 0.49, 0.62, 0.62, 0.62, 0.62, 0.59, 0.65, 0.65, 0.73, 0.89, 0.87, 0.83,
  0.84, 0.85, 0.84, 0.75, 0.65, 0.69, 0.69, 0.73, 0.64, 0.41, 0.42, 0.40, 0.38, 0.34, 0.40, 0.56, 0.55, 0.55, 0.53, 0.55, 0.57, 0.56, 0.56, 0.18,
  0.22, 0.22, 0.21, 0.18, 0.15, 0.14, 0.13, 0.14, 0.13, 0.16, 0.22, 0.22, 0.24, 0.26, 0.22, 0.38, 0.52, 0.49, 0.51, 0.49, 0.56, 0.64, 0.62, 0.63,
  0.59, 0.65, 0.66, 0.73, 0.90, 0.88, 0.84, 0.85, 0.88, 0.78, 0.64, 0.69, 0.69, 0.73, 0.68, 0.45, 0.45, 0.45, 0.42, 0.39, 0.31, 0.40, 0.57, 0.54,
  0.56, 0.55, 0.54, 0.56, 0.56, 0.56, 0.18, 0.22, 0.22, 0.21, 0.17, 0.11, 0.15, 0.15, 0.13, 0.14, 0.13, 0.16, 0.24, 0.29, 0.30, 0.33, 0.29, 0.42,
  0.54, 0.51, 0.52, 0.50, 0.64, 0.63, 0.63, 0.59, 0.65, 0.66, 0.73, 0.91, 0.89, 0.85, 0.86, 0.89, 0.69, 0.66, 0.71, 0.74, 0.72, 0.49, 0.48, 0.49,
  0.46, 0.39, 0.33, 0.45, 0.58, 0.54, 0.58, 0.55, 0.39, 0.51, 0.57, 0.56, 0.56, 0.18, 0.22, 0.22, 0.21, 0.17, 0.11, 0.10, 0.15, 0.16, 0.13, 0.13,
  0.17, 0.19, 0.26, 0.36, 0.37, 0.40, 0.36, 0.44, 0.55, 0.53, 0.51, 0.58, 0.65, 0.62, 0.60, 0.65, 0.66, 0.74, 0.92, 0.89, 0.85, 0.88, 0.84, 0.65,
  0.70, 0.73, 0.74, 0.52, 0.50, 0.52, 0.47, 0.38, 0.42, 0.60, 0.72, 0.64, 0.57, 0.47, 0.32, 0.28, 0.51, 0.57, 0.56, 0.56, 0.18, 0.22, 0.22, 0.21,
  0.17, 0.11, 0.10, 0.10, 0.14, 0.17, 0.19, 0.24, 0.25, 0.23, 0.27, 0.42, 0.47, 0.48, 0.44, 0.47, 0.56, 0.55, 0.53, 0.65, 0.64, 0.60, 0.66, 0.66,
  0.74, 0.92, 0.90, 0.86, 0.89, 0.76, 0.66, 0.74, 0.76, 0.55, 0.53, 0.54, 0.46, 0.44, 0.59, 0.73, 0.74, 0.72, 0.60, 0.35, 0.27, 0.31, 0.31, 0.51,
  0.57, 0.56, 0.55, 0.18, 0.22, 0.22, 0.20, 0.16, 0.13, 0.11, 0.10, 0.11, 0.13, 0.24, 0.28, 0.30, 0.33, 0.31, 0.29, 0.46, 0.59, 0.58, 0.51, 0.51,
  0.58, 0.53, 0.60, 0.65, 0.59, 0.66, 0.67, 0.75, 0.93, 0.91, 0.87, 0.87, 0.69, 0.72, 0.78, 0.58, 0.54, 0.53, 0.48, 0.59, 0.75, 0.79, 0.76, 0.70,
  0.64, 0.42, 0.25, 0.31, 0.31, 0.33, 0.51, 0.57, 0.56, 0.55, 0.18, 0.22, 0.22, 0.20, 0.16, 0.09, 0.13, 0.12, 0.11, 0.12, 0.20, 0.27, 0.33, 0.36,
  0.40, 0.40, 0.34, 0.46, 0.67, 0.69, 0.60, 0.53, 0.56, 0.55, 0.65, 0.60, 0.66, 0.67, 0.75, 0.93, 0.91, 0.89, 0.79, 0.70, 0.79, 0.61, 0.52, 0.52,
  0.60, 0.76, 0.83, 0.79, 0.74, 0.66, 0.57, 0.53, 0.42, 0.27, 0.30, 0.35, 0.31, 0.50, 0.57, 0.56, 0.55, 0.18, 0.22, 0.21, 0.19, 0.16, 0.08, 0.07,
  0.13, 0.13, 0.12, 0.21, 0.24, 0.29, 0.37, 0.42, 0.46, 0.49, 0.43, 0.45, 0.69, 0.77, 0.66, 0.56, 0.54, 0.62, 0.61, 0.66, 0.67, 0.75, 0.93, 0.91,
  0.88, 0.73, 0.78, 0.62, 0.51, 0.62, 0.77, 0.86, 0.83, 0.78, 0.73, 0.65, 0.60, 0.56, 0.55, 0.44, 0.27, 0.33, 0.32, 0.28, 0.50, 0.57, 0.55, 0.55,
  0.18, 0.22, 0.21, 0.20, 0.15, 0.08, 0.08, 0.08, 0.12, 0.16, 0.24, 0.27, 0.34, 0.39, 0.45, 0.50, 0.53, 0.58, 0.55, 0.47, 0.66, 0.80, 0.73, 0.58,
  0.56, 0.62, 0.66, 0.67, 0.75, 0.93, 0.91, 0.86, 0.75, 0.64, 0.59, 0.79, 0.89, 0.87, 0.82, 0.81, 0.79, 0.75, 0.71, 0.67, 0.62, 0.58, 0.46, 0.31,
  0.31, 0.29, 0.28, 0.50, 0.57, 0.56, 0.55, 0.19, 0.22, 0.21, 0.19, 0.15, 0.08, 0.08, 0.09, 0.08, 0.17, 0.19, 0.13, 0.16, 0.22, 0.28, 0.36, 0.44,
  0.55, 0.66, 0.69, 0.60, 0.64, 0.78, 0.75, 0.59, 0.60, 0.67, 0.66, 0.73, 0.93, 0.91, 0.89, 0.72, 0.78, 0.91, 0.92, 0.91, 0.90, 0.87, 0.78, 0.66,
  0.53, 0.40, 0.30, 0.24, 0.21, 0.25, 0.27, 0.29, 0.30, 0.27, 0.51, 0.57, 0.55, 0.55, 0.19, 0.23, 0.20, 0.19, 0.15, 0.09, 0.09, 0.09, 0.13, 0.15,
  0.22, 0.30, 0.24, 0.15, 0.06, 0.04, 0.07, 0.14, 0.25, 0.42, 0.60, 0.69, 0.71, 0.79, 0.73, 0.61, 0.64, 0.61, 0.72, 0.93, 0.94, 0.71, 0.82, 0.99,
  0.97, 0.91, 0.77, 0.56, 0.35, 0.18, 0.07, 0.02, 0.05, 0.16, 0.27, 0.32, 0.20, 0.18, 0.25, 0.28, 0.27, 0.50, 0.57, 0.55, 0.55, 0.19, 0.23, 0.20,
  0.18, 0.15, 0.09, 0.09, 0.11, 0.18, 0.27, 0.41, 0.49, 0.50, 0.49, 0.42, 0.30, 0.17, 0.09, 0.05, 0.04, 0.08, 0.21, 0.38, 0.55, 0.67, 0.58, 0.61,
  0.63, 0.73, 0.95, 0.85, 0.53, 0.73, 0.78, 0.50, 0.26, 0.09, 0.02, 0.02, 0.06, 0.16, 0.32, 0.45, 0.56, 0.65, 0.61, 0.47, 0.25, 0.17, 0.25, 0.26,
  0.49, 0.57, 0.55, 0.55, 0.19, 0.23, 0.20, 0.18, 0.14, 0.09, 0.11, 0.19, 0.30, 0.46, 0.46, 0.51, 0.49, 0.56, 0.43, 0.32, 0.28, 0.23, 0.18, 0.13,
  0.08, 0.04, 0.02, 0.04, 0.22, 0.60, 0.66, 0.64, 0.73, 0.95, 0.62, 0.60, 0.39, 0.03, 0.01, 0.01, 0.05, 0.11, 0.18, 0.28, 0.36, 0.42, 0.58, 0.63,
  0.69, 0.69, 0.70, 0.58, 0.16, 0.15, 0.22, 0.48, 0.57, 0.55, 0.55, 0.20, 0.23, 0.19, 0.17, 0.14, 0.13, 0.15, 0.24, 0.14, 0.29, 0.47, 0.49, 0.58,
  0.62, 0.39, 0.13, 0.09, 0.09, 0.11, 0.11, 0.12, 0.11, 0.10, 0.05, 0.06, 0.50, 0.60, 0.65, 0.76, 0.78, 0.54, 0.61, 0.15, 0.03, 0.09, 0.13, 0.18,
  0.22, 0.23, 0.20, 0.18, 0.31, 0.65, 0.70, 0.62, 0.72, 0.59, 0.35, 0.24, 0.12, 0.12, 0.44, 0.58, 0.55, 0.55, 0.20, 0.23, 0.19, 0.16, 0.14, 0.13,
  0.17, 0.23, 0.14, 0.17, 0.30, 0.45, 0.52, 0.53, 0.40, 0.17, 0.08, 0.05, 0.04, 0.06, 0.08, 0.08, 0.11, 0.12, 0.08, 0.42, 0.57, 0.60, 0.71, 0.60,
  0.59, 0.48, 0.10, 0.13, 0.15, 0.20, 0.20, 0.18, 0.11, 0.11, 0.18, 0.40, 0.59, 0.61, 0.55, 0.47, 0.34, 0.29, 0.28, 0.15, 0.09, 0.38, 0.59, 0.55,
  0.55, 0.20, 0.23, 0.18, 0.16, 0.15, 0.13, 0.22, 0.19, 0.14, 0.21, 0.16, 0.13, 0.06, 0.09, 0.27, 0.35, 0.33, 0.26, 0.11, 0.02, 0.04, 0.08, 0.08,
  0.09, 0.05, 0.35, 0.59, 0.55, 0.53, 0.49, 0.55, 0.34, 0.08, 0.11, 0.18, 0.20, 0.15, 0.07, 0.14, 0.27, 0.34, 0.34, 0.18, 0.08, 0.16, 0.20, 0.26,
  0.33, 0.29, 0.18, 0.08, 0.34, 0.59, 0.55, 0.55, 0.20, 0.23, 0.18, 0.16, 0.15, 0.14, 0.24, 0.15, 0.19, 0.11, 0.02, 0.06, 0.24, 0.45, 0.65, 0.74,
  0.75, 0.75, 0.60, 0.36, 0.09, 0.03, 0.09, 0.13, 0.05, 0.25, 0.58, 0.54, 0.49, 0.48, 0.54, 0.24, 0.06, 0.17, 0.21, 0.13, 0.11, 0.34, 0.60, 0.73,
  0.81, 0.74, 0.52, 0.30, 0.12, 0.05, 0.07, 0.23, 0.31, 0.22, 0.08, 0.30, 0.59, 0.56, 0.56, 0.21, 0.24, 0.18, 0.16, 0.15, 0.17, 0.21, 0.15, 0.11,
  0.02, 0.14, 0.31, 0.35, 0.26, 0.16, 0.19, 0.28, 0.26, 0.40, 0.52, 0.47, 0.15, 0.04, 0.11, 0.12, 0.16, 0.56, 0.56, 0.51, 0.50, 0.52, 0.14, 0.13,
  0.22, 0.12, 0.16, 0.44, 0.50, 0.40, 0.33, 0.27, 0.19, 0.24, 0.30, 0.29, 0.19, 0.08, 0.07, 0.22, 0.27, 0.09, 0.25, 0.58, 0.56, 0.56, 0.21, 0.24,
  0.18, 0.16, 0.15, 0.19, 0.19, 0.09, 0.05, 0.14, 0.17, 0.09, 0.03, 0.04, 0.00, 0.10, 0.34, 0.00, 0.01, 0.06, 0.29, 0.47, 0.16, 0.05, 0.14, 0.16,
  0.51, 0.56, 0.48, 0.48, 0.42, 0.12, 0.23, 0.14, 0.18, 0.44, 0.25, 0.04, 0.00, 0.22, 0.28, 0.00, 0.03, 0.03, 0.05, 0.12, 0.16, 0.11, 0.08, 0.22,
  0.13, 0.19, 0.57, 0.56, 0.56, 0.22, 0.25, 0.18, 0.16, 0.16, 0.16, 0.09, 0.07, 0.09, 0.06, 0.03, 0.04, 0.18, 0.24, 0.08, 0.05, 0.01, 0.14, 0.25,
  0.44, 0.11, 0.17, 0.39, 0.13, 0.08, 0.13, 0.35, 0.58, 0.57, 0.70, 0.48, 0.22, 0.17, 0.18, 0.37, 0.15, 0.17, 0.16, 0.11, 0.02, 0.06, 0.08, 0.22,
  0.22, 0.05, 0.03, 0.04, 0.08, 0.07, 0.05, 0.09, 0.20, 0.56, 0.57, 0.56, 0.22, 0.25, 0.18, 0.17, 0.18, 0.27, 0.23, 0.11, 0.08, 0.07, 0.09, 0.13,
  0.25, 0.46, 0.20, 0.11, 0.20, 0.22, 0.60, 0.69, 0.31, 0.15, 0.12, 0.22, 0.13, 0.12, 0.34, 0.71, 0.78, 1.00, 0.73, 0.31, 0.18, 0.22, 0.09, 0.15,
  0.47, 0.47, 0.16, 0.19, 0.16, 0.18, 0.50, 0.31, 0.14, 0.11, 0.07, 0.07, 0.11, 0.20, 0.31, 0.27, 0.55, 0.57, 0.56, 0.22, 0.26, 0.19, 0.16, 0.33,
  0.40, 0.40, 0.42, 0.16, 0.13, 0.12, 0.14, 0.24, 0.43, 0.53, 0.32, 0.27, 0.49, 0.75, 0.72, 0.70, 0.69, 0.54, 0.31, 0.19, 0.14, 0.36, 0.71, 0.76,
  0.99, 0.71, 0.30, 0.20, 0.34, 0.55, 0.61, 0.65, 0.69, 0.44, 0.23, 0.28, 0.55, 0.55, 0.32, 0.16, 0.10, 0.17, 0.27, 0.33, 0.50, 0.61, 0.40, 0.52,
  0.58, 0.56, 0.23, 0.27, 0.20, 0.17, 0.28, 0.35, 0.31, 0.45, 0.48, 0.15, 0.14, 0.13, 0.16, 0.20, 0.31, 0.50, 0.57, 0.67, 0.62, 0.54, 0.39, 0.27,
  0.36, 0.42, 0.13, 0.14, 0.38, 0.72, 0.77, 1.00, 0.74, 0.24, 0.17, 0.52, 0.31, 0.34, 0.58, 0.66, 0.72, 0.62, 0.54, 0.41, 0.27, 0.21, 0.13, 0.15,
  0.34, 0.44, 0.47, 0.51, 0.60, 0.42, 0.50, 0.59, 0.57, 0.24, 0.29, 0.21, 0.20, 0.18, 0.33, 0.37, 0.32, 0.53, 0.51, 0.16, 0.16, 0.12, 0.16, 0.20,
  0.27, 0.30, 0.32, 0.21, 0.18, 0.31, 0.47, 0.69, 0.61, 0.31, 0.16, 0.38, 0.73, 0.76, 1.00, 0.72, 0.27, 0.55, 0.58, 0.47, 0.29, 0.16, 0.27, 0.42,
  0.40, 0.29, 0.22, 0.22, 0.16, 0.14, 0.34, 0.55, 0.58, 0.48, 0.52, 0.49, 0.25, 0.53, 0.58, 0.57, 0.25, 0.29, 0.22, 0.20, 0.22, 0.26, 0.51, 0.38,
  0.32, 0.65, 0.53, 0.16, 0.22, 0.13, 0.13, 0.14, 0.14, 0.18, 0.36, 0.56, 0.63, 0.74, 0.81, 0.74, 0.47, 0.24, 0.39, 0.73, 0.76, 1.00, 0.72, 0.33,
  0.74, 0.77, 0.53, 0.61, 0.48, 0.24, 0.18, 0.19, 0.20, 0.25, 0.17, 0.22, 0.40, 0.63, 0.71, 0.46, 0.49, 0.52, 0.42, 0.22, 0.55, 0.59, 0.57, 0.25,
  0.31, 0.23, 0.21, 0.24, 0.22, 0.41, 0.60, 0.38, 0.35, 0.78, 0.54, 0.17, 0.26, 0.19, 0.27, 0.46, 0.62, 0.65, 0.63, 0.71, 0.82, 0.76, 0.67, 0.45,
  0.25, 0.40, 0.74, 0.77, 1.00, 0.75, 0.31, 0.55, 0.83, 0.60, 0.49, 0.58, 0.59, 0.43, 0.29, 0.31, 0.29, 0.39, 0.50, 0.67, 0.82, 0.47, 0.45, 0.48,
  0.61, 0.37, 0.23, 0.55, 0.60, 0.58, 0.26, 0.32, 0.24, 0.22, 0.24, 0.27, 0.26, 0.55, 0.63, 0.41, 0.44, 0.86, 0.53, 0.19, 0.45, 0.66, 0.68, 0.64,
  0.64, 0.70, 0.82, 0.73, 0.76, 0.57, 0.42, 0.27, 0.42, 0.75, 0.78, 1.00, 0.75, 0.38, 0.42, 0.77, 0.87, 0.73, 0.56, 0.55, 0.59, 0.53, 0.41, 0.49,
  0.53, 0.70, 0.85, 0.55, 0.40, 0.50, 0.64, 0.58, 0.24, 0.27, 0.55, 0.60, 0.58, 0.27, 0.33, 0.26, 0.23, 0.24, 0.26, 0.30, 0.35, 0.64, 0.64, 0.44,
  0.56, 0.87, 0.58, 0.70, 0.68, 0.65, 0.68, 0.68, 0.79, 0.73, 0.82, 0.69, 0.49, 0.42, 0.28, 0.43, 0.75, 0.78, 1.00, 0.75, 0.44, 0.33, 0.70, 0.76,
  0.95, 0.87, 0.69, 0.58, 0.58, 0.53, 0.52, 0.74, 0.84, 0.67, 0.38, 0.53, 0.64, 0.71, 0.35, 0.25, 0.26, 0.55, 0.61, 0.59, 0.28, 0.34, 0.27, 0.24,
  0.25, 0.23, 0.31, 0.30, 0.47, 0.66, 0.67, 0.51, 0.61, 0.70, 0.62, 0.67, 0.68, 0.67, 0.75, 0.73, 0.84, 0.82, 0.51, 0.52, 0.41, 0.29, 0.44, 0.76,
  0.78, 1.00, 0.75, 0.49, 0.29, 0.60, 0.76, 0.75, 0.95, 0.91, 0.81, 0.67, 0.59, 0.77, 0.81, 0.77, 0.43, 0.55, 0.65, 0.71, 0.49, 0.26, 0.27, 0.26,
  0.56, 0.61, 0.59, 0.29, 0.35, 0.28, 0.25, 0.25, 0.23, 0.25, 0.35, 0.32, 0.58, 0.55, 0.33, 0.35, 0.71, 0.70, 0.63, 0.67, 0.70, 0.74, 0.84, 0.90,
  0.57, 0.55, 0.50, 0.41, 0.30, 0.45, 0.76, 0.79, 1.00, 0.74, 0.53, 0.33, 0.47, 0.76, 0.73, 0.77, 0.93, 0.91, 0.78, 0.76, 0.75, 0.80, 0.56, 0.55,
  0.67, 0.69, 0.59, 0.29, 0.29, 0.25, 0.27, 0.56, 0.62, 0.60, 0.30, 0.37, 0.30, 0.25, 0.25, 0.25, 0.22, 0.30, 0.37, 0.31, 0.26, 0.29, 0.29, 0.50,
  0.75, 0.71, 0.62, 0.74, 0.87, 0.91, 0.69, 0.50, 0.58, 0.48, 0.42, 0.31, 0.46, 0.77, 0.79, 1.00, 0.75, 0.55, 0.37, 0.40, 0.69, 0.76, 0.71, 0.78,
  0.81, 0.82, 0.86, 0.83, 0.67, 0.59, 0.67, 0.67, 0.66, 0.34, 0.31, 0.25, 0.25, 0.25, 0.56, 0.62, 0.61, 0.31, 0.38, 0.32, 0.28, 0.27, 0.26, 0.24,
  0.23, 0.35, 0.36, 0.28, 0.31, 0.33, 0.33, 0.64, 0.72, 0.73, 0.73, 0.84, 0.83, 0.51, 0.56, 0.54, 0.48, 0.42, 0.31, 0.47, 0.77, 0.79, 0.99, 0.74,
  0.56, 0.43, 0.38, 0.60, 0.75, 0.74, 0.71, 0.84, 0.87, 0.86, 0.85, 0.56, 0.56, 0.63, 0.69, 0.39, 0.33, 0.27, 0.24, 0.24, 0.25, 0.58, 0.62, 0.61,
  0.31, 0.39, 0.33, 0.34, 0.29, 0.22, 0.27, 0.23, 0.26, 0.40, 0.33, 0.29, 0.33, 0.33, 0.40, 0.75, 0.80, 0.76, 0.73, 0.58, 0.52, 0.58, 0.50, 0.48,
  0.40, 0.33, 0.49, 0.79, 0.81, 1.00, 0.75, 0.57, 0.46, 0.40, 0.51, 0.71, 0.72, 0.86, 0.89, 0.86, 0.91, 0.69, 0.53, 0.57, 0.59, 0.40, 0.33, 0.31,
  0.22, 0.24, 0.21, 0.27, 0.61, 0.62, 0.62, 0.32, 0.40, 0.35, 0.33, 0.36, 0.12, 0.22, 0.27, 0.22, 0.31, 0.39, 0.29, 0.32, 0.36, 0.34, 0.54, 0.80,
  0.79, 0.77, 0.68, 0.55, 0.57, 0.54, 0.73, 0.44, 0.36, 0.50, 0.71, 0.75, 0.92, 0.73, 0.60, 0.63, 0.70, 0.52, 0.65, 0.87, 0.89, 0.88, 0.89, 0.85,
  0.55, 0.57, 0.61, 0.45, 0.31, 0.36, 0.22, 0.22, 0.22, 0.11, 0.34, 0.65, 0.62, 0.62, 0.33, 0.41, 0.38, 0.32, 0.42, 0.21, 0.09, 0.19, 0.26, 0.24,
  0.35, 0.33, 0.27, 0.35, 0.37, 0.38, 0.66, 0.80, 0.78, 0.76, 0.67, 0.56, 0.49, 0.79, 0.51, 0.29, 0.27, 0.42, 0.45, 0.59, 0.43, 0.47, 0.75, 0.76,
  0.44, 0.80, 0.88, 0.88, 0.89, 0.93, 0.69, 0.54, 0.62, 0.53, 0.29, 0.37, 0.25, 0.19, 0.20, 0.12, 0.09, 0.48, 0.65, 0.63, 0.63, 0.34, 0.43, 0.40,
  0.33, 0.39, 0.32, 0.13, 0.09, 0.17, 0.24, 0.26, 0.35, 0.27, 0.29, 0.38, 0.37, 0.48, 0.73, 0.80, 0.76, 0.73, 0.62, 0.25, 0.25, 0.15, 0.07, 0.18,
  0.44, 0.51, 0.63, 0.27, 0.08, 0.24, 0.28, 0.32, 0.84, 0.88, 0.90, 0.93, 0.86, 0.56, 0.60, 0.59, 0.33, 0.35, 0.31, 0.17, 0.18, 0.10, 0.09, 0.19,
  0.57, 0.64, 0.63, 0.64, 0.34, 0.44, 0.42, 0.36, 0.35, 0.40, 0.18, 0.14, 0.09, 0.14, 0.22, 0.29, 0.31, 0.25, 0.34, 0.40, 0.40, 0.60, 0.74, 0.79,
  0.73, 0.65, 0.21, 0.11, 0.06, 0.10, 0.14, 0.16, 0.35, 0.40, 0.11, 0.10, 0.06, 0.16, 0.41, 0.86, 0.89, 0.91, 0.95, 0.69, 0.57, 0.63, 0.42, 0.31,
  0.35, 0.18, 0.16, 0.09, 0.09, 0.14, 0.29, 0.62, 0.63, 0.64, 0.64, 0.35, 0.45, 0.44, 0.39, 0.33, 0.44, 0.25, 0.18, 0.12, 0.10, 0.11, 0.19, 0.28,
  0.27, 0.30, 0.37, 0.42, 0.47, 0.68, 0.73, 0.76, 0.69, 0.33, 0.10, 0.10, 0.03, 0.11, 0.16, 0.19, 0.20, 0.05, 0.09, 0.12, 0.18, 0.64, 0.89, 0.90,
  0.95, 0.86, 0.57, 0.64, 0.51, 0.32, 0.34, 0.23, 0.14, 0.08, 0.07, 0.17, 0.16, 0.40, 0.65, 0.64, 0.65, 0.65, 0.36, 0.47, 0.47, 0.43, 0.34, 0.42,
  0.32, 0.22, 0.16, 0.13, 0.10, 0.12, 0.19, 0.25, 0.28, 0.34, 0.40, 0.42, 0.59, 0.68, 0.72, 0.73, 0.52, 0.13, 0.10, 0.09, 0.05, 0.10, 0.20, 0.12,
  0.11, 0.23, 0.24, 0.45, 0.84, 0.90, 0.92, 0.96, 0.68, 0.62, 0.57, 0.40, 0.32, 0.29, 0.13, 0.07, 0.06, 0.15, 0.22, 0.18, 0.50, 0.64, 0.64, 0.65,
  0.65, 0.36, 0.48, 0.48, 0.45, 0.37, 0.38, 0.38, 0.25, 0.21, 0.14, 0.13, 0.11, 0.15, 0.18, 0.25, 0.32, 0.36, 0.41, 0.45, 0.67, 0.64, 0.71, 0.64,
  0.34, 0.11, 0.11, 0.08, 0.05, 0.09, 0.11, 0.22, 0.27, 0.41, 0.76, 0.89, 0.91, 0.95, 0.85, 0.60, 0.62, 0.48, 0.35, 0.29, 0.16, 0.05, 0.07, 0.10,
  0.26, 0.21, 0.25, 0.57, 0.64, 0.65, 0.65, 0.65, 0.37, 0.49, 0.49, 0.47, 0.41, 0.35, 0.39, 0.30, 0.26, 0.18, 0.14, 0.12, 0.12, 0.17, 0.18, 0.24,
  0.36, 0.37, 0.41, 0.54, 0.68, 0.61, 0.69, 0.58, 0.29, 0.19, 0.39, 0.24, 0.11, 0.30, 0.60, 0.48, 0.65, 0.86, 0.92, 0.95, 0.96, 0.68, 0.64, 0.52,
  0.45, 0.30, 0.36, 0.06, 0.08, 0.07, 0.22, 0.29, 0.19, 0.34, 0.61, 0.65, 0.66, 0.66, 0.66, 0.39, 0.50, 0.51, 0.49, 0.44, 0.36, 0.38, 0.34, 0.31,
  0.26, 0.15, 0.14, 0.09, 0.13, 0.19, 0.20, 0.26, 0.37, 0.38, 0.42, 0.65, 0.65, 0.55, 0.40, 0.31, 0.57, 0.66, 0.47, 0.18, 0.51, 0.87, 0.89, 0.77,
  0.72, 0.75, 0.86, 0.80, 0.65, 0.56, 0.53, 0.33, 0.53, 0.33, 0.04, 0.09, 0.12, 0.35, 0.25, 0.21, 0.42, 0.63, 0.65, 0.66, 0.66, 0.66, 0.40, 0.51,
  0.52, 0.51, 0.46, 0.38, 0.36, 0.37, 0.36, 0.34, 0.21, 0.13, 0.13, 0.06, 0.15, 0.24, 0.21, 0.31, 0.36, 0.35, 0.40, 0.38, 0.25, 0.31, 0.60, 0.50,
  0.61, 0.75, 0.56, 0.75, 0.65, 0.61, 0.78, 0.84, 0.78, 0.73, 0.69, 0.60, 0.55, 0.45, 0.49, 0.55, 0.07, 0.10, 0.08, 0.27, 0.36, 0.22, 0.25, 0.49,
  0.64, 0.66, 0.67, 0.67, 0.66, 0.41, 0.52, 0.53, 0.53, 0.48, 0.40, 0.38, 0.31, 0.37, 0.41, 0.33, 0.15, 0.15, 0.09, 0.06, 0.18, 0.27, 0.24, 0.39,
  0.37, 0.24, 0.27, 0.34, 0.45, 0.35, 0.32, 0.23, 0.22, 0.53, 0.47, 0.44, 0.46, 0.44, 0.50, 0.71, 0.86, 0.84, 0.45, 0.45, 0.53, 0.63, 0.12, 0.07,
  0.10, 0.13, 0.41, 0.29, 0.24, 0.31, 0.55, 0.65, 0.67, 0.67, 0.67, 0.67, 0.43, 0.53, 0.55, 0.55, 0.49, 0.43, 0.40, 0.34, 0.28, 0.42, 0.45, 0.25,
  0.13, 0.13, 0.06, 0.08, 0.25, 0.29, 0.38, 0.50, 0.27, 0.24, 0.26, 0.25, 0.36, 0.39, 0.18, 0.13, 0.29, 0.49, 0.47, 0.56, 0.52, 0.38, 0.29, 0.42,
  0.64, 0.42, 0.40, 0.71, 0.22, 0.06, 0.11, 0.08, 0.29, 0.41, 0.25, 0.28, 0.26, 0.51, 0.67, 0.67, 0.68, 0.67, 0.67, 0.44, 0.55, 0.56, 0.56, 0.51,
  0.45, 0.44, 0.40, 0.31, 0.25, 0.48, 0.43, 0.15, 0.14, 0.11, 0.07, 0.14, 0.32, 0.37, 0.34, 0.16, 0.18, 0.18, 0.13, 0.13, 0.18, 0.21, 0.24, 0.27,
  0.31, 0.30, 0.25, 0.15, 0.18, 0.30, 0.24, 0.16, 0.33, 0.71, 0.36, 0.09, 0.14, 0.08, 0.13, 0.43, 0.32, 0.28, 0.25, 0.26, 0.56, 0.68, 0.67, 0.68,
  0.68, 0.67, 0.45, 0.55, 0.57, 0.57, 0.53, 0.47, 0.46, 0.42, 0.38, 0.24, 0.28, 0.54, 0.31, 0.11, 0.14, 0.09, 0.09, 0.19, 0.29, 0.09, 0.11, 0.08,
  0.05, 0.07, 0.12, 0.09, 0.13, 0.15, 0.15, 0.16, 0.13, 0.08, 0.11, 0.06, 0.05, 0.11, 0.15, 0.14, 0.38, 0.13, 0.20, 0.12, 0.07, 0.29, 0.43, 0.30,
  0.26, 0.22, 0.43, 0.69, 0.66, 0.68, 0.69, 0.68, 0.68, 0.47, 0.56, 0.58, 0.58, 0.55, 0.49, 0.49, 0.43, 0.40, 0.35, 0.20, 0.33, 0.53, 0.17, 0.12,
  0.11, 0.14, 0.24, 0.15, 0.11, 0.09, 0.18, 0.33, 0.41, 0.47, 0.62, 0.67, 0.54, 0.51, 0.55, 0.67, 0.75, 0.50, 0.42, 0.32, 0.17, 0.08, 0.16, 0.24,
  0.31, 0.20, 0.08, 0.13, 0.44, 0.36, 0.27, 0.22, 0.30, 0.64, 0.69, 0.67, 0.68, 0.69, 0.69, 0.69, 0.49, 0.58, 0.59, 0.60, 0.56, 0.50, 0.51, 0.45,
  0.38, 0.39, 0.32, 0.19, 0.41, 0.40, 0.09, 0.12, 0.19, 0.25, 0.11, 0.21, 0.24, 0.16, 0.26, 0.44, 0.60, 0.83, 0.89, 0.93, 0.93, 0.97, 0.94, 0.96,
  0.68, 0.55, 0.36, 0.28, 0.39, 0.30, 0.22, 0.33, 0.16, 0.06, 0.30, 0.45, 0.28, 0.23, 0.24, 0.48, 0.70, 0.68, 0.67, 0.68, 0.69, 0.69, 0.69, 0.51,
  0.58, 0.60, 0.61, 0.57, 0.51, 0.53, 0.48, 0.40, 0.36, 0.36, 0.31, 0.20, 0.41, 0.21, 0.09, 0.17, 0.12, 0.07, 0.10, 0.19, 0.20, 0.09, 0.08, 0.23,
  0.40, 0.60, 0.65, 0.64, 0.67, 0.67, 0.62, 0.45, 0.23, 0.20, 0.35, 0.27, 0.15, 0.09, 0.20, 0.11, 0.13, 0.45, 0.33, 0.22, 0.23, 0.34, 0.61, 0.67,
  0.69, 0.67, 0.68, 0.69, 0.70, 0.69, 0.52, 0.60, 0.62, 0.62, 0.59, 0.53, 0.55, 0.50, 0.42, 0.36, 0.35, 0.39, 0.33, 0.21, 0.30, 0.11, 0.11, 0.25,
  0.17, 0.08, 0.12, 0.18, 0.18, 0.13, 0.13, 0.04, 0.16, 0.32, 0.33, 0.40, 0.31, 0.25, 0.24, 0.21, 0.22, 0.21, 0.17, 0.13, 0.25, 0.25, 0.05, 0.31,
  0.41, 0.22, 0.24, 0.27, 0.52, 0.61, 0.67, 0.69, 0.67, 0.69, 0.69, 0.70, 0.69, 0.54, 0.61, 0.62, 0.63, 0.60, 0.53, 0.55, 0.51, 0.44, 0.36, 0.36,
  0.34, 0.48, 0.34, 0.20, 0.16, 0.10, 0.14, 0.30, 0.24, 0.14, 0.15, 0.11, 0.09, 0.15, 0.15, 0.17, 0.29, 0.33, 0.38, 0.31, 0.28, 0.18, 0.13, 0.11,
  0.16, 0.18, 0.28, 0.36, 0.10, 0.15, 0.40, 0.24, 0.21, 0.31, 0.50, 0.61, 0.59, 0.68, 0.69, 0.67, 0.69, 0.70, 0.70, 0.69, 0.55, 0.62, 0.64, 0.64,
  0.60, 0.55, 0.56, 0.52, 0.44, 0.38, 0.38, 0.27, 0.24, 0.50, 0.37, 0.13, 0.12, 0.10, 0.15, 0.30, 0.27, 0.23, 0.11, 0.06, 0.04, 0.07, 0.10, 0.11,
  0.13, 0.14, 0.14, 0.09, 0.07, 0.08, 0.12, 0.21, 0.35, 0.41, 0.18, 0.08, 0.27, 0.25, 0.18, 0.37, 0.54, 0.63, 0.60, 0.59, 0.68, 0.69, 0.67, 0.69,
  0.70, 0.70, 0.69, 0.57, 0.63, 0.64, 0.64, 0.61, 0.55, 0.57, 0.53, 0.45, 0.39, 0.40, 0.30, 0.17, 0.22, 0.46, 0.42, 0.12, 0.11, 0.11, 0.18, 0.28,
  0.29, 0.22, 0.13, 0.09, 0.04, 0.03, 0.03, 0.04, 0.04, 0.05, 0.07, 0.09, 0.17, 0.26, 0.35, 0.42, 0.27, 0.09, 0.16, 0.21, 0.20, 0.40, 0.46, 0.63,
  0.65, 0.60, 0.60, 0.69, 0.70, 0.67, 0.69, 0.70, 0.70, 0.69, 0.58, 0.63, 0.65, 0.65, 0.62, 0.56, 0.58, 0.54, 0.46, 0.39, 0.42, 0.32, 0.19, 0.22,
  0.07, 0.36, 0.47, 0.15, 0.07, 0.11, 0.21, 0.27, 0.27, 0.13, 0.25, 0.47, 0.47, 0.51, 0.53, 0.57, 0.60, 0.61, 0.61, 0.35, 0.30, 0.40, 0.35, 0.12,
  0.13, 0.13, 0.23, 0.44, 0.21, 0.24, 0.69, 0.65, 0.60, 0.60, 0.69, 0.69, 0.67, 0.69, 0.70, 0.70, 0.70, 0.59, 0.64, 0.65, 0.65, 0.62, 0.56, 0.59,
  0.55, 0.47, 0.40, 0.44, 0.34, 0.20, 0.24, 0.09, 0.02, 0.25, 0.51, 0.23, 0.05, 0.11, 0.22, 0.29, 0.18, 0.40, 0.62, 0.69, 0.76, 0.84, 0.87, 0.84,
  0.82, 0.84, 0.58, 0.34, 0.40, 0.17, 0.12, 0.12, 0.28, 0.39, 0.15, 0.02, 0.27, 0.69, 0.65, 0.60, 0.60, 0.69, 0.70, 0.67, 0.69, 0.70, 0.70, 0.70,
  0.60, 0.64, 0.65, 0.66, 0.63, 0.56, 0.59, 0.55, 0.47, 0.41, 0.45, 0.35, 0.21, 0.25, 0.10, 0.07, 0.02, 0.13, 0.47, 0.34, 0.07, 0.09, 0.25, 0.28,
  0.44, 0.67, 0.77, 0.83, 0.88, 0.90, 0.90, 0.87, 0.83, 0.67, 0.42, 0.24, 0.11, 0.15, 0.34, 0.31, 0.06, 0.05, 0.05, 0.29, 0.71, 0.66, 0.61, 0.60,
  0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.61, 0.65, 0.66, 0.66, 0.63, 0.58, 0.59, 0.56, 0.48, 0.41, 0.45, 0.36, 0.22, 0.26, 0.10, 0.06, 0.07,
  0.03, 0.05, 0.36, 0.44, 0.13, 0.07, 0.27, 0.49, 0.71, 0.75, 0.81, 0.86, 0.88, 0.88, 0.86, 0.82, 0.66, 0.29, 0.11, 0.20, 0.36, 0.21, 0.03, 0.05,
  0.09, 0.05, 0.29, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.62, 0.64, 0.67, 0.67, 0.63, 0.58, 0.60, 0.56, 0.49, 0.42,
  0.46, 0.36, 0.22, 0.26, 0.10, 0.06, 0.07, 0.06, 0.05, 0.01, 0.22, 0.47, 0.22, 0.08, 0.43, 0.47, 0.46, 0.50, 0.53, 0.54, 0.54, 0.53, 0.55, 0.44,
  0.12, 0.27, 0.33, 0.11, 0.03, 0.07, 0.07, 0.09, 0.06, 0.30, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.62, 0.65, 0.67,
  0.67, 0.64, 0.58, 0.60, 0.56, 0.49, 0.42, 0.46, 0.37, 0.23, 0.27, 0.11, 0.07, 0.07, 0.07, 0.06, 0.06, 0.01, 0.09, 0.38, 0.31, 0.18, 0.20, 0.21,
  0.22, 0.24, 0.25, 0.26, 0.25, 0.26, 0.25, 0.31, 0.25, 0.04, 0.04, 0.08, 0.07, 0.08, 0.11, 0.07, 0.31, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.67,
  0.69, 0.71, 0.71, 0.70, 0.63, 0.65, 0.67, 0.67, 0.64, 0.59, 0.61, 0.57, 0.50, 0.43, 0.47, 0.38, 0.23, 0.28, 0.14, 0.07, 0.08, 0.07, 0.07, 0.05,
  0.06, 0.03, 0.02, 0.23, 0.16, 0.13, 0.16, 0.16, 0.18, 0.19, 0.20, 0.21, 0.20, 0.24, 0.15, 0.02, 0.06, 0.08, 0.09, 0.09, 0.09, 0.11, 0.08, 0.31,
  0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.71, 0.71, 0.71, 0.64, 0.66, 0.67, 0.67, 0.64, 0.59, 0.61, 0.57, 0.50, 0.43, 0.47, 0.38, 0.24,
  0.29, 0.16, 0.07, 0.08, 0.07, 0.07, 0.06, 0.05, 0.05, 0.05, 0.02, 0.05, 0.07, 0.07, 0.09, 0.09, 0.09, 0.09, 0.07, 0.06, 0.03, 0.02, 0.05, 0.07,
  0.09, 0.11, 0.10, 0.09, 0.12, 0.08, 0.31, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.71, 0.65, 0.66, 0.67, 0.67, 0.64, 0.59,
  0.62, 0.58, 0.50, 0.43, 0.48, 0.38, 0.24, 0.29, 0.18, 0.07, 0.08, 0.07, 0.07, 0.07, 0.06, 0.05, 0.05, 0.05, 0.04, 0.04, 0.03, 0.02, 0.02, 0.02,
  0.03, 0.03, 0.04, 0.04, 0.04, 0.05, 0.09, 0.10, 0.12, 0.11, 0.10, 0.13, 0.09, 0.32, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70,
  0.70, 0.65, 0.67, 0.67, 0.67, 0.64, 0.59, 0.62, 0.58, 0.51, 0.44, 0.48, 0.39, 0.24, 0.29, 0.20, 0.09, 0.08, 0.08, 0.07, 0.07, 0.07, 0.06, 0.06,
  0.05, 0.05, 0.05, 0.05, 0.04, 0.04, 0.05, 0.04, 0.05, 0.05, 0.04, 0.04, 0.05, 0.10, 0.11, 0.14, 0.13, 0.11, 0.13, 0.10, 0.32, 0.71, 0.67, 0.61,
  0.60, 0.69, 0.70, 0.68, 0.69, 0.71, 0.71, 0.70, 0.65, 0.67, 0.68, 0.68, 0.65, 0.60, 0.62, 0.58, 0.51, 0.44, 0.48, 0.39, 0.25, 0.29, 0.22, 0.11,
  0.08, 0.08, 0.08, 0.07, 0.07, 0.07, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.06, 0.12, 0.13, 0.16, 0.13,
  0.11, 0.15, 0.11, 0.33, 0.72, 0.67, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.65, 0.67, 0.68, 0.68, 0.65, 0.60, 0.62, 0.58, 0.52,
  0.44, 0.49, 0.40, 0.25, 0.29, 0.22, 0.13, 0.08, 0.08, 0.08, 0.08, 0.08, 0.07, 0.07, 0.07, 0.06, 0.06, 0.05, 0.05, 0.05, 0.05, 0.05, 0.06, 0.05,
  0.05, 0.05, 0.07, 0.13, 0.15, 0.18, 0.15, 0.12, 0.15, 0.12, 0.33, 0.72, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.65, 0.67,
  0.68, 0.68, 0.65, 0.60, 0.62, 0.59, 0.52, 0.45, 0.49, 0.40, 0.25, 0.29, 0.22, 0.15, 0.08, 0.09, 0.09, 0.08, 0.08, 0.07, 0.07, 0.07, 0.07, 0.07,
  0.06, 0.06, 0.06, 0.06, 0.06, 0.07, 0.06, 0.06, 0.06, 0.08, 0.15, 0.17, 0.22, 0.17, 0.13, 0.16, 0.12, 0.34, 0.71, 0.66, 0.61, 0.60, 0.69, 0.70,
  0.68, 0.69, 0.70, 0.71, 0.70, 0.66, 0.67, 0.69, 0.68, 0.65, 0.61, 0.62, 0.59, 0.52, 0.45, 0.49, 0.41, 0.26, 0.29, 0.22, 0.18, 0.09, 0.09, 0.09,
  0.09, 0.09, 0.08, 0.08, 0.08, 0.08, 0.07, 0.07, 0.06, 0.06, 0.07, 0.07, 0.07, 0.07, 0.07, 0.07, 0.09, 0.18, 0.20, 0.24, 0.18, 0.13, 0.17, 0.13,
  0.34, 0.71, 0.66, 0.62, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.66, 0.67, 0.68, 0.68, 0.65, 0.61, 0.63, 0.60, 0.53, 0.45, 0.49, 0.41,
  0.27, 0.29, 0.23, 0.19, 0.11, 0.09, 0.09, 0.09, 0.09, 0.08, 0.09, 0.09, 0.08, 0.08, 0.07, 0.07, 0.07, 0.07, 0.08, 0.08, 0.07, 0.07, 0.08, 0.10,
  0.20, 0.24, 0.26, 0.20, 0.14, 0.18, 0.13, 0.35, 0.71, 0.67, 0.62, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70, 0.70, 0.66, 0.67, 0.68, 0.69, 0.66,
  0.61, 0.63, 0.60, 0.53, 0.46, 0.50, 0.41, 0.27, 0.29, 0.23, 0.20, 0.12, 0.09, 0.10, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.08, 0.08, 0.08,
  0.08, 0.09, 0.09, 0.08, 0.09, 0.09, 0.11, 0.23, 0.26, 0.29, 0.21, 0.15, 0.18, 0.14, 0.35, 0.71, 0.67, 0.61, 0.60, 0.69, 0.70, 0.68, 0.69, 0.70,
  0.71, 0.71, 0.66, 0.67, 0.68, 0.69, 0.66, 0.61, 0.63, 0.60, 0.53, 0.47, 0.51, 0.42, 0.28, 0.30, 0.23, 0.20, 0.14, 0.09, 0.10, 0.09, 0.10, 0.09,
  0.09, 0.10, 0.10, 0.10, 0.09, 0.08, 0.09, 0.09, 0.09, 0.10, 0.09, 0.09, 0.09, 0.12, 0.25, 0.28, 0.31, 0.23, 0.15, 0.18, 0.15, 0.35, 0.71, 0.66,
  0.62, 0.61, 0.69, 0.70, 0.69, 0.69, 0.70, 0.71, 0.70, 0.67, 0.67, 0.69, 0.69, 0.66, 0.61, 0.64, 0.60, 0.53, 0.47, 0.51, 0.42, 0.29, 0.30, 0.23,
  0.20, 0.15, 0.10, 0.10, 0.10, 0.10, 0.10, 0.10, 0.11, 0.11, 0.11, 0.10, 0.09, 0.09, 0.10, 0.10, 0.11, 0.09, 0.10, 0.10, 0.14, 0.28, 0.31, 0.34,
  0.24, 0.16, 0.20, 0.15, 0.35, 0.71, 0.66, 0.61, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70, 0.70, 0.67, 0.68, 0.69, 0.69, 0.66, 0.62, 0.64, 0.60,
  0.54, 0.47, 0.51, 0.42, 0.29, 0.31, 0.23, 0.20, 0.16, 0.10, 0.11, 0.11, 0.11, 0.10, 0.11, 0.11, 0.11, 0.11, 0.11, 0.10, 0.10, 0.10, 0.11, 0.12,
  0.10, 0.11, 0.11, 0.16, 0.31, 0.33, 0.36, 0.25, 0.16, 0.20, 0.16, 0.36, 0.71, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.68,
  0.68, 0.69, 0.69, 0.67, 0.62, 0.64, 0.60, 0.54, 0.47, 0.51, 0.43, 0.29, 0.31, 0.24, 0.20, 0.17, 0.12, 0.11, 0.11, 0.11, 0.11, 0.11, 0.12, 0.12,
  0.12, 0.11, 0.10, 0.11, 0.11, 0.12, 0.13, 0.11, 0.12, 0.12, 0.18, 0.32, 0.35, 0.38, 0.26, 0.17, 0.21, 0.16, 0.36, 0.71, 0.67, 0.62, 0.61, 0.69,
  0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.68, 0.69, 0.69, 0.69, 0.66, 0.63, 0.65, 0.61, 0.54, 0.48, 0.51, 0.43, 0.29, 0.31, 0.24, 0.21, 0.18, 0.13,
  0.11, 0.12, 0.12, 0.11, 0.12, 0.13, 0.13, 0.13, 0.12, 0.11, 0.11, 0.12, 0.12, 0.13, 0.11, 0.13, 0.13, 0.19, 0.35, 0.36, 0.40, 0.27, 0.18, 0.21,
  0.17, 0.36, 0.71, 0.67, 0.62, 0.62, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69, 0.67, 0.63, 0.64, 0.61, 0.55, 0.49, 0.52,
  0.43, 0.30, 0.32, 0.25, 0.22, 0.18, 0.14, 0.12, 0.12, 0.12, 0.12, 0.12, 0.13, 0.13, 0.13, 0.13, 0.12, 0.12, 0.13, 0.13, 0.14, 0.12, 0.13, 0.14,
  0.20, 0.36, 0.38, 0.41, 0.28, 0.18, 0.22, 0.18, 0.37, 0.71, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.71, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69,
  0.67, 0.63, 0.65, 0.61, 0.56, 0.49, 0.53, 0.44, 0.31, 0.32, 0.25, 0.22, 0.18, 0.15, 0.13, 0.13, 0.13, 0.12, 0.13, 0.14, 0.14, 0.14, 0.13, 0.12,
  0.13, 0.13, 0.14, 0.15, 0.13, 0.14, 0.16, 0.20, 0.38, 0.40, 0.43, 0.29, 0.18, 0.22, 0.18, 0.37, 0.71, 0.67, 0.62, 0.61, 0.69, 0.70, 0.69, 0.69,
  0.71, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69, 0.67, 0.63, 0.65, 0.61, 0.56, 0.50, 0.53, 0.44, 0.31, 0.32, 0.25, 0.22, 0.18, 0.16, 0.13, 0.13, 0.13,
  0.12, 0.13, 0.15, 0.15, 0.15, 0.14, 0.13, 0.13, 0.14, 0.15, 0.15, 0.13, 0.15, 0.17, 0.22, 0.40, 0.42, 0.44, 0.29, 0.19, 0.23, 0.18, 0.38, 0.71,
  0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.71, 0.70, 0.69, 0.69, 0.69, 0.69, 0.67, 0.64, 0.65, 0.62, 0.56, 0.50, 0.54, 0.44, 0.32, 0.33,
  0.25, 0.22, 0.19, 0.17, 0.14, 0.13, 0.14, 0.13, 0.14, 0.15, 0.15, 0.15, 0.14, 0.13, 0.14, 0.15, 0.16, 0.16, 0.14, 0.16, 0.18, 0.23, 0.42, 0.43,
  0.45, 0.30, 0.20, 0.23, 0.19, 0.38, 0.72, 0.67, 0.62, 0.61, 0.69, 0.70, 0.68, 0.69, 0.70, 0.70, 0.70, 0.69, 0.70, 0.70, 0.70, 0.68, 0.64, 0.66,
  0.63, 0.57, 0.51, 0.55, 0.45, 0.33, 0.33, 0.25, 0.23, 0.19, 0.17, 0.15, 0.14, 0.15, 0.14, 0.15, 0.16, 0.16, 0.16, 0.15, 0.14, 0.15, 0.16, 0.16,
  0.16, 0.15, 0.17, 0.19, 0.24, 0.43, 0.44, 0.47, 0.31, 0.20, 0.23, 0.19, 0.39, 0.73, 0.67, 0.62, 0.62, 0.70, 0.70, 0.69, 0.70, 0.71, 0.71, 0.71
];

// Simple deterministic RNG
function Rng(seed){ let s = seed|0; return function(){ s|=0; s = (s + 0x7ed55d16 + (s<<12))|0; s = (s ^ 0xc761c23c ^ (s>>>19))|0; s = (s + 0x165667b1 + (s<<5))|0; s = (s + 0xd3a2646c ^ (s<<9))|0; s = (s + 0xfd7046c5 + (s<<3))|0; s = (s ^ 0xb55a4f09 ^ (s>>>16))|0; return (s>>>0)/4294967296; }; }
const rnd = Rng(seed);

// -------- Transforms --------
function Barrel(b, cx, cy) { return p => { let x=p[0]-cx, y=p[1]-cy; let r2=(x*x+y*y)/1e4; let s=1+b*r2; return [cx+x*s, cy+y*s]; }; }
function Swirl(k, rad, cx, cy) { return p => { let x=p[0]-cx, y=p[1]-cy; let r=Math.hypot(x,y); let a=k*Math.max(0,1-r/rad); let c=Math.cos(a), s=Math.sin(a); return [cx+x*c-y*s, cy+x*s+y*c]; }; }

// Compose transforms
const CX = (barrelOffsetX), CY = (barrelOffsetY);
const T1 = Barrel(barrel, CX, CY);
const T2 = Swirl(swirl, swirlRadius, 0, 0);
function applyT(p) { return T2(T1(p)); }

// -------- Image sampler --------
function sampleImg(x, y) {
    // x,y in [-100,100] square. Fit portrait IMG into square with vertical letterbox-free fit
    let sx = x * imgExpand;
    let sy = y * imgExpand;
    // Map to IMG coords (keep portrait aspect by using height as reference)
    let u = (sx + 100) / 200;      // 0..1
    let v = (sy + 100) / 200;      // 0..1
    // Because IMG is portrait, we scale u to match IMG aspect (IMG_W/IMG_H)
    let ar = IMG_W / IMG_H;
    u = 0.5 + (u - 0.5) * ar;      // squeeze/expand horizontally
    // Clamp
    if (u < 0 || u > 1 || v < 0 || v > 1) return 1.0; // outside: treat as white
    let ix = Math.min(IMG_W-1, Math.max(0, (u * (IMG_W-1))|0));
    let iy = Math.min(IMG_H-1, Math.max(0, (v * (IMG_H-1))|0));
    let L = IMG[iy*IMG_W + ix];
    if (imgInvert) L = 1.0 - L;
    // Contrast & gamma
    L = Math.pow(Math.max(0, Math.min(1, (L-0.5)*imgContrast + 0.5)), imgGamma);
    return L;
}

// -------- Drawing helpers --------
function lerp(a,b,t){return a+(b-a)*t;}
function mix(a,b,t){return a+(b-a)*t;}

function drawSegment(p0, p1, bend) {
    if (type===0 || bend<=0) {
        turtle.jump(p0[0], p0[1]); turtle.goto(p1[0], p1[1]); return;
    }
    const m = [(p0[0]+p1[0])/2, (p0[1]+p1[1])/2];
    const n = [p1[1]-p0[1], -(p1[0]-p0[0])];
    const ctrl = [m[0] + n[0]*bend, m[1] + n[1]*bend];
    // Render quadratic Bezier with short segments
    const steps = 8;
    let prev = p0;
    for (let i=1;i<=steps;i++) {
        const t = i/steps;
        const a = [(1-t)*p0[0]+t*ctrl[0], (1-t)*p0[1]+t*ctrl[1]];
        const b = [(1-t)*ctrl[0]+t*p1[0], (1-t)*ctrl[1]+t*p1[1]];
        const q = [(1-t)*a[0]+t*b[0], (1-t)*a[1]+t*b[1]];
        turtle.jump(prev[0], prev[1]); turtle.goto(q[0], q[1]);
        prev = q;
    }
}

// -------- Main walk --------
function walk(i) {
    const r = (i / cols)|0;
    const c = i % cols;
    if (r >= rows) return false;

    // Cell corners before transforms
    const x0 = left + padding + c*CELL_W;
    const y0 = top  + padding + r*CELL_H;
    const x1 = x0 + CELL_W;
    const y1 = y0 + CELL_H;
    const cx = (x0+x1)/2, cy = (y0+y1)/2;

    // Sample image using transformed cell center (so the mapping follows transforms)
    const [sx, sy] = applyT([cx, cy]);
    const L = sampleImg(sx, sy);           // 0..1
    const darkness = Math.max(0, 1.0 - L);
    const n = Math.max(subMin|0, Math.min(subLines|0, (subMin + (subLines-subMin)*Math.pow(darkness+bias, 1.0))|0));

    // Draw n hatch lines inside the cell; orientation varies by checkerboard for texture
    const horiz = ((r + c) & 1) === 0;
    for (let k=0; k<n; k++) {
        const t = (k+1)/(n+1);
        let pA, pB;
        if (horiz) {
            const y = mix(y0, y1, t);
            pA = [x0, y]; pB = [x1, y];
        } else {
            const x = mix(x0, x1, t);
            pA = [x, y0]; pB = [x, y1];
        }
        // Jitter
        const j = (rnd()*2-1)*jitter*CELL_W;
        if (horiz) { pA[1]+=j; pB[1]+=j; } else { pA[0]+=j; pB[0]+=j; }

        // Transform
        pA = applyT(pA); pB = applyT(pB);

        // Bend based on image darkness (more bend in darker regions)
        const bend = (type===2 ? (darkness-0.5)*2 : 1) * displace * 0.02; // scale down
        drawSegment(pA, pB, bend);
    }
    return true;
}