# No. 224 (Brown 1868): "This represents an expanding pulley. On turning pinion, d, to the right or left, a similar motion is imparted to wheel, c, which, by means of
# curved slots cut therein, thrusts the studs fastened to arms of pulley outward or inward, thus augmenting or diminishing the size of the pulley."
#
# Model (cm; the pulley's face in the x-z plane, gravity on): the pulley's hub and its four radial spokes and guides are the frame (the pulley is held still while it is set).
# Wheel c (32 teeth, module 0.5) turns loosely on the hub and has four curved slots, the spirals r = 4.6 + 1.79 (theta - phi) over +-48 degrees about each arm,
# so its studs move 1.79 cm out or in for each radian c turns. Pinion d (10 teeth), its axle in the frame between two arms, gears with c. Each of the four arms slides
# in its guides and carries a stud in one of c's slots and a segment of the pulley's rim. A hand rocks pinion d to the right and left (2 rad either way), the only driven joint;
# so c turns 0.625 rad either way and the arms move 1.12 cm out and in, together (kinematics: 0.5594 cm per radian of d).
# Generator: opencode-runs/batch11/gen224.py.
number: 224
slug: expanding-pulley
name: An expanding pulley
brown: "This represents an expanding pulley. On turning pinion, d, to the right or left, a similar motion is imparted to wheel, c, which, by means of curved slots cut therein, thrusts the studs fastened to arms of pulley outward or inward, thus augmenting or diminishing the size of the pulley."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: PGS
  multiccd: true
  duration_s: 12.0
bodies:
  - id: wheel
    shape: part
    pos: [0, 0, 0]
    mass: 0.3
    friction: 0.1
    color: "#d9cfb6"
    pieces:
      - {kind: poly, points: [[1.75, 0.0], [1.7457, 0.1221], [4.2548, 0.2975], [4.1386, 0.0]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.0614, 0.0], [5.1722, 0.3617], [7.4069, 0.5179], [7.425, 0.0]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.7457, 0.1221], [1.733, 0.2436], [4.3488, 0.6112], [4.2548, 0.2975]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.1722, 0.3617], [5.2566, 0.7388], [7.3527, 1.0334], [7.4069, 0.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.733, 0.2436], [1.7118, 0.3638], [4.4192, 0.9393], [4.3488, 0.6112]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.2566, 0.7388], [5.3132, 1.1294], [7.2627, 1.5437], [7.3527, 1.0334]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.7118, 0.3638], [1.6822, 0.4824], [4.4642, 1.2801], [4.4192, 0.9393]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.3132, 1.1294], [5.3404, 1.5313], [7.1374, 2.0466], [7.2627, 1.5437]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.6822, 0.4824], [1.6445, 0.5985], [4.4826, 1.6315], [4.4642, 1.2801]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.3404, 1.5313], [5.3369, 1.9425], [6.9772, 2.5395], [7.1374, 2.0466]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.6445, 0.5985], [1.5987, 0.7118], [4.473, 1.9915], [4.4826, 1.6315]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.3369, 1.9425], [5.3015, 2.3604], [6.7831, 3.02], [6.9772, 2.5395]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.5987, 0.7118], [1.5452, 0.8216], [4.4345, 2.3579], [4.4731, 1.9915]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.3015, 2.3604], [5.2334, 2.7826], [6.5559, 3.4858], [6.7831, 3.02]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.5452, 0.8216], [1.4841, 0.9274], [4.366, 2.7282], [4.4345, 2.3579]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.2334, 2.7826], [5.1317, 3.2066], [6.2968, 3.9347], [6.5559, 3.4858]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.4841, 0.9274], [1.4158, 1.0286], [4.2669, 3.1001], [4.366, 2.7282]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.1317, 3.2066], [4.9959, 3.6297], [6.007, 4.3643], [6.2968, 3.9347]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.4158, 1.0286], [1.3406, 1.1249], [4.1366, 3.471], [4.2669, 3.1001]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.9959, 3.6297], [4.8256, 4.0491], [5.6879, 4.7727], [6.007, 4.3643]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.3406, 1.1249], [1.2588, 1.2157], [3.9749, 3.8385], [4.1366, 3.471]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.8256, 4.0491], [4.6207, 4.4621], [5.3411, 5.1578], [5.6879, 4.7727]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.2588, 1.2157], [1.171, 1.3005], [1.8724, 2.0795], [1.9198, 1.8539]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.6306, 2.5404], [2.5276, 2.8072], [3.7816, 4.1998], [3.9749, 3.8385]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.6207, 4.4621], [4.3813, 4.8659], [4.9683, 5.5179], [5.3411, 5.1578]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.171, 1.3005], [1.0774, 1.379], [1.8022, 2.3067], [1.8724, 2.0795]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.5276, 2.8072], [2.4001, 3.072], [4.5713, 5.851], [4.9683, 5.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.0774, 1.379], [0.9786, 1.4508], [1.7088, 2.5334], [1.8022, 2.3067]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.4001, 3.072], [2.2478, 3.3325], [4.152, 6.1556], [4.5713, 5.851]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.9786, 1.4508], [0.875, 1.5155], [1.5921, 2.7576], [1.7088, 2.5334]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.2478, 3.3325], [2.0707, 3.5865], [3.7125, 6.4302], [4.152, 6.1556]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.875, 1.5155], [0.7671, 1.5729], [1.4519, 2.9769], [1.5921, 2.7576]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.0707, 3.5865], [1.8689, 3.8318], [3.2549, 6.6735], [3.7125, 6.4302]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.7671, 1.5729], [0.6556, 1.6226], [1.2886, 3.1894], [1.4519, 2.9769]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.8689, 3.8319], [1.6429, 4.0662], [2.7815, 6.8843], [3.2549, 6.6735]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.6556, 1.6226], [0.5408, 1.6643], [1.1024, 3.3927], [1.2886, 3.1894]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.6429, 4.0662], [1.3931, 4.2874], [2.2945, 7.0616], [2.7815, 6.8843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.5408, 1.6643], [0.4234, 1.698], [0.8938, 3.5848], [1.1024, 3.3927]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.3931, 4.2874], [1.1203, 4.4931], [1.7963, 7.2044], [2.2945, 7.0616]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.4234, 1.698], [0.3039, 1.7234], [0.6636, 3.7636], [0.8938, 3.5848]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.1203, 4.4931], [0.8254, 4.6813], [1.2893, 7.3122], [1.7963, 7.2044]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.3039, 1.7234], [0.1829, 1.7404], [0.4127, 3.9269], [0.6636, 3.7636]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.8254, 4.6813], [0.5097, 4.8499], [0.7761, 7.3843], [1.2893, 7.3122]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.1829, 1.7404], [0.0611, 1.7489], [0.1422, 4.0728], [0.4127, 3.9269]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.5097, 4.8499], [0.1745, 4.9967], [0.2591, 7.4205], [0.7761, 7.3843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.0611, 1.7489], [-0.0611, 1.7489], [-0.1466, 4.1993], [0.1422, 4.0728]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.1745, 4.9967], [-0.1788, 5.12], [-0.2591, 7.4205], [0.2591, 7.4205]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.0611, 1.7489], [-0.1829, 1.7404], [-0.4524, 4.3047], [-0.1466, 4.1993]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.1788, 5.12], [-0.5484, 5.2178], [-0.7761, 7.3843], [-0.2591, 7.4205]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.1829, 1.7404], [-0.3039, 1.7234], [-0.7736, 4.3871], [-0.4524, 4.3047]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.5484, 5.2178], [-0.9325, 5.2885], [-1.2893, 7.3122], [-0.7761, 7.3843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.3039, 1.7234], [-0.4234, 1.698], [-1.1083, 4.445], [-0.7736, 4.3871]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.9325, 5.2885], [-1.3291, 5.3305], [-1.7963, 7.2044], [-1.2893, 7.3122]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.4234, 1.698], [-0.5408, 1.6643], [-1.4546, 4.4768], [-1.1083, 4.445]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.3291, 5.3305], [-1.7359, 5.3425], [-2.2945, 7.0616], [-1.7963, 7.2044]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.5408, 1.6643], [-0.6556, 1.6226], [-1.8106, 4.4814], [-1.4546, 4.4768]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.7359, 5.3425], [-2.1507, 5.3232], [-2.7815, 6.8843], [-2.2945, 7.0616]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.6556, 1.6226], [-0.7671, 1.5729], [-2.174, 4.4574], [-1.8106, 4.4814]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.1507, 5.3232], [-2.5711, 5.2716], [-3.2549, 6.6735], [-2.7815, 6.8843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.7671, 1.5729], [-0.875, 1.5155], [-2.5427, 4.404], [-2.174, 4.4575]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.5711, 5.2716], [-2.9946, 5.1868], [-3.7125, 6.4302], [-3.2549, 6.6735]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.875, 1.5155], [-0.9786, 1.4508], [-2.9141, 4.3203], [-2.5427, 4.404]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.9946, 5.1868], [-3.4184, 5.0681], [-4.152, 6.1556], [-3.7125, 6.4302]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.9786, 1.4508], [-1.0774, 1.379], [-3.2858, 4.2057], [-2.9141, 4.3203]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.4184, 5.0681], [-3.84, 4.915], [-4.5713, 5.851], [-4.152, 6.1556]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.0774, 1.379], [-1.171, 1.3005], [-3.6554, 4.0597], [-3.2858, 4.2057]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.84, 4.915], [-4.2566, 4.7275], [-4.9683, 5.5179], [-4.5713, 5.851]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.171, 1.3005], [-1.2588, 1.2157], [-1.9664, 1.8989], [-1.7423, 1.9351]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.4068, 2.673], [-2.6739, 2.5822], [-4.0201, 3.8822], [-3.6554, 4.0597]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.2566, 4.7275], [-4.6654, 4.5053], [-5.3411, 5.1578], [-4.9683, 5.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.2588, 1.2157], [-1.3406, 1.1249], [-2.193, 1.8402], [-1.9664, 1.8989]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.6739, 2.5822], [-2.94, 2.4669], [-5.6879, 4.7727], [-5.3411, 5.1578]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.3406, 1.1249], [-1.4158, 1.0286], [-2.4203, 1.7584], [-2.193, 1.8402]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.94, 2.4669], [-3.2029, 2.327], [-6.007, 4.3643], [-5.6879, 4.7727]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.4158, 1.0286], [-1.4841, 0.9274], [-2.646, 1.6534], [-2.4203, 1.7584]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.2029, 2.327], [-3.4605, 2.1623], [-6.2968, 3.9347], [-6.007, 4.3643]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.4841, 0.9274], [-1.5452, 0.8216], [-2.868, 1.5249], [-2.646, 1.6534]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.4605, 2.1623], [-3.7104, 1.9729], [-6.5559, 3.4858], [-6.2968, 3.9347]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.5452, 0.8216], [-1.5987, 0.7118], [-3.0841, 1.3731], [-2.868, 1.5249]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.7104, 1.9729], [-3.9505, 1.7589], [-6.7831, 3.02], [-6.5559, 3.4858]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.5987, 0.7118], [-1.6445, 0.5985], [-3.2923, 1.1983], [-3.0841, 1.3731]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.9505, 1.7589], [-4.1786, 1.5209], [-6.9772, 2.5395], [-6.7831, 3.02]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.6445, 0.5985], [-1.6822, 0.4824], [-3.4903, 1.0008], [-3.2923, 1.1983]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.1786, 1.5209], [-4.3923, 1.2595], [-7.1374, 2.0466], [-6.9772, 2.5395]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.6822, 0.4824], [-1.7118, 0.3638], [-3.676, 0.7814], [-3.4903, 1.0008]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.3923, 1.2595], [-4.5896, 0.9755], [-7.2627, 1.5437], [-7.1374, 2.0466]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.7118, 0.3638], [-1.733, 0.2436], [-3.8473, 0.5407], [-3.676, 0.7814]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.5896, 0.9755], [-4.7682, 0.6701], [-7.3527, 1.0334], [-7.2627, 1.5437]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.733, 0.2436], [-1.7457, 0.1221], [-4.0021, 0.2799], [-3.8473, 0.5407]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.7682, 0.6701], [-4.9261, 0.3445], [-7.4069, 0.5179], [-7.3527, 1.0334]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.7457, 0.1221], [-1.75, 0.0], [-4.1386, 0.0], [-4.0021, 0.2799]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.9261, 0.3445], [-5.0614, 0.0], [-7.425, 0.0], [-7.4069, 0.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.75, 0.0], [-1.7457, -0.1221], [-4.2548, -0.2975], [-4.1386, 0.0]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.0614, 0.0], [-5.1722, -0.3617], [-7.4069, -0.5179], [-7.425, 0.0]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.7457, -0.1221], [-1.733, -0.2436], [-4.3488, -0.6112], [-4.2548, -0.2975]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.1722, -0.3617], [-5.2566, -0.7388], [-7.3527, -1.0334], [-7.4069, -0.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.733, -0.2436], [-1.7118, -0.3638], [-4.4192, -0.9393], [-4.3488, -0.6112]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.2566, -0.7388], [-5.3132, -1.1294], [-7.2627, -1.5437], [-7.3527, -1.0334]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.7118, -0.3638], [-1.6822, -0.4824], [-4.4642, -1.2801], [-4.4192, -0.9393]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.3132, -1.1294], [-5.3404, -1.5313], [-7.1374, -2.0466], [-7.2627, -1.5437]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.6822, -0.4824], [-1.6445, -0.5985], [-4.4826, -1.6315], [-4.4642, -1.2801]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.3404, -1.5313], [-5.3369, -1.9425], [-6.9772, -2.5395], [-7.1374, -2.0466]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.6445, -0.5985], [-1.5987, -0.7118], [-4.473, -1.9915], [-4.4826, -1.6315]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.3369, -1.9425], [-5.3015, -2.3604], [-6.7831, -3.02], [-6.9772, -2.5395]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.5987, -0.7118], [-1.5452, -0.8216], [-4.4345, -2.3579], [-4.4731, -1.9915]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.3015, -2.3604], [-5.2334, -2.7826], [-6.5559, -3.4858], [-6.7831, -3.02]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.5452, -0.8216], [-1.4841, -0.9274], [-4.366, -2.7282], [-4.4345, -2.3579]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.2334, -2.7826], [-5.1317, -3.2066], [-6.2968, -3.9347], [-6.5559, -3.4858]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.4841, -0.9274], [-1.4158, -1.0286], [-4.2669, -3.1001], [-4.366, -2.7282]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.1317, -3.2066], [-4.9959, -3.6297], [-6.007, -4.3643], [-6.2968, -3.9347]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.4158, -1.0286], [-1.3406, -1.1249], [-4.1366, -3.471], [-4.2669, -3.1001]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.9959, -3.6297], [-4.8256, -4.0491], [-5.6879, -4.7727], [-6.007, -4.3643]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.3406, -1.1249], [-1.2588, -1.2157], [-3.9749, -3.8385], [-4.1366, -3.471]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.8256, -4.0491], [-4.6207, -4.4621], [-5.3411, -5.1578], [-5.6879, -4.7727]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.2588, -1.2157], [-1.171, -1.3005], [-1.8724, -2.0795], [-1.9198, -1.8539]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.6306, -2.5404], [-2.5276, -2.8072], [-3.7816, -4.1998], [-3.9749, -3.8385]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.6207, -4.4621], [-4.3813, -4.8659], [-4.9683, -5.5179], [-5.3411, -5.1578]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.171, -1.3005], [-1.0774, -1.379], [-1.8022, -2.3067], [-1.8724, -2.0795]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.5276, -2.8072], [-2.4001, -3.072], [-4.5713, -5.851], [-4.9683, -5.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.0774, -1.379], [-0.9786, -1.4508], [-1.7088, -2.5334], [-1.8022, -2.3067]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.4001, -3.072], [-2.2478, -3.3325], [-4.152, -6.1556], [-4.5713, -5.851]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.9786, -1.4508], [-0.875, -1.5155], [-1.5921, -2.7576], [-1.7088, -2.5334]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.2478, -3.3325], [-2.0707, -3.5865], [-3.7125, -6.4302], [-4.152, -6.1556]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.875, -1.5155], [-0.7671, -1.5729], [-1.4519, -2.9769], [-1.5921, -2.7576]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.0707, -3.5865], [-1.8689, -3.8318], [-3.2549, -6.6735], [-3.7125, -6.4302]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.7671, -1.5729], [-0.6556, -1.6226], [-1.2886, -3.1894], [-1.4519, -2.9769]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.8689, -3.8319], [-1.6429, -4.0662], [-2.7815, -6.8843], [-3.2549, -6.6735]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.6556, -1.6226], [-0.5408, -1.6643], [-1.1024, -3.3927], [-1.2886, -3.1894]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.6429, -4.0662], [-1.3931, -4.2874], [-2.2945, -7.0616], [-2.7815, -6.8843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.5408, -1.6643], [-0.4234, -1.698], [-0.8938, -3.5848], [-1.1024, -3.3927]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.3931, -4.2874], [-1.1203, -4.4931], [-1.7963, -7.2044], [-2.2945, -7.0616]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.4234, -1.698], [-0.3039, -1.7234], [-0.6636, -3.7636], [-0.8938, -3.5848]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.1203, -4.4931], [-0.8254, -4.6813], [-1.2893, -7.3122], [-1.7963, -7.2044]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.3039, -1.7234], [-0.1829, -1.7404], [-0.4127, -3.9269], [-0.6636, -3.7636]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.8254, -4.6813], [-0.5097, -4.8499], [-0.7761, -7.3843], [-1.2893, -7.3122]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.1829, -1.7404], [-0.0611, -1.7489], [-0.1422, -4.0728], [-0.4127, -3.9269]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.5097, -4.8499], [-0.1745, -4.9967], [-0.2591, -7.4205], [-0.7761, -7.3843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.0611, -1.7489], [0.0611, -1.7489], [0.1466, -4.1993], [-0.1422, -4.0728]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.1745, -4.9967], [0.1788, -5.12], [0.2591, -7.4205], [-0.2591, -7.4205]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.0611, -1.7489], [0.1829, -1.7404], [0.4524, -4.3047], [0.1466, -4.1993]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.1788, -5.12], [0.5484, -5.2178], [0.7761, -7.3843], [0.2591, -7.4205]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.1829, -1.7404], [0.3039, -1.7234], [0.7736, -4.3871], [0.4524, -4.3047]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.5484, -5.2178], [0.9325, -5.2885], [1.2893, -7.3122], [0.7761, -7.3843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.3039, -1.7234], [0.4234, -1.698], [1.1083, -4.445], [0.7736, -4.3871]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.9325, -5.2885], [1.3291, -5.3305], [1.7963, -7.2044], [1.2893, -7.3122]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.4234, -1.698], [0.5408, -1.6643], [1.4546, -4.4768], [1.1083, -4.445]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.3291, -5.3305], [1.7359, -5.3425], [2.2945, -7.0616], [1.7963, -7.2044]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.5408, -1.6643], [0.6556, -1.6226], [1.8106, -4.4814], [1.4546, -4.4768]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.7359, -5.3425], [2.1507, -5.3232], [2.7815, -6.8843], [2.2945, -7.0616]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.6556, -1.6226], [0.7671, -1.5729], [2.174, -4.4574], [1.8106, -4.4814]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.1507, -5.3232], [2.5711, -5.2716], [3.2549, -6.6735], [2.7815, -6.8843]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.7671, -1.5729], [0.875, -1.5155], [2.5427, -4.404], [2.174, -4.4575]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.5711, -5.2716], [2.9946, -5.1868], [3.7125, -6.4302], [3.2549, -6.6735]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.875, -1.5155], [0.9786, -1.4508], [2.9141, -4.3203], [2.5427, -4.404]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.9946, -5.1868], [3.4184, -5.0681], [4.152, -6.1556], [3.7125, -6.4302]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.9786, -1.4508], [1.0774, -1.379], [3.2858, -4.2057], [2.9141, -4.3203]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.4184, -5.0681], [3.84, -4.915], [4.5713, -5.851], [4.152, -6.1556]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.0774, -1.379], [1.171, -1.3005], [3.6554, -4.0597], [3.2858, -4.2057]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.84, -4.915], [4.2566, -4.7275], [4.9683, -5.5179], [4.5713, -5.851]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.171, -1.3005], [1.2588, -1.2157], [1.9664, -1.8989], [1.7423, -1.9351]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.4068, -2.673], [2.6739, -2.5822], [4.0201, -3.8822], [3.6554, -4.0597]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.2566, -4.7275], [4.6654, -4.5053], [5.3411, -5.1578], [4.9683, -5.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.2588, -1.2157], [1.3406, -1.1249], [2.193, -1.8402], [1.9664, -1.8989]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.6739, -2.5822], [2.94, -2.4669], [5.6879, -4.7727], [5.3411, -5.1578]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.3406, -1.1249], [1.4158, -1.0286], [2.4203, -1.7584], [2.193, -1.8402]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.94, -2.4669], [3.2029, -2.327], [6.007, -4.3643], [5.6879, -4.7727]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.4158, -1.0286], [1.4841, -0.9274], [2.646, -1.6534], [2.4203, -1.7584]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.2029, -2.327], [3.4605, -2.1623], [6.2968, -3.9347], [6.007, -4.3643]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.4841, -0.9274], [1.5452, -0.8216], [2.868, -1.5249], [2.646, -1.6534]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.4605, -2.1623], [3.7104, -1.9729], [6.5559, -3.4858], [6.2968, -3.9347]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.5452, -0.8216], [1.5987, -0.7118], [3.0841, -1.3731], [2.868, -1.5249]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.7104, -1.9729], [3.9505, -1.7589], [6.7831, -3.02], [6.5559, -3.4858]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.5987, -0.7118], [1.6445, -0.5985], [3.2923, -1.1983], [3.0841, -1.3731]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.9505, -1.7589], [4.1786, -1.5209], [6.9772, -2.5395], [6.7831, -3.02]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.6445, -0.5985], [1.6822, -0.4824], [3.4903, -1.0008], [3.2923, -1.1983]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.1786, -1.5209], [4.3923, -1.2595], [7.1374, -2.0466], [6.9772, -2.5395]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.6822, -0.4824], [1.7118, -0.3638], [3.676, -0.7814], [3.4903, -1.0008]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.3923, -1.2595], [4.5896, -0.9755], [7.2627, -1.5437], [7.1374, -2.0466]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.7118, -0.3638], [1.733, -0.2436], [3.8473, -0.5407], [3.676, -0.7814]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.5896, -0.9755], [4.7682, -0.6701], [7.3527, -1.0334], [7.2627, -1.5437]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.733, -0.2436], [1.7457, -0.1221], [4.0021, -0.2799], [3.8473, -0.5407]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.7682, -0.6701], [4.9261, -0.3445], [7.4069, -0.5179], [7.3527, -1.0334]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.7457, -0.1221], [1.75, -0.0], [4.1386, -0.0], [4.0021, -0.2799]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.9261, -0.3445], [5.0614, -0.0], [7.425, -0.0], [7.4069, -0.5179]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[7.4885, 0.2299], [7.3895, 1.2355], [8.343, 0.9911], [8.3761, 0.6556]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[7.2998, 1.6864], [7.0065, 2.6534], [7.9894, 2.5997], [8.0872, 2.2771]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[6.8305, 3.0781], [6.3542, 3.9693], [7.3287, 4.1084], [7.4876, 3.8111]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[6.0988, 4.3515], [5.4577, 5.1326], [6.3863, 5.4592], [6.6002, 5.1986]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.1326, 5.4577], [4.3515, 6.0988], [5.1986, 6.6002], [5.4592, 6.3863]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.9693, 6.3542], [3.0781, 6.8305], [3.8111, 7.4876], [4.1084, 7.3287]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[2.6534, 7.0065], [1.6864, 7.2998], [2.2771, 8.0872], [2.5997, 7.9894]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.2355, 7.3895], [0.2299, 7.4885], [0.6556, 8.3761], [0.9911, 8.343]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-0.2299, 7.4885], [-1.2355, 7.3895], [-0.9911, 8.343], [-0.6556, 8.3761]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.6864, 7.2998], [-2.6534, 7.0065], [-2.5997, 7.9894], [-2.2771, 8.0872]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.0781, 6.8305], [-3.9693, 6.3542], [-4.1084, 7.3287], [-3.8111, 7.4876]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-4.3515, 6.0988], [-5.1326, 5.4577], [-5.4592, 6.3863], [-5.1986, 6.6002]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.4577, 5.1326], [-6.0988, 4.3515], [-6.6002, 5.1986], [-6.3863, 5.4592]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-6.3542, 3.9693], [-6.8305, 3.0781], [-7.4876, 3.8111], [-7.3287, 4.1084]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-7.0065, 2.6534], [-7.2998, 1.6864], [-8.0872, 2.2771], [-7.9894, 2.5997]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-7.3895, 1.2355], [-7.4885, 0.2299], [-8.3761, 0.6556], [-8.343, 0.9911]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-7.4885, -0.2299], [-7.3895, -1.2355], [-8.343, -0.9911], [-8.3761, -0.6556]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-7.2998, -1.6864], [-7.0065, -2.6534], [-7.9894, -2.5997], [-8.0872, -2.2771]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-6.8305, -3.0781], [-6.3542, -3.9693], [-7.3287, -4.1084], [-7.4876, -3.8111]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-6.0988, -4.3515], [-5.4577, -5.1326], [-6.3863, -5.4592], [-6.6002, -5.1986]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-5.1326, -5.4577], [-4.3515, -6.0988], [-5.1986, -6.6002], [-5.4592, -6.3863]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-3.9693, -6.3542], [-3.0781, -6.8305], [-3.8111, -7.4876], [-4.1084, -7.3287]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-2.6534, -7.0065], [-1.6864, -7.2998], [-2.2771, -8.0872], [-2.5997, -7.9894]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[-1.2355, -7.3895], [-0.2299, -7.4885], [-0.6556, -8.3761], [-0.9911, -8.343]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[0.2299, -7.4885], [1.2355, -7.3895], [0.9911, -8.343], [0.6556, -8.3761]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[1.6864, -7.2998], [2.6534, -7.0065], [2.5997, -7.9894], [2.2771, -8.0872]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[3.0781, -6.8305], [3.9693, -6.3542], [4.1084, -7.3287], [3.8111, -7.4876]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[4.3515, -6.0988], [5.1326, -5.4577], [5.4592, -6.3863], [5.1986, -6.6002]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[5.4577, -5.1326], [6.0988, -4.3515], [6.6002, -5.1986], [6.3863, -5.4592]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[6.3542, -3.9693], [6.8305, -3.0781], [7.4876, -3.8111], [7.3287, -4.1084]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[7.0065, -2.6534], [7.2998, -1.6864], [8.0872, -2.2771], [7.9894, -2.5997]], y: [-0.5, 0.5], collide: 1}
      - {kind: poly, points: [[7.3895, -1.2355], [7.4885, -0.2299], [8.3761, -0.6556], [8.343, -0.9911]], y: [-0.5, 0.5], collide: 1}
  - id: pinion
    shape: part
    pos: [7.4246, 0, 7.4246]
    mass: 0.4
    friction: 0.1
    color: "#c9b88f"
    pieces:
      - {kind: poly, points: [[5.6708, 6.3853], [6.3853, 5.6708], [5.4932, 5.2548], [5.2548, 5.4932]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[6.6166, 5.553], [7.6147, 5.3949], [7.1375, 4.534], [6.8045, 4.5867]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[7.8711, 5.4355], [8.7714, 5.8943], [8.8914, 4.9172], [8.591, 4.7642]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[8.955, 6.0778], [9.4137, 6.9782], [10.0851, 6.2582], [9.932, 5.9579]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[9.4543, 7.2346], [9.2963, 8.2326], [10.2625, 8.0448], [10.3153, 7.7118]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[9.1784, 8.4639], [8.4639, 9.1784], [9.356, 9.5944], [9.5944, 9.356]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[8.2326, 9.2963], [7.2346, 9.4543], [7.7118, 10.3153], [8.0448, 10.2625]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[6.9782, 9.4137], [6.0778, 8.955], [5.9579, 9.932], [6.2582, 10.0851]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[5.8943, 8.7714], [5.4355, 7.8711], [4.7642, 8.591], [4.9172, 8.8914]], y: [-0.5, 0.5], collide: 2}
      - {kind: poly, points: [[5.3949, 7.6147], [5.553, 6.6166], [4.5867, 6.8045], [4.534, 7.1375]], y: [-0.5, 0.5], collide: 2}
      - {kind: disc, center: [7.4246, 7.4246], radius: 1.955, y: [-0.5, 0.5], collide: 0}
      - {kind: disc, center: [7.4246, 7.4246], radius: 0.45, y: [-1.6, 2.2], collide: 0, color: "#8f8a80"}   # its axle
      - {kind: poly, points: [[7.4246, 7.9746], [6.8746, 7.4246], [7.4246, 6.8746], [7.9746, 7.4246]], y: [-2.2, -1.6], collide: 0, color: "#8f8a80"}   # the square for the key
  - id: arm0
    shape: part
    pos: [4.6, 0, 0.0]
    mass: 0.12
    friction: 0.1
    color: "#b8ad97"
    pieces:
      - {kind: disc, center: [4.6, 0.0], radius: 0.4, y: [-0.7, 0.8], collide: 2, color: "#8f8a80"}   # the stud, in its slot
      - {kind: poly, points: [[4.0, -0.6], [4.0, 0.6], [11.0, 0.6], [11.0, -0.6]], y: [0.75, 1.45], collide: 0}   # the arm, behind the wheel
      - {kind: poly, points: [[10.2714, -3.3374], [10.432, -2.7952], [11.3979, -3.0541], [11.2225, -3.6464]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.432, -2.7952], [10.564, -2.2454], [11.5421, -2.4534], [11.3979, -3.0541]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.564, -2.2454], [10.667, -1.6895], [11.6547, -1.8459], [11.5421, -2.4534]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.667, -1.6895], [10.7408, -1.1289], [11.7354, -1.2334], [11.6547, -1.8459]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.7408, -1.1289], [10.7852, -0.5652], [11.7838, -0.6176], [11.7354, -1.2334]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.7852, -0.5652], [10.8, 0.0], [11.8, 0.0], [11.7838, -0.6176]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.8, 0.0], [10.7852, 0.5652], [11.7838, 0.6176], [11.8, 0.0]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.7852, 0.5652], [10.7408, 1.1289], [11.7354, 1.2334], [11.7838, 0.6176]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.7408, 1.1289], [10.667, 1.6895], [11.6547, 1.8459], [11.7354, 1.2334]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.667, 1.6895], [10.564, 2.2454], [11.5421, 2.4534], [11.6547, 1.8459]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.564, 2.2454], [10.432, 2.7952], [11.3979, 3.0541], [11.5421, 2.4534]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[10.432, 2.7952], [10.2714, 3.3374], [11.2225, 3.6464], [11.3979, 3.0541]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}   # a segment of the pulley's rim
  - id: arm1
    shape: part
    pos: [0.0, 0, 4.6]
    mass: 0.12
    friction: 0.1
    color: "#b8ad97"
    pieces:
      - {kind: disc, center: [0.0, 4.6], radius: 0.4, y: [-0.7, 0.8], collide: 2, color: "#8f8a80"}   # the stud, in its slot
      - {kind: poly, points: [[0.6, 4.0], [-0.6, 4.0], [-0.6, 11.0], [0.6, 11.0]], y: [0.75, 1.45], collide: 0}   # the arm, behind the wheel
      - {kind: poly, points: [[3.3374, 10.2714], [2.7952, 10.432], [3.0541, 11.3979], [3.6464, 11.2225]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[2.7952, 10.432], [2.2454, 10.564], [2.4534, 11.5421], [3.0541, 11.3979]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[2.2454, 10.564], [1.6895, 10.667], [1.8459, 11.6547], [2.4534, 11.5421]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[1.6895, 10.667], [1.1289, 10.7408], [1.2334, 11.7354], [1.8459, 11.6547]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[1.1289, 10.7408], [0.5652, 10.7852], [0.6176, 11.7838], [1.2334, 11.7354]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[0.5652, 10.7852], [0.0, 10.8], [0.0, 11.8], [0.6176, 11.7838]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[0.0, 10.8], [-0.5652, 10.7852], [-0.6176, 11.7838], [0.0, 11.8]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-0.5652, 10.7852], [-1.1289, 10.7408], [-1.2334, 11.7354], [-0.6176, 11.7838]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-1.1289, 10.7408], [-1.6895, 10.667], [-1.8459, 11.6547], [-1.2334, 11.7354]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-1.6895, 10.667], [-2.2454, 10.564], [-2.4534, 11.5421], [-1.8459, 11.6547]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-2.2454, 10.564], [-2.7952, 10.432], [-3.0541, 11.3979], [-2.4534, 11.5421]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-2.7952, 10.432], [-3.3374, 10.2714], [-3.6464, 11.2225], [-3.0541, 11.3979]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}   # a segment of the pulley's rim
  - id: arm2
    shape: part
    pos: [-4.6, 0, 0.0]
    mass: 0.12
    friction: 0.1
    color: "#b8ad97"
    pieces:
      - {kind: disc, center: [-4.6, 0.0], radius: 0.4, y: [-0.7, 0.8], collide: 2, color: "#8f8a80"}   # the stud, in its slot
      - {kind: poly, points: [[-4.0, 0.6], [-4.0, -0.6], [-11.0, -0.6], [-11.0, 0.6]], y: [0.75, 1.45], collide: 0}   # the arm, behind the wheel
      - {kind: poly, points: [[-10.2714, 3.3374], [-10.432, 2.7952], [-11.3979, 3.0541], [-11.2225, 3.6464]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.432, 2.7952], [-10.564, 2.2454], [-11.5421, 2.4534], [-11.3979, 3.0541]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.564, 2.2454], [-10.667, 1.6895], [-11.6547, 1.8459], [-11.5421, 2.4534]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.667, 1.6895], [-10.7408, 1.1289], [-11.7354, 1.2334], [-11.6547, 1.8459]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.7408, 1.1289], [-10.7852, 0.5652], [-11.7838, 0.6176], [-11.7354, 1.2334]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.7852, 0.5652], [-10.8, 0.0], [-11.8, 0.0], [-11.7838, 0.6176]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.8, 0.0], [-10.7852, -0.5652], [-11.7838, -0.6176], [-11.8, 0.0]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.7852, -0.5652], [-10.7408, -1.1289], [-11.7354, -1.2334], [-11.7838, -0.6176]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.7408, -1.1289], [-10.667, -1.6895], [-11.6547, -1.8459], [-11.7354, -1.2334]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.667, -1.6895], [-10.564, -2.2454], [-11.5421, -2.4534], [-11.6547, -1.8459]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.564, -2.2454], [-10.432, -2.7952], [-11.3979, -3.0541], [-11.5421, -2.4534]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-10.432, -2.7952], [-10.2714, -3.3374], [-11.2225, -3.6464], [-11.3979, -3.0541]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}   # a segment of the pulley's rim
  - id: arm3
    shape: part
    pos: [-0.0, 0, -4.6]
    mass: 0.12
    friction: 0.1
    color: "#b8ad97"
    pieces:
      - {kind: disc, center: [-0.0, -4.6], radius: 0.4, y: [-0.7, 0.8], collide: 2, color: "#8f8a80"}   # the stud, in its slot
      - {kind: poly, points: [[-0.6, -4.0], [0.6, -4.0], [0.6, -11.0], [-0.6, -11.0]], y: [0.75, 1.45], collide: 0}   # the arm, behind the wheel
      - {kind: poly, points: [[-3.3374, -10.2714], [-2.7952, -10.432], [-3.0541, -11.3979], [-3.6464, -11.2225]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-2.7952, -10.432], [-2.2454, -10.564], [-2.4534, -11.5421], [-3.0541, -11.3979]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-2.2454, -10.564], [-1.6895, -10.667], [-1.8459, -11.6547], [-2.4534, -11.5421]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-1.6895, -10.667], [-1.1289, -10.7408], [-1.2334, -11.7354], [-1.8459, -11.6547]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-1.1289, -10.7408], [-0.5652, -10.7852], [-0.6176, -11.7838], [-1.2334, -11.7354]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-0.5652, -10.7852], [-0.0, -10.8], [-0.0, -11.8], [-0.6176, -11.7838]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[-0.0, -10.8], [0.5652, -10.7852], [0.6176, -11.7838], [-0.0, -11.8]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[0.5652, -10.7852], [1.1289, -10.7408], [1.2334, -11.7354], [0.6176, -11.7838]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[1.1289, -10.7408], [1.6895, -10.667], [1.8459, -11.6547], [1.2334, -11.7354]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[1.6895, -10.667], [2.2454, -10.564], [2.4534, -11.5421], [1.8459, -11.6547]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[2.2454, -10.564], [2.7952, -10.432], [3.0541, -11.3979], [2.4534, -11.5421]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}
      - {kind: poly, points: [[2.7952, -10.432], [3.3374, -10.2714], [3.6464, -11.2225], [3.0541, -11.3979]], y: [-1.2, 1.45], collide: 0, color: "#a89a7e"}   # a segment of the pulley's rim
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    density: 7800
    color: "#cfc6b4"
    pieces:
      - {kind: disc, center: [0.0, 0.0], radius: 1.6, y: [-0.9, 2.2], collide: 0, color: "#8f8a80"}   # the hub
      - {kind: disc, center: [0.0, 0.0], radius: 2.4, y: [-1.3, -0.6], collide: 0, color: "#8f8a80"}   # the collar keeping c on it
      - {kind: poly, points: [[1.0, -1.0], [1.0, 1.0], [9.6, 1.0], [9.6, -1.0]], y: [1.5, 2.2], collide: 0}
      - {kind: poly, points: [[7.2, -0.62], [7.2, -0.95], [9.4, -0.95], [9.4, -0.62]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[7.2, 0.62], [7.2, 0.95], [9.4, 0.95], [9.4, 0.62]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[1.0, 1.0], [-1.0, 1.0], [-1.0, 9.6], [1.0, 9.6]], y: [1.5, 2.2], collide: 0}
      - {kind: poly, points: [[0.62, 7.2], [0.95, 7.2], [0.95, 9.4], [0.62, 9.4]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[-0.62, 7.2], [-0.95, 7.2], [-0.95, 9.4], [-0.62, 9.4]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[-1.0, 1.0], [-1.0, -1.0], [-9.6, -1.0], [-9.6, 1.0]], y: [1.5, 2.2], collide: 0}
      - {kind: poly, points: [[-7.2, 0.62], [-7.2, 0.95], [-9.4, 0.95], [-9.4, 0.62]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[-7.2, -0.62], [-7.2, -0.95], [-9.4, -0.95], [-9.4, -0.62]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[-1.0, -1.0], [1.0, -1.0], [1.0, -9.6], [-1.0, -9.6]], y: [1.5, 2.2], collide: 0}
      - {kind: poly, points: [[-0.62, -7.2], [-0.95, -7.2], [-0.95, -9.4], [-0.62, -9.4]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[0.62, -7.2], [0.95, -7.2], [0.95, -9.4], [0.62, -9.4]], y: [0.7, 1.5], collide: 0}
      - {kind: poly, points: [[8.3246, 7.4246], [8.204, 7.8746], [7.8746, 8.204], [7.4246, 8.3246], [6.9746, 8.204], [6.6452, 7.8746], [6.5246, 7.4246], [6.6452, 6.9746], [6.9746, 6.6452], [7.4246, 6.5246], [7.8746, 6.6452], [8.204, 6.9746]], y: [1.5, 2.2], collide: 0}   # the pinion's bearing
      - {kind: poly, points: [[-1.0, 0.0], [1.0, 0.0], [8.1246, 6.7246], [6.7246, 8.1246]], y: [1.5, 2.2], collide: 0}
joints:
  - {id: j_d, type: hinge, body: pinion, axis: [0, -1, 0], damping: 0.002}   # the one driven joint; +: counter-clockwise
  - {id: j_c, type: hinge, body: wheel, axis: [0, -1, 0], damping: 0.05, frictionloss: 0.005}   # +: counter-clockwise
  - {id: j_a0, type: slide, body: arm0, axis: [1.0, 0, 0.0], damping: 0.02}   # +: outward
  - {id: j_a1, type: slide, body: arm1, axis: [0.0, 0, 1.0], damping: 0.02}   # +: outward
  - {id: j_a2, type: slide, body: arm2, axis: [-1.0, 0, 0.0], damping: 0.02}   # +: outward
  - {id: j_a3, type: slide, body: arm3, axis: [-0.0, 0, -1.0], damping: 0.02}   # +: outward
contact: {solref: [0.002, 1.0], solimp: [0.95, 0.99, 0.0005], margin: 0}
driver: {joint: j_d, kind: velocity, rpm: 0, swing: {amplitude: 2, hz: 0.1}, kv: 2.0, max_torque: 20}
checks:
  - {type: follow, out: j_c, in: j_d, expect: -0.3125, tol: 0.01, min_r2: 0.995, settle_s: 0.5, window_s: 10}   # c turns the other way, 10/32
  - {type: follow, out: j_a0, in: j_d, expect: 0.005594, tol: 0.000280, min_r2: 0.99, settle_s: 0.5, window_s: 10}   # 0.5594 cm out per radian of d
  - {type: follow, out: j_a1, in: j_a0, expect: 1.0, tol: 0.05, min_r2: 0.98, settle_s: 0.5, window_s: 10}
  - {type: follow, out: j_a2, in: j_a0, expect: 1.0, tol: 0.05, min_r2: 0.98, settle_s: 0.5, window_s: 10}
  - {type: follow, out: j_a3, in: j_a0, expect: 1.0, tol: 0.05, min_r2: 0.98, settle_s: 0.5, window_s: 10}   # the arms together
  - {type: penetration, max: 0.001, settle_s: 0.5}
camera: {target: [0.0, 0, -3.0], position: [6.0, -72.0, 8.0], fov: 34}
display:
  output: j_a0
  labels: {j_d: "Pinion d (driver)", j_c: "Wheel c", j_a0: "Arm, right", j_a1: "Arm, top", j_a2: "Arm, left", j_a3: "Arm, bottom"}
  proof: {label: "Studs and teeth out of contact", sub: "the pinion turns but the pulley keeps its size"}

