main 9823c8c1711d cached
1042 files
49.0 MB
12.9M tokens
13763 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (51,693K chars total). Download the full file to get everything.
Repository: CodeAsCreativeMedium/exercises
Branch: main
Commit: 9823c8c1711d
Files: 1042
Total size: 49.0 MB

Directory structure:
gitextract_2xwy4ck2/

├── 01_graphic_elements/
│   ├── 01_one_with_everything/
│   │   └── one_with_everything_java/
│   │       └── one_with_everything_java.pde
│   ├── 02_quadrilateral_zoo/
│   │   └── quadrilateral_zoo_java/
│   │       └── quadrilateral_zoo_java.pde
│   ├── 03_initials/
│   │   ├── initials_java/
│   │   │   └── initials_java.pde
│   │   ├── initials_javascript/
│   │   │   ├── index.html
│   │   │   ├── libraries/
│   │   │   │   ├── p5.dom.js
│   │   │   │   ├── p5.js
│   │   │   │   └── p5.sound.js
│   │   │   └── sketch.js
│   │   └── initials_python/
│   │       ├── initials_python.pyde
│   │       └── sketch.properties
│   ├── 04_braille_tool/
│   │   └── braille_tool_java/
│   │       └── braille_tool_java.pde
│   ├── 05_mondrian/
│   │   └── mondrian_java/
│   │       └── mondrian_java.pde
│   └── 08_kaleidoscope/
│       └── kaleidoscope_java/
│           └── kaleidoscope_java.pde
├── 02_iteration/
│   ├── 01_simple_iteration_seven_circles/
│   │   ├── simple_iteration_java/
│   │   │   └── simple_iteration_java.pde
│   │   ├── simple_iteration_js/
│   │   │   ├── index.html
│   │   │   ├── simple_iteration_js.js
│   │   │   └── sketch.properties
│   │   └── simple_iteration_python/
│   │       ├── simple_iteration_python.pyde
│   │       └── sketch.properties
│   ├── 02_transitioning_rectangles/
│   │   ├── transitioning_rectangles_java/
│   │   │   └── transitioning_rectangles_java.pde
│   │   ├── transitioning_rectangles_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── transitioning_rectangles_js.js
│   │   └── transitioning_rectangles_python/
│   │       ├── sketch.properties
│   │       └── transitioning_rectangles_python.pyde
│   ├── 03_string_art_challenge/
│   │   ├── string_art_challenge_java/
│   │   │   ├── simple/
│   │   │   │   └── string_art_simple_java.pde
│   │   │   └── string_art_challenge_java.pde
│   │   ├── string_art_challenge_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── string_art_challenge_js.js
│   │   └── string_art_challenge_python/
│   │       ├── sketch.properties
│   │       └── string_art_challenge_python.pyde
│   ├── 04_mini_calendar/
│   │   ├── mini_calendar_java/
│   │   │   ├── mini_calendar_java.pde
│   │   │   └── sketch.properties
│   │   ├── mini_calendar_js/
│   │   │   ├── index.html
│   │   │   ├── mini_calendar_js.js
│   │   │   └── sketch.properties
│   │   └── mini_calendar_python/
│   │       ├── mini_calendar_python.pyde
│   │       └── sketch.properties
│   ├── 05_receding_landscape/
│   │   ├── receding_landscape_java/
│   │   │   ├── receding_landscape_java.pde
│   │   │   └── sketch.properties
│   │   ├── receding_landscape_js/
│   │   │   ├── index.html
│   │   │   ├── receding_landscape_js.js
│   │   │   └── sketch.properties
│   │   └── receding_landscape_python/
│   │       ├── receding_landscape_python.pyde
│   │       └── sketch.properties
│   ├── 06_lines_to_the_cursor/
│   │   ├── lines_to_the_cursor_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── lines_to_the_cursor_java.pde
│   │   ├── lines_to_the_cursor_js/
│   │   │   ├── index.html
│   │   │   ├── lines_to_the_cursor_js.js
│   │   │   └── sketch.properties
│   │   └── lines_to_the_cursor_python/
│   │       ├── lines_to_the_cursor_python.pyde
│   │       └── sketch.properties
│   ├── 07_color_bar_gradient/
│   │   ├── color_bar_gradient_java/
│   │   │   └── color_bar_gradient_java.pde
│   │   ├── color_bar_gradient_js/
│   │   │   ├── color_bar_gradient_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_bar_gradient_python/
│   │       ├── color_bar_gradient_python.pyde
│   │       └── sketch.properties
│   ├── 08_dashed_line/
│   │   ├── dashed_line_java/
│   │   │   ├── dashed_line_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── dashed_line_js/
│   │   │   ├── dashed_line_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── dashed_line_python/
│   │       ├── dashed_line_python.pyde
│   │       └── sketch.properties
│   ├── 09_nested_iteration_checkers/
│   │   ├── checkers_java/
│   │   │   ├── checkers_java.pde
│   │   │   └── sketch.properties
│   │   ├── checkers_js/
│   │   │   ├── checkers_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── checkers_python/
│   │       ├── checkers_python.pyde
│   │       └── sketch.properties
│   ├── 10_iteration_with_functions/
│   │   ├── interaction_with_functions_js/
│   │   │   ├── index.html
│   │   │   ├── interaction_with_functions_js.js
│   │   │   └── sketch.properties
│   │   ├── iteration_with_functions_java/
│   │   │   └── iteration_with_functions_java.pde
│   │   └── iteration_with_functions_python/
│   │       ├── iteration_with_functions_python.pyde
│   │       └── sketch.properties
│   ├── 11_stochastic_elements/
│   │   ├── stochastic_elements_java/
│   │   │   └── stochastic_elements_java.pde
│   │   ├── stochastic_elements_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── stochastic_elements_js.js
│   │   └── stochastic_elements_python/
│   │       ├── sketch.properties
│   │       └── stochastic_elements_python.pyde
│   ├── 12_interrupted_grid/
│   │   ├── interrupted_grid_java/
│   │   │   └── interrupted_grid_java.pde
│   │   ├── interrupted_grid_js/
│   │   │   ├── index.html
│   │   │   ├── interrupted_grid_js.js
│   │   │   └── sketch.properties
│   │   └── interrupted_grid_python/
│   │       ├── grid_with_randomness_python.pyde
│   │       └── sketch.properties
│   ├── 13_geometric_progression/
│   │   ├── geometric_progression_java/
│   │   │   ├── geometric_progression_java.pde
│   │   │   └── sketch.properties
│   │   ├── geometric_progression_js/
│   │   │   ├── geometric_progression_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── geometric_progression_python/
│   │       ├── geometric_progression_python.pyde
│   │       └── sketch.properties
│   ├── 14_moire_patterns/
│   │   ├── moire_java/
│   │   │   └── moire_java.pde
│   │   ├── moire_js/
│   │   │   ├── index.html
│   │   │   ├── moire_js.js
│   │   │   └── sketch.properties
│   │   └── moire_python/
│   │       ├── moire_python.pyde
│   │       └── sketch.properties
│   ├── 15_recoding_schotter/
│   │   ├── schotter_java/
│   │   │   └── schotter_java.pde
│   │   ├── schotter_js/
│   │   │   ├── index.html
│   │   │   ├── schotter_js.js
│   │   │   └── sketch.properties
│   │   └── schotter_python/
│   │       ├── schotter_python.pyde
│   │       └── sketch.properties
│   └── 16_hexagonal_grid/
│       ├── hexagonal_grid_java/
│       │   └── hexagonal_grid_java.pde
│       ├── hexagonal_grid_js/
│       │   ├── hexagonal_grid_js.js
│       │   ├── index.html
│       │   └── sketch.properties
│       └── hexagonal_grid_python/
│           └── hexagonal_grid_python.pyde
├── 03_color/
│   ├── 02_overlapping_color/
│   │   ├── overlapping_color_java/
│   │   │   └── overlapping_color_java.pde
│   │   ├── overlapping_color_js/
│   │   │   ├── index.html
│   │   │   ├── overlapping_color_js.js
│   │   │   └── sketch.properties
│   │   └── overlapping_python/
│   │       ├── overlapping_python.pyde
│   │       └── sketch.properties
│   ├── 03_constructing_a_gradient/
│   │   ├── constructing_a_gradient_java/
│   │   │   ├── constructing_a_gradient_java.pde
│   │   │   └── sketch.properties
│   │   ├── constructing_a_gradient_js/
│   │   │   ├── constructing_a_gradient_js.js
│   │   │   └── index.html
│   │   └── constructing_a_gradient_python/
│   │       ├── constructing_a_gradient_python.pyde
│   │       └── sketch.properties
│   ├── 04_color_wheel/
│   │   ├── color_wheel_java/
│   │   │   └── color_wheel_java.pde
│   │   ├── color_wheel_js/
│   │   │   ├── color_wheel_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_wheel_python/
│   │       ├── color_wheel_python.pyde
│   │       └── sketch.properties
│   ├── 05_threshold_of_perception/
│   │   ├── threshold_of_perception_java/
│   │   │   ├── sketch.properties
│   │   │   └── threshold_of_perception_java.pde
│   │   ├── threshold_of_perception_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── threshold_of_perception_js.js
│   │   └── threshold_of_perception_python/
│   │       ├── sketch.properties
│   │       └── threshold_of_perception_python.pyde
│   ├── 06_interactive_complement/
│   │   ├── interactive_complement_java/
│   │   │   ├── interactive_complement_java.pde
│   │   │   └── sketch.properties
│   │   ├── interactive_complement_js/
│   │   │   ├── index.html
│   │   │   ├── interactive_complement_js.js
│   │   │   └── sketch.properties
│   │   └── interactive_complement_python/
│   │       ├── interactive_complement.pyde
│   │       └── sketch.properties
│   ├── 07_accented_palette/
│   │   ├── accented_palette_java/
│   │   │   └── accented_palette_java.pde
│   │   ├── accented_palette_js/
│   │   │   ├── accented_palette_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── accented_palette_python/
│   │       ├── accented_palette_python.pyde
│   │       └── sketch.properties
│   ├── 08_split_complements/
│   │   ├── split_complementary_java/
│   │   │   └── split_complementary_java.pde
│   │   ├── split_complementary_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── split_complementary_js.js
│   │   └── split_complementary_python/
│   │       ├── sketch.properties
│   │       └── split_complementary_python.pyde
│   ├── 09_albers_color_relativity_1/
│   │   ├── color_relativity_1_java/
│   │   │   └── color_relativity_1_java.pde
│   │   ├── color_relativity_1_js/
│   │   │   ├── color_relativity_1_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_relativity_1_python/
│   │       ├── color_relativity_1_python.pyde
│   │       └── sketch.properties
│   ├── 10_albers_color_relativity_2/
│   │   ├── color_relativity_2_java/
│   │   │   └── color_relativity_2_java.pde
│   │   ├── color_relativity_2_js/
│   │   │   ├── color_relativity_2_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_relativity_2_python/
│   │       ├── color_relativity_2_python.pyde
│   │       └── sketch.properties
│   ├── 11_color_inspector/
│   │   ├── color_inspector_java/
│   │   │   └── color_inspector_java.pde
│   │   ├── color_inspector_js/
│   │   │   ├── color_inspector_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_inspector_python/
│   │       ├── color_inspector_python.pyde
│   │       └── sketch.properties
│   ├── 12_color_survey/
│   │   ├── color_survey_alternate/
│   │   │   ├── color_mixer_java/
│   │   │   │   ├── color_mixer_java.pde
│   │   │   │   └── data/
│   │   │   │       └── CenturySchoolbook-60.vlw
│   │   │   └── color_mixer_python/
│   │   │       ├── color_mixer_python.pyde
│   │   │       ├── data/
│   │   │       │   └── CenturySchoolbook-60.vlw
│   │   │       └── sketch.properties
│   │   ├── color_survey_app_js/
│   │   │   ├── package.json
│   │   │   ├── server.js
│   │   │   └── sketches/
│   │   │       ├── index.html
│   │   │       ├── survey/
│   │   │       │   ├── index.html
│   │   │       │   └── sketch.js
│   │   │       └── viewer/
│   │   │           ├── index.html
│   │   │           └── sketch.js
│   │   ├── color_survey_java/
│   │   │   ├── color_survey_java.pde
│   │   │   └── survey_result.csv
│   │   ├── color_survey_py/
│   │   │   ├── color_survey_py.pyde
│   │   │   ├── sketch.properties
│   │   │   └── survey_result.csv
│   │   ├── color_survey_viewer_java/
│   │   │   └── color_survey_viewer_java.pde
│   │   └── color_survey_viewer_py/
│   │       ├── color_survey_viewer_py.pyde
│   │       └── sketch.properties
│   └── 13_palette_from_photo/
│       ├── palette_from_book_java/
│       │   └── palette_from_book_java.pde
│       ├── palette_from_book_js/
│       │   ├── index.html
│       │   ├── palette_from_book_js.js
│       │   └── sketch.properties
│       ├── palette_from_book_python/
│       │   ├── palette_from_book_python.pyde
│       │   └── sketch.properties
│       ├── palette_v2_java/
│       │   └── palette_v2_java.pde
│       ├── palette_v2_py3/
│       │   └── palette_v2.py
│       └── palette_v2_pyde/
│           ├── palette_v2_pyde.pyde
│           └── sketch.properties
├── 04_conditional_testing/
│   ├── 01_left_or_right/
│   │   └── left_or_right_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── left_or_right_java.pde
│   ├── 02_billiard_ball/
│   │   └── billiard_ball_java/
│   │       └── billiard_ball_java.pde
│   ├── 03_one_person_pong/
│   │   └── one_person_pong_java/
│   │       └── one_person_pong_java.pde
│   ├── 04_choose_your_own_adventure/
│   │   └── 04_choose_your_own_adventure_java/
│   │       ├── choose_your_own_adventure_java.pde
│   │       └── data/
│   │           └── CenturySchoolbook-60.vlw
│   ├── 05_state_machine_1/
│   │   └── state_machine_1_java/
│   │       └── state_machine_1_java.pde
│   ├── 06_state_machine_2/
│   │   └── state_machine_2_java/
│   │       └── state_machine_2_java.pde
│   ├── 07_state_machine_3/
│   │   └── state_machine_3_java/
│   │       └── state_machine_3_java.pde
│   └── 08_state_machine_4/
│       └── state_machine_4_java/
│           └── state_machine_4_java.pde
├── 05_unpredictability/
│   ├── 01_coin_toss/
│   │   ├── coin_toss_book/
│   │   │   └── coin_toss_book.pde
│   │   ├── coin_toss_java/
│   │   │   └── coin_toss_java.pde
│   │   ├── coin_toss_javascript/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── coin_toss_python/
│   │       ├── coin_toss_python.pyde
│   │       └── sketch.properties
│   ├── 02_roll_the_dice/
│   │   ├── dice_roll_book/
│   │   │   └── dice_roll_book.pde
│   │   ├── dice_roll_java/
│   │   │   └── dice_roll_java.pde
│   │   ├── dice_roll_javascript/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── dice_roll_python/
│   │       ├── dice_roll_python.pyde
│   │       └── sketch.properties
│   ├── 03_exquisite_corpse_machine/
│   │   ├── exquisite_corpse_book/
│   │   │   └── exquisite_corpse_book.pde
│   │   ├── exquisite_corpse_java/
│   │   │   └── exquisite_corpse_java.pde
│   │   └── exquisite_corpse_python/
│   │       ├── exquisite_corpse_python.pyde
│   │       └── sketch.properties
│   ├── 04_intermittent_events/
│   │   └── intermittent_events_java/
│   │       └── intermittent_events_java.pde
│   ├── 05_order_to_chaos/
│   │   └── order_to_chaos_java/
│   │       └── order_to_chaos_java.pde
│   ├── 06_drunk_walk_1_brownian_motion/
│   │   └── brownian_motion_java/
│   │       └── brownian_motion_java.pde
│   ├── 07_drunk_walk_2_random_lattice_walk/
│   │   └── lattice_random_walk_javascript/
│   │       ├── index.html
│   │       └── sketch.js
│   ├── 08_drunk_walk_3_smoothed_noise/
│   │   └── smoothed_noise_java/
│   │       └── smoothed_noise_java.pde
│   ├── 09_ten_print/
│   │   └── ten_print_java/
│   │       └── ten_print_java.pde
│   ├── 10_duotone_truchet_tile_java/
│   │   └── duotone_truchet_tile_java/
│   │       └── duotone_truchet_tile_java.pde
│   ├── 11_hitomezashi_sashiko_stitching/
│   │   └── hitomezashi_sashiko_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── hitomezashi_sashiko_java.pde
│   ├── 12_noise_mountains/
│   │   ├── noise_mountains_java/
│   │   │   └── noise_mountains_java.pde
│   │   └── noise_mountains_js/
│   │       ├── index.html
│   │       └── sketch.js
│   └── 13_imaginary_islands/
│       └── imaginary_islands_java/
│           └── imaginary_islands_java.pde
├── 06_arrays/
│   ├── 01_living_line_1/
│   │   ├── living_line_java/
│   │   │   └── living_line_java.pde
│   │   ├── living_line_js/
│   │   │   ├── index.html
│   │   │   ├── living_line_js.js
│   │   │   └── sketch.properties
│   │   └── living_line_python/
│   │       ├── living_line_python.pyde
│   │       └── sketch.properties
│   ├── 02_living_line_2/
│   │   ├── living_line_2_java/
│   │   │   └── living_line_2_java.pde
│   │   ├── living_line_2_js/
│   │   │   ├── index.html
│   │   │   ├── living_line_2_js.js
│   │   │   └── sketch.properties
│   │   └── living_line_2_python/
│   │       ├── living_line_2_python.pyde
│   │       └── sketch.properties
│   ├── 03_living_line_3/
│   │   ├── living_line_3_java/
│   │   │   └── living_line_3_java.pde
│   │   ├── living_line_3_js/
│   │   │   ├── index.html
│   │   │   ├── living_line_3_js.js
│   │   │   └── sketch.properties
│   │   └── living_line_3_python/
│   │       ├── living_line_3_python.pyde
│   │       └── sketch.properties
│   ├── 04_calligraphic_polyline/
│   │   ├── calligraphic_polyline_java/
│   │   │   └── calligraphic_polyline_java.pde
│   │   ├── calligraphic_polyline_js/
│   │   │   ├── calligraphic_polyline_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── calligraphic_polyline_python/
│   │       ├── calligraphic_polyline_python.pyde
│   │       └── sketch.properties
│   ├── 05_animated_walk_cycle/
│   │   ├── animated_walk_cycle_java/
│   │   │   └── animated_walk_cycle_java.pde
│   │   ├── animated_walk_cycle_js/
│   │   │   ├── animated_walk_cycle_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── animated_walk_cycle_python/
│   │       ├── animated_walk_cycle_python.pyde
│   │       └── sketch.properties
│   ├── 06_plant_the_flag/
│   │   ├── plant_the_flag_java/
│   │   │   └── plant_the_flag_java.pde
│   │   ├── plant_the_flag_js/
│   │   │   ├── index.html
│   │   │   ├── plant_the_flag_js.js
│   │   │   └── sketch.properties
│   │   └── plant_the_flag_python/
│   │       └── plant_the_flag_python.pyde
│   ├── 07_longest_line/
│   │   ├── longest_line_java/
│   │   │   └── longest_line_java.pde
│   │   ├── longest_line_js/
│   │   │   ├── index.html
│   │   │   ├── longest_line_js.js
│   │   │   └── sketch.properties
│   │   └── longest_line_python/
│   │       ├── longest_line_python.pyde
│   │       └── sketch.properties
│   └── 08_reordering_rectangles/
│       ├── reordering_rectangles_java/
│       │   ├── Rectangle.pde
│       │   └── reordering_rectangles_java.pde
│       ├── reordering_rectangles_js/
│       │   ├── index.html
│       │   ├── reordering_rectangles_js.js
│       │   └── sketch.properties
│       └── reordering_rectangles_python/
│           ├── reordering_rectangles_python.pyde
│           └── sketch.properties
├── 07_time_and_interactivity/
│   ├── 01_eyes_following_cursor/
│   │   ├── eyes_following_cursor_java/
│   │   │   └── eyes_following_cursor_java.pde
│   │   ├── eyes_following_cursor_js/
│   │   │   ├── eyes_following_cursor_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── eyes_following_cursor_python/
│   │       ├── eyes_following_cursor_python.pyde
│   │       └── sketch.properties
│   ├── 02_fuse_or_progress_bar/
│   │   └── fuse_or_progress_bar_java/
│   │       └── fuse_or_progress_bar_java.pde
│   ├── 03_ripples_in_a_pond/
│   │   ├── ripples_in_a_pond_java/
│   │   │   └── ripples_in_a_pond_java.pde
│   │   ├── ripples_in_a_pond_js/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── ripples_in_a_pond_js.js
│   │   │   └── style.css
│   │   └── ripples_in_a_pond_python/
│   │       ├── ripples_in_a_pond_python.pyde
│   │       └── sketch.properties
│   ├── 04_rain_catcher/
│   │   └── rain_catcher_java/
│   │       ├── Catcher.pde
│   │       ├── Drop.pde
│   │       ├── Timer.pde
│   │       └── rain_catcher_java.pde
│   ├── 05_abstract_typewriter/
│   │   └── abstract_typewriter_java/
│   │       └── abstract_typewriter_java.pde
│   ├── 06_easing_filtering_a_variable/
│   │   ├── easing_java/
│   │   │   └── easing_java.pde
│   │   ├── easing_javascript/
│   │   │   ├── index.html
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── easing_python/
│   │       ├── easing_python.pyde
│   │       └── sketch.properties
│   ├── 07_smoothing/
│   │   ├── smoothing_java/
│   │   │   └── smoothing_java.pde
│   │   ├── smoothing_javascript/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── smoothing_python/
│   │       ├── sketch.properties
│   │       └── smoothing_python.pyde
│   └── 08_audio_sensitive/
│       └── audio_sensitive_java/
│           └── audio_sensitive_java.pde
├── 08_typography/
│   ├── 01_ransom_letter/
│   │   ├── ransom_letter_java/
│   │   │   └── ransom_letter_java.pde
│   │   ├── ransom_letter_js/
│   │   │   ├── index.html
│   │   │   ├── ransom_letter_js.js
│   │   │   └── sketch.properties
│   │   └── ransom_letter_python/
│   │       ├── ransom_letter_python.pyde
│   │       └── sketch.properties
│   ├── 02_one_line_typewriter/
│   │   ├── one_line_typewriter_java/
│   │   │   └── one_line_typewriter_java.pde
│   │   ├── one_line_typewriter_js/
│   │   │   ├── index.html
│   │   │   ├── one_line_typewriter_js.js
│   │   │   └── sketch.properties
│   │   └── one_line_typewriter_python/
│   │       ├── one_line_typewriter_python.pyde
│   │       └── sketch.properties
│   ├── 03_dynamic_text/
│   │   ├── dynamic_text_java/
│   │   │   └── dynamic_text_java.pde
│   │   ├── dynamic_text_js/
│   │   │   ├── dynamic_text_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── dynamic_text_python/
│   │       ├── dynamic_text_python.pyde
│   │       └── sketch.properties
│   ├── 04_responsive_text/
│   │   ├── responsive_text_java/
│   │   │   └── responsive_text_java.pde
│   │   ├── responsive_text_js/
│   │   │   ├── index.html
│   │   │   ├── responsive_text_js.js
│   │   │   └── sketch.properties
│   │   └── responsive_text_python/
│   │       ├── responsive_text_python.pyde
│   │       └── sketch.properties
│   ├── 05_scrolling_headlines/
│   │   ├── scrolling_headlines_java/
│   │   │   └── scrolling_headlines_java.pde
│   │   ├── scrolling_headlines_js/
│   │   │   ├── index.html
│   │   │   ├── scrolling_headlines_js.js
│   │   │   └── sketch.properties
│   │   └── scrolling_headlines_python/
│   │       ├── scrolling_headlines_python.pyde
│   │       └── sketch.properties
│   ├── 06_split_flap_type/
│   │   ├── split_flap_type_java/
│   │   │   └── split_flap_type_java.pde
│   │   ├── split_flap_type_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── split_flap_type_js.js
│   │   └── split_flap_type_python/
│   │       ├── sketch.properties
│   │       └── split_flap_type_python.pyde
│   ├── 07_word_finder/
│   │   ├── word_finder_java/
│   │   │   └── word_finder_java.pde
│   │   ├── word_finder_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── word_finder_js.js
│   │   └── word_finder_python/
│   │       ├── sketch.properties
│   │       └── word_finder_python.pyde
│   ├── 08_letterform_collage_tool/
│   │   ├── letterform_collage_tool_java/
│   │   │   └── letterform_collage_tool_java.pde
│   │   ├── letterform_collage_tool_js/
│   │   │   ├── index.html
│   │   │   ├── letterform_collage_tool_js.js
│   │   │   └── sketch.properties
│   │   └── letterform_collage_tool_python/
│   │       ├── letterform_collage_tool_python.pyde
│   │       └── sketch.properties
│   ├── 09_procrustean_typography/
│   │   ├── procrustean_typography_java/
│   │   │   └── procrustean_typography_java.pde
│   │   ├── procrustean_typography_js/
│   │   │   ├── index.html
│   │   │   ├── procrustean_typography_js.js
│   │   │   └── sketch.properties
│   │   └── procrustean_typography_python/
│   │       ├── procrustean_typography_python.pyde
│   │       └── sketch.properties
│   ├── 10_text_along_a_curve/
│   │   ├── text_along_a_curve_java/
│   │   │   └── text_along_a_curve_java.pde
│   │   ├── text_along_a_curve_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── text_along_a_curve_js.js
│   │   └── text_along_a_curve_python/
│   │       ├── sketch.properties
│   │       └── text_along_a_curve_python.pyde
│   ├── 11_glyph_hacking/
│   │   ├── glyph_hacking_java/
│   │   │   └── glyph_hacking_java.pde
│   │   ├── glyph_hacking_js/
│   │   │   ├── glyph_hacking_js.js
│   │   │   ├── index.html
│   │   │   ├── libraries/
│   │   │   │   ├── rune.js
│   │   │   │   └── rune.js-1.1.8/
│   │   │   │       ├── src/
│   │   │   │       │   ├── anchor.js
│   │   │   │       │   ├── bezier.js
│   │   │   │       │   ├── color.js
│   │   │   │       │   ├── events.js
│   │   │   │       │   ├── grid.js
│   │   │   │       │   ├── group.js
│   │   │   │       │   ├── mixins/
│   │   │   │       │   │   ├── box.js
│   │   │   │       │   │   ├── parent.js
│   │   │   │       │   │   ├── shape.js
│   │   │   │       │   │   └── styles.js
│   │   │   │       │   ├── node.js
│   │   │   │       │   ├── rune.js
│   │   │   │       │   ├── shapes/
│   │   │   │       │   │   ├── circle.js
│   │   │   │       │   │   ├── ellipse.js
│   │   │   │       │   │   ├── image.js
│   │   │   │       │   │   ├── line.js
│   │   │   │       │   │   ├── path.js
│   │   │   │       │   │   ├── polygon.js
│   │   │   │       │   │   ├── rectangle.js
│   │   │   │       │   │   ├── text.js
│   │   │   │       │   │   └── triangle.js
│   │   │   │       │   ├── utils.js
│   │   │   │       │   └── vector.js
│   │   │   │       └── test/
│   │   │   │           ├── both/
│   │   │   │           │   ├── anchor.js
│   │   │   │           │   ├── color.js
│   │   │   │           │   ├── grid.js
│   │   │   │           │   ├── group.js
│   │   │   │           │   ├── mixins/
│   │   │   │           │   │   ├── box.js
│   │   │   │           │   │   ├── shape.js
│   │   │   │           │   │   └── styles.js
│   │   │   │           │   ├── rendering.js
│   │   │   │           │   ├── rune.js
│   │   │   │           │   ├── shapes/
│   │   │   │           │   │   ├── circle.js
│   │   │   │           │   │   ├── ellipse.js
│   │   │   │           │   │   ├── image.js
│   │   │   │           │   │   ├── line.js
│   │   │   │           │   │   ├── path.js
│   │   │   │           │   │   ├── polygon.js
│   │   │   │           │   │   ├── rect.js
│   │   │   │           │   │   ├── text.js
│   │   │   │           │   │   └── triangle.js
│   │   │   │           │   ├── utils.js
│   │   │   │           │   └── vector.js
│   │   │   │           ├── browser/
│   │   │   │           │   └── rune.js
│   │   │   │           ├── helpers.js
│   │   │   │           ├── matchers.js
│   │   │   │           └── node/
│   │   │   │               └── rune.js
│   │   │   └── sketch.properties
│   │   └── glyph_hacking_python/
│   │       ├── glyph_hacking_python.pyde
│   │       └── sketch.properties
│   ├── 12_tiny_word_processor/
│   │   ├── tiny_word_processor_java/
│   │   │   └── tiny_word_processor_java.pde
│   │   ├── tiny_word_processor_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── tiny_word_processor_js.js
│   │   └── tiny_word_processor_python/
│   │       ├── sketch.properties
│   │       └── tiny_word_processor_python.pyde
│   └── 13_ascii_vision/
│       ├── ascii_vision_java/
│       │   └── ascii_vision_java.pde
│       ├── ascii_vision_js/
│       │   ├── ascii_vision_js.js
│       │   ├── index.html
│       │   └── sketch.properties
│       └── ascii_vision_python/
│           ├── ascii_vision_python.pyde
│           └── sketch.properties
├── 09_curves/
│   ├── 01_butt_generator/
│   │   ├── butt_generator_java/
│   │   │   ├── butt.tif
│   │   │   └── butt_generator_java.pde
│   │   ├── butt_generator_js/
│   │   │   ├── butt_generator_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── buttgenerator_python/
│   │       ├── buttgenerator_python.pyde
│   │       └── sketch.properties
│   ├── 02_parabola/
│   │   ├── parabola_java/
│   │   │   └── parabola_java.pde
│   │   ├── parabola_js/
│   │   │   ├── index.html
│   │   │   ├── parabola_js.js
│   │   │   └── sketch.properties
│   │   └── parabola_python/
│   │       ├── parabola_python.pyde
│   │       └── sketch.properties
│   ├── 03_one_circle_three_ways/
│   │   ├── circle_java/
│   │   │   └── circle_java.pde
│   │   ├── circle_js/
│   │   │   ├── circle_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── circle_python/
│   │       ├── circle_python.pyde
│   │       └── sketch.properties
│   ├── 04_continuity_of_bezier_curves/
│   │   ├── bezier_java/
│   │   │   └── bezier_java.pde
│   │   ├── bezier_js/
│   │   │   ├── bezier_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── bezier_python/
│   │       ├── bezier_python.pyde
│   │       └── sketch.properties
│   ├── 05_phyllotaxis/
│   │   ├── phyllotaxis_java/
│   │   │   └── phyllotaxis_java.pde
│   │   ├── phyllotaxis_js/
│   │   │   ├── index.html
│   │   │   ├── phyllotaxis_js.js
│   │   │   └── sketch.properties
│   │   └── phyllotaxis_python/
│   │       ├── phyllotaxis_python.pyde
│   │       └── sketch.properties
│   ├── 06_lissajous/
│   │   ├── lissajous_java/
│   │   │   └── lissajous_java.pde
│   │   ├── lissajous_js/
│   │   │   ├── index.html
│   │   │   ├── lissajous_js.js
│   │   │   └── sketch.properties
│   │   └── lissajous_python/
│   │       ├── lissajous_python.pyde
│   │       └── sketch.properties
│   ├── 07_spiral/
│   │   ├── spiral_java/
│   │   │   ├── screen-0042.tif
│   │   │   ├── spiral.tif
│   │   │   └── spiral_java.pde
│   │   ├── spiral_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── spiral_js.js
│   │   └── spiral_python/
│   │       ├── sketch.properties
│   │       └── spiral_python.pyde
│   ├── 08_polar_curve/
│   │   ├── polar_curve.tif
│   │   ├── polar_curve_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   └── polar_curve_java.pde
│   │   ├── polar_curve_js/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── index.html
│   │   │   ├── polar_curve_js.js
│   │   │   └── sketch.properties
│   │   └── polar_curve_python/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       ├── polar_curve_python.pyde
│   │       └── sketch.properties
│   ├── 09_fourier_synthesis/
│   │   ├── fourier_synthesis_java/
│   │   │   └── fourier_synthesis_java.pde
│   │   ├── fourier_synthesis_js/
│   │   │   ├── fourier_synthesis_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── fourier_synthesis_python/
│   │       ├── fourier_synthesis_python.pyde
│   │       └── sketch.properties
│   ├── 10_osculating_circle/
│   │   ├── osculating_circle_java/
│   │   │   └── osculating_circle_java.pde
│   │   ├── osculating_circle_python/
│   │   │   ├── osculating_circle_python.pyde
│   │   │   └── sketch.properties
│   │   └── osculating_js/
│   │       ├── index.html
│   │       ├── osculating_js.js
│   │       └── sketch.properties
│   ├── 11_circle_morphing/
│   │   ├── circle_to_triangle_java/
│   │   │   └── circle_to_triangle_java.pde
│   │   ├── circle_to_triangle_js/
│   │   │   ├── circle_to_triangle_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── circle_to_triangle_python/
│   │       ├── circle_to_triangle_python.pyde
│   │       └── sketch.properties
│   └── 12_shaping_functions/
│       ├── shaping_functions_java/
│       │   └── shaping_functions_java.pde
│       ├── shaping_functions_js/
│       │   ├── index.html
│       │   ├── shaping_functions_js.js
│       │   └── sketch.properties
│       └── shaping_functions_python/
│           ├── shaping_functions_python.pyde
│           └── sketch.properties
├── 10_shapes/
│   ├── 01_make_a_star/
│   │   ├── make_a_star_java/
│   │   │   └── make_a_star_java.pde
│   │   ├── make_a_star_js/
│   │   │   ├── index.html
│   │   │   ├── make_a_star_js.js
│   │   │   └── sketch.properties
│   │   └── make_a_star_python/
│   │       ├── make_a_star_python.pyde
│   │       └── sketch.properties
│   ├── 02_random_splat/
│   │   ├── random_splat_java/
│   │   │   └── random_splat_java.pde
│   │   ├── random_splat_js/
│   │   │   ├── index.html
│   │   │   ├── random_splat_js.js
│   │   │   └── sketch.properties
│   │   └── random_splat_python/
│   │       ├── random_splat_python.pyde
│   │       └── sketch.properties
│   ├── 03_connect_the_dots/
│   │   ├── connect_the_dots_java/
│   │   │   └── connect_the_dots_java.pde
│   │   ├── connect_the_dots_js/
│   │   │   ├── connect_the_dots_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── connect_the_dots_python/
│   │       ├── connect_the_dots_python.pyde
│   │       └── sketch.properties
│   ├── 04_axis_aligned_bounding_box/
│   │   ├── bounding_box_java/
│   │   │   └── bounding_box_java.pde
│   │   ├── bounding_box_js/
│   │   │   ├── bounding_box_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── bounding_box_python/
│   │       ├── bounding_box_python.pyde
│   │       └── sketch.properties
│   ├── 05_computing_the_centroid/
│   │   ├── centroid_java/
│   │   │   └── centroid_java.pde
│   │   ├── centroid_js/
│   │   │   ├── centroid_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── centroid_python/
│   │       ├── centroid_python.pyde
│   │       └── sketch.properties
│   ├── 06_computing_the_perimeter/
│   │   ├── perimeter_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── perimeter_java.pde
│   │   ├── perimeter_js/
│   │   │   ├── index.html
│   │   │   ├── perimeter_js.js
│   │   │   └── sketch.properties
│   │   └── perimeter_python/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── perimeter_python.pyde
│   │       └── sketch.properties
│   ├── 07_computing_the_area/
│   │   ├── area_java/
│   │   │   ├── area_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── area_js/
│   │   │   ├── area_js.js
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── area_python/
│   │       ├── area_python.pyde
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 08_shape_metrics_compactness/
│   │   ├── compactness_java/
│   │   │   ├── compactness_java.pde
│   │   │   └── data/
│   │   │       ├── CenturySchoolbook-106.vlw
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── compactness_js/
│   │   │   ├── compactness_js.js
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-106.vlw
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── compactness_python/
│   │       ├── compactness_python.pyde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-106.vlw
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 09_detecting_high_curvature/
│   │   ├── high_curvature_java/
│   │   │   └── high_curvature_java.pde
│   │   ├── high_curvature_js/
│   │   │   ├── high_curvature_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── high_curvature_python/
│   │       ├── high_curvature_python.pyde
│   │       └── sketch.properties
│   ├── 10_hand_drawn_graphics_library/
│   │   ├── hand_drawn_java/
│   │   │   ├── EllipseHand.pde
│   │   │   ├── LineHand.pde
│   │   │   ├── RectHand.pde
│   │   │   └── hand_drawn_java.pde
│   │   ├── hand_drawn_js/
│   │   │   ├── hand_drawn_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── hand_drawn_python/
│   │       ├── hand_drawn_python.pyde
│   │       └── sketch.properties
│   └── 11_blob/
│       ├── blob_java/
│       │   ├── Blob.pde
│       │   └── blob_java.pde
│       ├── blob_js/
│       │   ├── blob_js.js
│       │   ├── index.html
│       │   └── sketch.properties
│       └── blob_python/
│           ├── blob_python.pyde
│           └── sketch.properties
├── 11_geometry/
│   ├── 01_midpoint_of_a_line_segment/
│   │   ├── midpoint_of_a_line_segment_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   └── midpoint_of_a_line_segment_java.pde
│   │   ├── midpoint_of_a_line_segment_js/
│   │   │   ├── index.html
│   │   │   ├── midpoint_of_a_line_segment_js.js
│   │   │   └── sketch.properties
│   │   └── midpoint_of_a_line_segment_python/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       ├── midpoint_of_a_line_segment_python.pyde
│   │       └── sketch.properties
│   ├── 02_intersection_of_two_rectangles/
│   │   ├── intersection_of_two_rectangles_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── intersection_of_two_rectangles_java.pde
│   │   ├── intersection_of_two_rectangles_js/
│   │   │   ├── index.html
│   │   │   ├── intersection_of_two_rectangles_js.js
│   │   │   └── sketch.properties
│   │   └── intersection_of_two_rectangles_python/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── intersection_of_two_rectangles_python.pyde
│   │       └── sketch.properties
│   ├── 03_construction_of_a_perpendicular/
│   │   ├── construction_of_a_perpendicular_java/
│   │   │   ├── construction_of_a_perpendicular_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── construction_of_a_perpendicular_js/
│   │   │   ├── construction_of_a_perpendicular_js.js
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── construction_of_a_perpendicular_python/
│   │       ├── construction_of_a_perpendicular_python.pyde
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 04_parallel_polyline/
│   │   ├── parallel_polyline_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── parallel_polyline_java.pde
│   │   ├── parallel_polyline_js/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   ├── parallel_polyline_js.js
│   │   │   └── sketch.properties
│   │   └── parallel_polyline_python/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── parallel_polyline_python.pyde
│   │       └── sketch.properties
│   ├── 05_compass_orientation/
│   │   ├── compass_orientation_java/
│   │   │   ├── compass_orientation_java.pde
│   │   │   └── data/
│   │   │       ├── CenturySchoolbook-60.vlw
│   │   │       ├── CenturySchoolbook-64.vlw
│   │   │       └── CenturySchoolbook-72.vlw
│   │   ├── compass_orientation_js/
│   │   │   ├── compass_orientation_js.js
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── compass_orientation_python/
│   │       ├── compass_orientation_python.pyde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── CenturySchoolbook-64.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       └── sketch.properties
│   ├── 06_angle_between_three_points/
│   │   ├── angle_between_three_points_java/
│   │   │   ├── angle_between_three_points_java.pde
│   │   │   └── data/
│   │   │       ├── CenturySchoolbook-60.vlw
│   │   │       ├── CenturySchoolbook-64.vlw
│   │   │       └── CenturySchoolbook-72.vlw
│   │   ├── angle_between_three_points_js/
│   │   │   ├── angle_between_three_points_js.js
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── angle_between_three_points_python/
│   │       ├── angle_between_three_points_python.pyde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── CenturySchoolbook-64.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       └── sketch.properties
│   ├── 07_distance_from_a_point_to_a_line/
│   │   ├── distance_from_a_point_to_a_line_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   └── distance_from_a_point_to_a_line_java.pde
│   │   ├── distance_from_a_point_to_a_line_js/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── distance_from_a_point_to_a_line_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── distance_from_a_point_to_a_line_python/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── CenturySchoolbook-64.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       ├── distance_from_a_point_to_a_line_python.pyde
│   │       └── sketch.properties
│   ├── 08_intersection_of_two_line_segments/
│   │   ├── intersection_of_two_line_segments_java/
│   │   │   └── intersection_of_two_line_segments_java.pde
│   │   ├── intersection_of_two_line_segments_js/
│   │   │   ├── index.html
│   │   │   ├── intersection_of_two_line_segments_js.js
│   │   │   └── sketch.properties
│   │   └── intersection_of_two_line_segments_python/
│   │       ├── intersection_of_two_line_segments_python.pyde
│   │       └── sketch.properties
│   ├── 09_centroid_of_a_triangle/
│   │   ├── centroid_of_a_triangle_java/
│   │   │   ├── centroid_of_a_triangle_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── centroid_of_a_triangle_js/
│   │   │   ├── centroid_of_a_triangle_js.js
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── centroid_of_a_triangle_python/
│   │       ├── centroid_of_a_triangle_python.pyde
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 10_triangle_circumcenter/
│   │   ├── triangle_circumcenter_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── triangle_circumcenter_java.pde
│   │   ├── triangle_circumcenter_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── triangle_circumcenter_js.js
│   │   └── triangle_circumcenter_python/
│   │       ├── sketch.properties
│   │       └── triangle_circumcenter_python.pyde
│   ├── 11_triangle_orthocenter/
│   │   ├── triangle_orthocenter_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── triangle_orthocenter_java.pde
│   │   ├── triangle_orthocenter_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── triangle_orthocenter_js.js
│   │   └── triangle_orthocenter_python/
│   │       ├── sketch.properties
│   │       └── triangle_orthocenter_python.pyde
│   └── 12_triangle_incenter/
│       ├── triangle_incenter_java/
│       │   ├── data/
│       │   │   └── CenturySchoolbook-60.vlw
│       │   └── triangle_incenter_java.pde
│       ├── triangle_incenter_js/
│       │   ├── index.html
│       │   ├── sketch.properties
│       │   └── triangle_incenter_js.js
│       └── triangle_incenter_python/
│           ├── sketch.properties
│           └── triangle_incenter_python.pyde
├── 12_image/
│   ├── 01_collage_machine/
│   │   ├── collage_machine_java/
│   │   │   └── collage_machine_java.pde
│   │   ├── collage_machine_js/
│   │   │   ├── collage_machine_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── collage_machine_py/
│   │       ├── collage_machine_py.pyde
│   │       └── sketch.properties
│   ├── 02_color_of_a_pixel/
│   │   ├── color_of_a_pixel_java/
│   │   │   └── color_of_a_pixel_java.pde
│   │   ├── color_of_a_pixel_js/
│   │   │   ├── color_of_a_pixel_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_of_a_pixel_py/
│   │       ├── color_of_a_pixel_py.pyde
│   │       └── sketch.properties
│   ├── 03_subsample_and_downsample/
│   │   ├── subsample_downsample_java/
│   │   │   └── subsample_downsample_java.pde
│   │   ├── subsample_downsample_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── subsample_downsample_js.js
│   │   └── subsample_downsample_py/
│   │       ├── sketch.properties
│   │       └── subsample_downsample_py.pyde
│   ├── 04_random_dot_dithering/
│   │   ├── random_dot_dithering_java/
│   │   │   └── random_dot_dithering_java.pde
│   │   ├── random_dot_dithering_js/
│   │   │   ├── index.html
│   │   │   ├── random_dot_dithering_js.js
│   │   │   └── sketch.properties
│   │   └── random_dot_dithering_py/
│   │       ├── random_dot_dithering_py.pyde
│   │       └── sketch.properties
│   ├── 05_searching_for_the_brightest_point/
│   │   ├── brightest_point_java/
│   │   │   ├── brightest_point_java.pde
│   │   │   └── data/
│   │   │       └── Helvetica-Bold-72.vlw
│   │   ├── brightest_point_js/
│   │   │   ├── brightest_point_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── brightest_point_py/
│   │       ├── brightest_point_py.pyde
│   │       ├── data/
│   │       │   └── Helvetica-Bold-72.vlw
│   │       └── sketch.properties
│   ├── 06_image_averaging/
│   │   ├── image_averaging_java/
│   │   │   └── image_averaging_java.pde
│   │   ├── image_averaging_js/
│   │   │   ├── image_averaging_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── image_averaging_py/
│   │       ├── image_averaging_py.pyde
│   │       └── sketch.properties
│   ├── 07_edge_detector_sobel_filter/
│   │   ├── sobel_java/
│   │   │   └── sobel_java.pde
│   │   ├── sobel_java_2/
│   │   │   └── sobel_java_2.pde
│   │   ├── sobel_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── sobel_js.js
│   │   └── sobel_py/
│   │       ├── sketch.properties
│   │       └── sobel_py.pyde
│   └── 08_pixel_sort/
│       ├── pixel_sorting_java/
│       │   └── pixel_sorting_java.pde
│       ├── pixel_sorting_js/
│       │   ├── index.html
│       │   ├── pixel_sorting_js.js
│       │   └── sketch.properties
│       └── pixel_sorting_py/
│           ├── pixel_sorting_py.pyde
│           └── sketch.properties
├── 13_visualization/
│   ├── 01_text_message_isotype/
│   │   └── text_message_isotype_java/
│   │       └── text_message_isotype_java.pde
│   ├── 02_temperature_timeline/
│   │   └── temperature_timeline_java/
│   │       ├── data/
│   │       │   ├── Helvetica-Bold-56.vlw
│   │       │   └── global-temp/
│   │       │       ├── README.md
│   │       │       ├── datapackage.json
│   │       │       ├── monthly_csv.csv
│   │       │       └── monthly_json.json
│   │       └── temperature_timeline_java.pde
│   ├── 03_pie_chart/
│   │   └── pie_chart_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── pie_chart_java.pde
│   ├── 04_radar_charts/
│   │   └── radar_charts_java/
│   │       └── radar_charts_java.pde
│   ├── 05_path_plotting_1/
│   │   └── path_plotting_1_java/
│   │       ├── data/
│   │       │   └── run.csv
│   │       └── path_plotting_1_java.pde
│   ├── 06_path_plotting_2/
│   │   └── path_plotting_2_java/
│   │       ├── data/
│   │       │   ├── Helvetica-Bold-72.vlw
│   │       │   └── run.csv
│   │       └── path_plotting_2_java.pde
│   ├── 07_dot_map/
│   │   └── dot_map_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── rat_sightings_lite.tsv
│   │       └── dot_map_java.pde
│   ├── 08_heat_map/
│   │   └── heat_map_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── rat_sightings_lite.tsv
│   │       └── heat_map_java.pde
│   ├── 09_social_network_graph/
│   │   └── social_network_graph_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── dolphin_relations.xml
│   │       └── social_network_graph_java.pde
│   ├── 10_social_network_matrix/
│   │   └── social_network_matrix_java/
│   │       ├── data/
│   │       │   └── monkey_relations.xml
│   │       └── social_network_matrix_java.pde
│   ├── 11_real_time_iss/
│   │   ├── iss_js/
│   │   │   ├── index.html
│   │   │   ├── libraries/
│   │   │   │   ├── p5.dom.js
│   │   │   │   ├── p5.js
│   │   │   │   └── p5.sound.js
│   │   │   └── sketch.js
│   │   └── real_time_iss_java/
│   │       └── real_time_iss_java.pde
│   ├── 12_web_scraping/
│   │   └── web_scraping_java/
│   │       └── web_scraping_java.pde
│   └── 13_one_dataset_four_ways/
│       └── one_dataset_four_ways_java/
│           ├── data/
│           │   └── SlateGunDeaths.tsv
│           └── one_dataset_four_ways_java.pde
├── 14_text_and_language/
│   ├── 01_string_search/
│   │   └── string_search_java/
│   │       └── string_search_java.pde
│   ├── 02_nonsense_words/
│   │   └── nonsense_words_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── clean.py
│   │       │   ├── prefixes.txt
│   │       │   ├── prefixes_dict.txt
│   │       │   ├── roots.txt
│   │       │   ├── roots_dict.txt
│   │       │   ├── suffixes.txt
│   │       │   └── suffixes_dict.txt
│   │       └── nonsense_words_java.pde
│   ├── 03_letter_frequency/
│   │   └── letter_frequency_java/
│   │       ├── data/
│   │       │   └── frankenstein.txt
│   │       └── letter_frequency_java.pde
│   ├── 04_letter_pair_frequency/
│   │   └── letter_pairs_java/
│   │       ├── data/
│   │       │   └── dubois.txt
│   │       └── letter_pairs_java.pde
│   ├── 05_average_word_length/
│   │   └── average_word_length_java/
│   │       └── average_word_length_java.pde
│   ├── 06_sorting_words/
│   │   ├── sorting_words_java/
│   │   │   └── sorting_words_java.pde
│   │   └── sorting_words_python/
│   │       └── sorting_words.py
│   ├── 07_cut-up_machine/
│   │   └── cut-up_machine_java/
│   │       ├── cut-up_machine_java.pde
│   │       └── data/
│   │           ├── CenturySchoolbook-60.vlw
│   │           └── news.txt
│   ├── 08_bigram_calculator/
│   │   └── bigram_calculator_java/
│   │       ├── bigram_calculator_java.pde
│   │       └── data/
│   │           └── green_eggs_and_ham.txt
│   ├── 09_dammit_jim/
│   │   └── dammit_jim_java/
│   │       ├── dammit_jim_java.pde
│   │       └── data/
│   │           ├── CenturySchoolbook-60.vlw
│   │           ├── clean.py
│   │           ├── jobs.txt
│   │           └── jobs_raw.txt
│   ├── 10_knock_knock_joke_generator/
│   │   ├── _archived/
│   │   │   ├── knock.py
│   │   │   └── output.txt
│   │   ├── knock_knock_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── noun-definition.txt
│   │   │   └── knock_knock_java.pde
│   │   ├── knock_knock_joke_python/
│   │   │   ├── knock_knock_joke_python.pyde
│   │   │   └── sketch.properties
│   │   └── prep/
│   │       ├── noun-definition.txt
│   │       └── prepDict.py
│   ├── 11_translator_pig_latin/
│   │   ├── translator_pig_latin_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── translator_pig_latin_java.pde
│   │   └── translator_pig_latin_python/
│   │       ├── output.txt
│   │       └── pig_latin.py
│   ├── 12_argots_and_language_games/
│   │   └── translator_argots_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── translator_argots_java.pde
│   ├── 14_rhyming_couplets/
│   │   └── rhyming_couplets_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── little_women.txt
│   │       ├── debug.txt
│   │       ├── rhymes.txt
│   │       └── rhyming_couplets_java.pde
│   ├── 15_haiku_finder/
│   │   └── haiku_finder_java/
│   │       ├── Pair.pde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── cmudict.0.6d.txt
│   │       │   └── little_women.txt
│   │       └── haiku_finder_java.pde
│   ├── 16_markov_text_generator/
│   │   ├── markov_python/
│   │   │   ├── markov.py
│   │   │   ├── markov_lines.txt
│   │   │   └── transcript.txt
│   │   └── markov_text_generator_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── transcript.txt
│   │       └── markov_text_generator_java.pde
│   ├── 17_limerick/
│   │   ├── archive/
│   │   │   ├── limerick_java/
│   │   │   │   ├── data/
│   │   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   │   ├── kafka.txt
│   │   │   │   │   └── wittgenstein.txt
│   │   │   │   └── limerick_java.pde
│   │   │   └── limerick_java_2/
│   │   │       ├── data/
│   │   │       │   ├── CenturySchoolbook-60.vlw
│   │   │       │   └── lime.yaml
│   │   │       └── limerick_java_2.pde
│   │   ├── data/
│   │   │   └── scotland_places.txt
│   │   └── limerick_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── adjectives.txt
│   │       │   └── scotland_places.txt
│   │       └── limerick_java.pde
│   └── other/
│       ├── _IMPORTANT_text_code/
│       │   ├── Cut iii/
│       │   │   ├── make_recipe.py
│       │   │   └── recipe.txt
│       │   ├── Grammar/
│       │   │   ├── grammer.py
│       │   │   ├── occupations.txt
│       │   │   └── output.txt
│       │   ├── Joke/
│       │   │   ├── knock.py
│       │   │   └── output.txt
│       │   ├── Markov/
│       │   │   ├── markov.py
│       │   │   ├── markov_lines.txt
│       │   │   └── transcript.txt
│       │   ├── People, Places, Things/
│       │   │   ├── output.txt
│       │   │   └── replace_nouns.py
│       │   ├── Rhyme/
│       │   │   ├── output.txt
│       │   │   ├── rhyme.py
│       │   │   └── sentences.txt
│       │   ├── Sort/
│       │   │   ├── alphabet/
│       │   │   │   ├── alphabetic.py
│       │   │   │   └── output.txt
│       │   │   ├── frequency/
│       │   │   │   ├── freq.py
│       │   │   │   └── output.txt
│       │   │   └── length/
│       │   │       ├── length.py
│       │   │       └── output.txt
│       │   ├── Syllable/
│       │   │   ├── haiku1.txt
│       │   │   ├── haiku2.txt
│       │   │   ├── haiku3.txt
│       │   │   ├── haiku4.txt
│       │   │   ├── haiku5.txt
│       │   │   ├── haiku6.txt
│       │   │   ├── haiku7.txt
│       │   │   ├── syllables.py
│       │   │   └── word.txt
│       │   ├── Translation/
│       │   │   ├── output.txt
│       │   │   └── pig_latin.py
│       │   └── n-gram/
│       │       ├── huckfinn.txt
│       │       ├── ngram.py
│       │       ├── similarity.txt
│       │       └── tomsawyer.txt
│       ├── cutup_1/
│       │   ├── cutup_1.pyde
│       │   ├── data/
│       │   │   ├── Times-Roman-14.vlw
│       │   │   └── frost.txt
│       │   ├── screen-0153.tif
│       │   ├── screen-0177.tif
│       │   ├── screen-0185.tif
│       │   ├── screen-0207.tif
│       │   ├── screen-0246.tif
│       │   └── sketch.properties
│       ├── cutup_2/
│       │   ├── cutup_2.pyde
│       │   ├── data/
│       │   │   ├── macbeth.txt
│       │   │   └── trump.txt
│       │   ├── screen-0041.tif
│       │   ├── screen-0059.tif
│       │   ├── screen-0060.tif
│       │   ├── screen-0083.tif
│       │   ├── screen-0095.tif
│       │   ├── screen-0100.tif
│       │   ├── screen-0139.tif
│       │   ├── screen-0523.tif
│       │   ├── screen-0810.tif
│       │   ├── screen-1084.tif
│       │   ├── screen-1779.tif
│       │   ├── screen-2009.tif
│       │   ├── screen-3087.tif
│       │   └── sketch.properties
│       └── tfidf/
│           └── tfidf_java/
│               ├── data/
│               │   ├── CenturySchoolbook-60.vlw
│               │   ├── frankenstein.txt
│               │   └── little_women.txt
│               └── tfidf_java.pde
├── 15_simulation/
│   ├── 01_recursive_tree/
│   │   └── recursive_tree_java/
│   │       └── recursive_tree_java.pde
│   ├── 02_fireworks_particle_shower/
│   │   └── fireworks_java/
│   │       ├── Particle.pde
│   │       ├── ParticleSystem.pde
│   │       └── fireworks_java.pde
│   ├── 05_cursor_particles/
│   │   └── cursor_particles_java/
│   │       ├── cursor_particles_java.pde
│   │       └── data/
│   │           └── CenturySchoolbook-60.vlw
│   ├── 06_flow_field/
│   │   └── flow_field_java/
│   │       └── flow_field_java.pde
│   ├── 07_spring/
│   │   └── spring.pde
│   ├── 08_circle_packing/
│   │   ├── circle_packing_montecarlo_java/
│   │   │   └── circle_packing_montecarlo_java.pde
│   │   ├── circle_packing_montecarlo_p5js/
│   │   │   ├── circle_packing_montecarlo_p5js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   ├── circle_packing_montecarlo_pyde/
│   │   │   └── circle_packing_montecarlo_pyde.pyde
│   │   └── circle_packing_simple_java/
│   │       └── circle_packing_simple_java.pde
│   ├── 09_conways_life/
│   │   └── conways_life_java/
│   │       └── conways_life_java.pde
│   ├── 10_diffusion_limited_aggregation/
│   │   ├── dla_java/
│   │   │   └── dla_java.pde
│   │   ├── dla_p5js/
│   │   │   ├── dla_p5js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── dla_pyde/
│   │       ├── dla_pyde.pyde
│   │       └── sketch.properties
│   ├── 11_snowflake/
│   │   └── snowflake_java/
│   │       └── snowflake_java.pde
│   └── 13_differential_growth/
│       └── differential_growth_java/
│           └── differential_growth_java.pde
├── 16_machine_learning/
│   ├── 04_what_do_you_see/
│   │   └── what_do_you_see_js/
│   │       ├── index.html
│   │       └── what_do_you_see_js.js
│   ├── 05_dont_touch_your_face/
│   │   └── dont_touch_your_face_js/
│   │       ├── dont_touch_your_face_js.js
│   │       └── index.html
│   ├── 06_emoji_translator/
│   │   └── emoji_translator_js/
│   │       ├── emoji_translator_js.js
│   │       └── index.html
│   └── 10_environmental_sound_clock/
│       └── environmental_sound_clock_js/
│           ├── environmental_sound_clock_js.js
│           ├── index.html
│           └── style.css
├── 17_sound/
│   ├── 01_theremin/
│   │   └── theremin_js/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       ├── sketch.properties
│   │       └── theremin_js.js
│   ├── 02_sequencer_I/
│   │   └── sequencer_I_js/
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       ├── sequencer_js.js
│   │       └── sketch.properties
│   ├── 03_sequencer_II/
│   │   └── sequencer_II_js/
│   │       ├── index.html
│   │       └── sketch.js
│   ├── 08_visualizer/
│   │   └── visualizer_java/
│   │       ├── data/
│   │       │   └── beat_8bitsigned.raw
│   │       └── visualizer_java.pde
│   ├── 09_data_sonification/
│   │   └── data_sonification_js/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── data_sonification_js.js
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       └── sketch.properties
│   ├── 10_delay_line_effect/
│   │   └── delay_line_effect_js/
│   │       ├── delay_line_effect_js.js
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       └── sketch.properties
│   ├── libraries/
│   │   ├── Tone.js
│   │   ├── p5.dom.js
│   │   ├── p5.js
│   │   └── p5.sound.js
│   └── work_in_progress/
│       ├── fft/
│       │   ├── index.html
│       │   └── sketch.js
│       ├── guitar.maxpat
│       ├── polyphony/
│       │   └── polyphony.pde
│       ├── sequencer_2/
│       │   └── sequencer_2_js/
│       │       ├── data/
│       │       │   └── CenturySchoolbook-60.vlw
│       │       ├── index.html
│       │       ├── libraries/
│       │       │   └── tone.js
│       │       ├── sequencer_2_js.js
│       │       └── sketch.properties
│       ├── voice_synthesizer/
│       │   ├── data/
│       │   │   ├── OCRAStd-96.vlw
│       │   │   └── voice_raw_8bit_signed.raw
│       │   └── voice_synthesizer.pde
│       └── whistle_cursor/
│           └── whistle_cursor.pde
├── 18_games/
│   ├── 02_collision_detection/
│   │   └── collision_detection_java/
│   │       └── collision_detection_java.pde
│   ├── 03_whack_a_mole/
│   │   └── whack_a_mole_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── whack_a_mole_java.pde
│   ├── 04_WASD_navigation/
│   │   └── WASD_navigation_java/
│   │       └── WASD_navigation_java.pde
│   ├── 05_recoding_a_classic/
│   │   └── snake_java/
│   │       └── snake_java.pde
│   ├── 06_physics_fun/
│   │   └── physics_fun_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── physics_fun_java.pde
│   └── 07_level_designer/
│       └── level_designer_java/
│           ├── data/
│           │   └── CenturySchoolbook-60.vlw
│           └── level_designer_java.pde
├── README.md
└── checklist.md

================================================
FILE CONTENTS
================================================

================================================
FILE: 01_graphic_elements/01_one_with_everything/one_with_everything_java/one_with_everything_java.pde
================================================
float offset;
float x;

void setup() {
  size(800, 800);
  noLoop(); 
  
  offset = width/10;
  x = offset * 2;
}

void draw() {
  background(253);
  strokeWeight(8);
  ellipseMode(CENTER); 
  strokeJoin(MITER); 
  
  // rectangle, ellipse, arc, line segment, Bézier curve, polyline, or polygon
  
  // triangle 
  pushMatrix();
  fill(255); 
  translate(offset, offset);
  triangle(0, x, x/2, 0, x, x);
  popMatrix();
  
  // rectangle
  pushMatrix();
  fill(255); 
  translate(offset*2+x, offset);
  rect(0, x/6, x, x*4/6);
  popMatrix();
  
  // ellipse
  pushMatrix();
  fill(255); 
  translate(offset*3+x*2, offset);
  ellipse(x/2, x/2, x, x);
  popMatrix();
  
  // line and point
  pushMatrix();
  translate(offset, offset*2 + x);
  line(0, 0, x, x);
  strokeWeight(16);
  point(0+x/4, x-x/4);
  point(x-x/4, 0+x/4);
  strokeWeight(8);
  popMatrix();
  
  // curve
  pushMatrix();
  noFill(); 
  translate(offset*2 + x, offset*2 + x);
  bezier(0, x, 0, 0, x, x, x, 0);
  line(0, x, 0, 0);
  line(x, x, x, 0);
  popMatrix();
  
  // vertices
  noFill(); 
  strokeJoin(ROUND); 
  pushMatrix();
  translate(offset*3 + x*2, offset*2 + x);
  beginShape();
  vertex(x*0/4, x/2);
  vertex(x*1/4, x);
  vertex(x*1/4, 0);
  vertex(x*3/4, x);
  vertex(x*3/4, 0);
  vertex(x*4/4, x/2);
  endShape();
  popMatrix();
  strokeJoin(MITER); 
  
  // arc
  fill(255); 
  pushMatrix();
  translate(offset, offset*3 + x*2);
  arc(x/2, x/2, x, x, 0.25*PI, 1.75*PI, PIE);
  popMatrix();
  
  // quad
  fill(255); 
  pushMatrix();
  translate(offset*2 + x, offset*3 + x*2);
  quad(0, 0, 0, x, x, x, x*2/3, 0);
  popMatrix();
  
  // ellipse n.2
  fill(255); 
  pushMatrix();
  translate(offset*3 + x*2, offset*3 + x*2);
  translate(x/2, x/2); 
  rotate(radians(41.4096)); 
  ellipse(0,0, x*1.3333, x*0.6666);
  popMatrix();
  
  /*
  pushMatrix();
  translate(offset*3 + x*2, offset*3 + x*2);
  beginShape();
  curveVertex(0,  0);
  curveVertex(0,  0);
  curveVertex(x*2/3, x/3);
  curveVertex(x/3, x*2/3);
  curveVertex(x, x);
  curveVertex(x, x);
  endShape();
  popMatrix();
  */
}

void keyPressed() {
  if (key == ' '){
    saveFrame("one_with_everything.png");
  }
}


================================================
FILE: 01_graphic_elements/02_quadrilateral_zoo/quadrilateral_zoo_java/quadrilateral_zoo_java.pde
================================================
float offset;
float x;

void setup() {
  size(800, 800);
  offset = width/10;
  x = offset * 2;
}

void draw() {
  background(253);
  strokeWeight(8);
  strokeJoin(MITER); // sharp
  fill(255); 
  
  // square 
  pushMatrix();
  translate(offset, offset);
  square(0, 0, x);
  popMatrix();
  
  // rectangle
  pushMatrix();
  translate(offset*2 + x, offset);
  rect(0, 0, x*2.5, x);
  popMatrix();
  
  // parallelogram
  pushMatrix();
  translate(offset, offset*2 + x);
  quad(0, x, x/sqrt(3), 0, sqrt(3)*x + x/2, 0, 2/sqrt(3)*x + x/2, x);
  popMatrix();
  
  // rhombus
  pushMatrix();
  translate(offset*1.5 + x*2, offset*2 + x);
  quad(0, x, x/sqrt(3), 0, sqrt(3)*x, 0, 2/sqrt(3)*x, x);
  popMatrix();
  
  // trapezoid
  pushMatrix();
  translate(offset, offset*3 + 2*x);
  quad(0, x, x/3, 0, x*2/3, 0, x, x);
  popMatrix();
  
  // kite
  pushMatrix();
  translate(offset*3 + x*2, offset*3 + 2*x);
  quad(0, 0, 0, x*0.75, x, x, x*0.75, 0);
  popMatrix();
  
  // dart
  pushMatrix();
  translate(offset*2 + x, offset*3 + 2*x);
  translate(x/2, x*0.75); 
  rotate(radians(180+45)); 
  translate(-x/2, -x/2);
  quad(0, x-x/8, x, x, x-x/8, 0, x*2/3, x*2/3);
  popMatrix();
  
}


void keyPressed() {
  if (key == ' '){
    saveFrame("quadrilateral_zoo.png");
  }
}


================================================
FILE: 01_graphic_elements/03_initials/initials_java/initials_java.pde
================================================


void setup() {
  size(800, 800);
  background(253);
  smooth();
  
  fill(0); 
  stroke(0);
  strokeWeight(5);
  strokeCap(SQUARE); 
  
  pushMatrix(); 
  scale(8.0/3.0, 8.0/3.0); 
  
  float w = 300; 
  line(w/4+20, 120, w/4+20, 240);
  line(3*w/4-40, 50, 3*w/4-40, 240);
  noStroke();
  arc(w/4+20, 110, 120, 120, PI, TWO_PI, OPEN);
  arc(3*w/4-30, 100, 100, 100, -1*HALF_PI, HALF_PI, OPEN);
  arc(3*w/4-30, 190, 100, 100, -1*HALF_PI, HALF_PI, OPEN);
  popMatrix(); 
}

void draw() {
}

void keyPressed() {
  saveFrame("initials.png");
}


================================================
FILE: 01_graphic_elements/03_initials/initials_javascript/index.html
================================================
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>initials_javascript</title>
    <script src="libraries/p5.js" type="text/javascript"></script>

    <script src="libraries/p5.dom.js" type="text/javascript"></script>
    <script src="libraries/p5.sound.js" type="text/javascript"></script>

    <script src="sketch.js" type="text/javascript"></script>

    <style> body {padding: 0; margin: 0;} canvas {vertical-align: top;} </style>
  </head>
  <body>
  </body>
</html>


================================================
FILE: 01_graphic_elements/03_initials/initials_javascript/libraries/p5.dom.js
================================================
/*! p5.dom.js v0.2.13 Oct 1, 2016 */
/**
 * <p>The web is much more than just canvas and p5.dom makes it easy to interact
 * with other HTML5 objects, including text, hyperlink, image, input, video,
 * audio, and webcam.</p>
 * <p>There is a set of creation methods, DOM manipulation methods, and
 * an extended p5.Element that supports a range of HTML elements. See the
 * <a href="https://github.com/processing/p5.js/wiki/Beyond-the-canvas">
 * beyond the canvas tutorial</a> for a full overview of how this addon works.
 *
 * <p>Methods and properties shown in black are part of the p5.js core, items in
 * blue are part of the p5.dom library. You will need to include an extra file
 * in order to access the blue functions. See the
 * <a href="http://p5js.org/libraries/#using-a-library">using a library</a>
 * section for information on how to include this library. p5.dom comes with
 * <a href="http://p5js.org/download">p5 complete</a> or you can download the single file
 * <a href="https://raw.githubusercontent.com/lmccart/p5.js/master/lib/addons/p5.dom.js">
 * here</a>.</p>
 * <p>See <a href="https://github.com/processing/p5.js/wiki/Beyond-the-canvas">tutorial: beyond the canvas</a>
 * for more info on how to use this libary.</a>
 *
 * @module p5.dom
 * @submodule p5.dom
 * @for p5.dom
 * @main
 */

(function (root, factory) {
  if (typeof define === 'function' && define.amd)
    define('p5.dom', ['p5'], function (p5) { (factory(p5));});
  else if (typeof exports === 'object')
    factory(require('../p5'));
  else
    factory(root['p5']);
}(this, function (p5) {
// =============================================================================
//                         p5 additions
// =============================================================================

  /**
   * Searches the page for an element with the given ID, class, or tag name (using the '#' or '.'
   * prefixes to specify an ID or class respectively, and none for a tag) and returns it as
   * a p5.Element. If a class or tag name is given with more than 1 element,
   * only the first element will be returned.
   * The DOM node itself can be accessed with .elt.
   * Returns null if none found. You can also specify a container to search within.
   *
   * @method select
   * @param  {String} name id, class, or tag name of element to search for
   * @param  {String} [container] id, p5.Element, or HTML element to search within
   * @return {Object/p5.Element|Null} p5.Element containing node found
   * @example
   * <div ><code class='norender'>
   * function setup() {
   *   createCanvas(100,100);
   *   //translates canvas 50px down
   *   select('canvas').position(100, 100);
   * }
   * </code></div>
   * <div ><code class='norender'>
   * // these are all valid calls to select()
   * var a = select('#moo');
   * var b = select('#blah', '#myContainer');
   * var c = select('#foo', b);
   * var d = document.getElementById('beep');
   * var e = select('p', d);
   * </code></div>
   *
   */
  p5.prototype.select = function (e, p) {
    var res = null;
    var container = getContainer(p);
    if (e[0] === '.'){
      e = e.slice(1);
      res = container.getElementsByClassName(e);
      if (res.length) {
        res = res[0];
      } else {
        res = null;
      }
    }else if (e[0] === '#'){
      e = e.slice(1);
      res = container.getElementById(e);
    }else {
      res = container.getElementsByTagName(e);
      if (res.length) {
        res = res[0];
      } else {
        res = null;
      }
    }
    if (res) {
      return wrapElement(res);
    } else {
      return null;
    }
  };

  /**
   * Searches the page for elements with the given class or tag name (using the '.' prefix
   * to specify a class and no prefix for a tag) and returns them as p5.Elements
   * in an array.
   * The DOM node itself can be accessed with .elt.
   * Returns an empty array if none found.
   * You can also specify a container to search within.
   *
   * @method selectAll
   * @param  {String} name class or tag name of elements to search for
   * @param  {String} [container] id, p5.Element, or HTML element to search within
   * @return {Array} Array of p5.Elements containing nodes found
   * @example
   * <div class='norender'><code>
   * function setup() {
   *   createButton('btn');
   *   createButton('2nd btn');
   *   createButton('3rd btn');
   *   var buttons = selectAll('button');
   *
   *   for (var i = 0; i < buttons.length; i++){
   *     buttons[i].size(100,100);
   *   }
   * }
   * </code></div>
   * <div class='norender'><code>
   * // these are all valid calls to selectAll()
   * var a = selectAll('.moo');
   * var b = selectAll('div');
   * var c = selectAll('button', '#myContainer');
   * var d = select('#container');
   * var e = selectAll('p', d);
   * var f = document.getElementById('beep');
   * var g = select('.blah', f);
   * </code></div>
   *
   */
  p5.prototype.selectAll = function (e, p) {
    var arr = [];
    var res;
    var container = getContainer(p);
    if (e[0] === '.'){
      e = e.slice(1);
      res = container.getElementsByClassName(e);
    } else {
      res = container.getElementsByTagName(e);
    }
    if (res) {
      for (var j = 0; j < res.length; j++) {
        var obj = wrapElement(res[j]);
        arr.push(obj);
      }
    }
    return arr;
  };

  /**
   * Helper function for select and selectAll
   */
  function getContainer(p) {
    var container = document;
    if (typeof p === 'string' && p[0] === '#'){
      p = p.slice(1);
      container = document.getElementById(p) || document;
    } else if (p instanceof p5.Element){
      container = p.elt;
    } else if (p instanceof HTMLElement){
      container = p;
    }
    return container;
  }

  /**
   * Helper function for getElement and getElements.
   */
  function wrapElement(elt) {
    if(elt.tagName === "INPUT" && elt.type === "checkbox") {
      var converted = new p5.Element(elt);
      converted.checked = function(){
      if (arguments.length === 0){
        return this.elt.checked;
      } else if(arguments[0]) {
        this.elt.checked = true;
      } else {
        this.elt.checked = false;
      }
      return this;
      };
      return converted;
    } else if (elt.tagName === "VIDEO" || elt.tagName === "AUDIO") {
      return new p5.MediaElement(elt);
    } else {
      return new p5.Element(elt);
    }
  }

  /**
   * Removes all elements created by p5, except any canvas / graphics
   * elements created by createCanvas or createGraphics.
   * Event handlers are removed, and element is removed from the DOM.
   * @method removeElements
   * @example
   * <div class='norender'><code>
   * function setup() {
   *   createCanvas(100, 100);
   *   createDiv('this is some text');
   *   createP('this is a paragraph');
   * }
   * function mousePressed() {
   *   removeElements(); // this will remove the div and p, not canvas
   * }
   * </code></div>
   *
   */
  p5.prototype.removeElements = function (e) {
    for (var i=0; i<this._elements.length; i++) {
      if (!(this._elements[i].elt instanceof HTMLCanvasElement)) {
        this._elements[i].remove();
      }
    }
  };

  /**
   * Helpers for create methods.
   */
  function addElement(elt, pInst, media) {
    var node = pInst._userNode ? pInst._userNode : document.body;
    node.appendChild(elt);
    var c = media ? new p5.MediaElement(elt) : new p5.Element(elt);
    pInst._elements.push(c);
    return c;
  }

  /**
   * Creates a &lt;div&gt;&lt;/div&gt; element in the DOM with given inner HTML.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createDiv
   * @param  {String} html inner HTML for element created
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var myDiv;
   * function setup() {
   *   myDiv = createDiv('this is some text');
   * }
   * </code></div>
   */

  /**
   * Creates a &lt;p&gt;&lt;/p&gt; element in the DOM with given inner HTML. Used
   * for paragraph length text.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createP
   * @param  {String} html inner HTML for element created
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var myP;
   * function setup() {
   *   myP = createP('this is some text');
   * }
   * </code></div>
   */

  /**
   * Creates a &lt;span&gt;&lt;/span&gt; element in the DOM with given inner HTML.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createSpan
   * @param  {String} html inner HTML for element created
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var mySpan;
   * function setup() {
   *   mySpan = createSpan('this is some text');
   * }
   * </code></div>
   */
  var tags = ['div', 'p', 'span'];
  tags.forEach(function(tag) {
    var method = 'create' + tag.charAt(0).toUpperCase() + tag.slice(1);
    p5.prototype[method] = function(html) {
      var elt = document.createElement(tag);
      elt.innerHTML = typeof html === undefined ? "" : html;
      return addElement(elt, this);
    }
  });

  /**
   * Creates an &lt;img /&gt; element in the DOM with given src and
   * alternate text.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createImg
   * @param  {String} src src path or url for image
   * @param  {String} [alt] alternate text to be used if image does not load
   * @param  {Function} [successCallback] callback to be called once image data is loaded
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var img;
   * function setup() {
   *   img = createImg('http://p5js.org/img/asterisk-01.png');
   * }
   * </code></div>
   */
  p5.prototype.createImg = function() {
    var elt = document.createElement('img');
    var args = arguments;
    var self;
    var setAttrs = function(){
      self.width = elt.offsetWidth;
      self.height = elt.offsetHeight;
      if (args.length > 1 && typeof args[1] === 'function'){
        self.fn = args[1];
        self.fn();
      }else if (args.length > 1 && typeof args[2] === 'function'){
        self.fn = args[2];
        self.fn();
      }
    };
    elt.src = args[0];
    if (args.length > 1 && typeof args[1] === 'string'){
      elt.alt = args[1];
    }
    elt.onload = function(){
      setAttrs();
    }
    self = addElement(elt, this);
    return self;
  };

  /**
   * Creates an &lt;a&gt;&lt;/a&gt; element in the DOM for including a hyperlink.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createA
   * @param  {String} href       url of page to link to
   * @param  {String} html       inner html of link element to display
   * @param  {String} [target]   target where new link should open,
   *                             could be _blank, _self, _parent, _top.
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var myLink;
   * function setup() {
   *   myLink = createA('http://p5js.org/', 'this is a link');
   * }
   * </code></div>
   */
  p5.prototype.createA = function(href, html, target) {
    var elt = document.createElement('a');
    elt.href = href;
    elt.innerHTML = html;
    if (target) elt.target = target;
    return addElement(elt, this);
  };

  /** INPUT **/


  /**
   * Creates a slider &lt;input&gt;&lt;/input&gt; element in the DOM.
   * Use .size() to set the display length of the slider.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createSlider
   * @param  {Number} min minimum value of the slider
   * @param  {Number} max maximum value of the slider
   * @param  {Number} [value] default value of the slider
   * @param  {Number} [step] step size for each tick of the slider (if step is set to 0, the slider will move continuously from the minimum to the maximum value)
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div><code>
   * var slider;
   * function setup() {
   *   slider = createSlider(0, 255, 100);
   *   slider.position(10, 10);
   *   slider.style('width', '80px');
   * }
   *
   * function draw() {
   *   var val = slider.value();
   *   background(val);
   * }
   * </code></div>
   *
   * <div><code>
   * var slider;
   * function setup() {
   *   colorMode(HSB);
   *   slider = createSlider(0, 360, 60, 40);
   *   slider.position(10, 10);
   *   slider.style('width', '80px');
   * }
   *
   * function draw() {
   *   var val = slider.value();
   *   background(val, 100, 100, 1);
   * }
   * </code></div>
   */
  p5.prototype.createSlider = function(min, max, value, step) {
    var elt = document.createElement('input');
    elt.type = 'range';
    elt.min = min;
    elt.max = max;
    if (step === 0) {
      elt.step = .000000000000000001; // smallest valid step
    } else if (step) {
      elt.step = step;
    }
    if (typeof(value) === "number") elt.value = value;
    return addElement(elt, this);
  };

  /**
   * Creates a &lt;button&gt;&lt;/button&gt; element in the DOM.
   * Use .size() to set the display size of the button.
   * Use .mousePressed() to specify behavior on press.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createButton
   * @param  {String} label label displayed on the button
   * @param  {String} [value] value of the button
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var button;
   * function setup() {
   *   createCanvas(100, 100);
   *   background(0);
   *   button = createButton('click me');
   *   button.position(19, 19);
   *   button.mousePressed(changeBG);
   * }
   *
   * function changeBG() {
   *   var val = random(255);
   *   background(val);
   * }
   * </code></div>
   */
  p5.prototype.createButton = function(label, value) {
    var elt = document.createElement('button');
    elt.innerHTML = label;
    elt.value = value;
    if (value) elt.value = value;
    return addElement(elt, this);
  };

  /**
   * Creates a checkbox &lt;input&gt;&lt;/input&gt; element in the DOM.
   * Calling .checked() on a checkbox returns if it is checked or not
   *
   * @method createCheckbox
   * @param  {String} [label] label displayed after checkbox
   * @param  {boolean} [value] value of the checkbox; checked is true, unchecked is false.Unchecked if no value given
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var checkbox;
   *
   * function setup() {
   *   checkbox = createCheckbox('label', false);
   *   checkbox.changed(myCheckedEvent);
   * }
   *
   * function myCheckedEvent() {
   *   if (this.checked()) {
   *     console.log("Checking!");
   *   } else {
   *     console.log("Unchecking!");
   *   }
   * }
   * </code></div>
   */
  p5.prototype.createCheckbox = function() {
    var elt = document.createElement('div');
    var checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    elt.appendChild(checkbox);
    //checkbox must be wrapped in p5.Element before label so that label appears after
    var self = addElement(elt, this);
    self.checked = function(){
      var cb = self.elt.getElementsByTagName('input')[0];
      if (cb) {
        if (arguments.length === 0){
          return cb.checked;
        }else if(arguments[0]){
          cb.checked = true;
        }else{
          cb.checked = false;
        }
      }
      return self;
    };
    this.value = function(val){
      self.value = val;
      return this;
    };
    if (arguments[0]){
      var ran = Math.random().toString(36).slice(2);
      var label = document.createElement('label');
      checkbox.setAttribute('id', ran);
      label.htmlFor = ran;
      self.value(arguments[0]);
      label.appendChild(document.createTextNode(arguments[0]));
      elt.appendChild(label);
    }
    if (arguments[1]){
      checkbox.checked = true;
    }
    return self;
  };

  /**
   * Creates a dropdown menu &lt;select&gt;&lt;/select&gt; element in the DOM.
   * @method createSelect
   * @param {boolean} [multiple] [true if dropdown should support multiple selections]
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div><code>
   * var sel;
   *
   * function setup() {
   *   textAlign(CENTER);
   *   background(200);
   *   sel = createSelect();
   *   sel.position(10, 10);
   *   sel.option('pear');
   *   sel.option('kiwi');
   *   sel.option('grape');
   *   sel.changed(mySelectEvent);
   * }
   *
   * function mySelectEvent() {
   *   var item = sel.value();
   *   background(200);
   *   text("it's a "+item+"!", 50, 50);
   * }
   * </code></div>
   */
  p5.prototype.createSelect = function(mult) {
    var elt = document.createElement('select');
    if (mult){
      elt.setAttribute('multiple', 'true');
    }
    var self = addElement(elt, this);
    self.option = function(name, value){
      var opt = document.createElement('option');
      opt.innerHTML = name;
      if (arguments.length > 1)
        opt.value = value;
      else
        opt.value = name;
      elt.appendChild(opt);
    };
    self.selected = function(value){
      var arr = [];
      if (arguments.length > 0){
        for (var i = 0; i < this.elt.length; i++){
          if (value.toString() === this.elt[i].value){
            this.elt.selectedIndex = i;
          }
        }
        return this;
      }else{
        if (mult){
          for (var i = 0; i < this.elt.selectedOptions.length; i++){
            arr.push(this.elt.selectedOptions[i].value);
          }
          return arr;
        }else{
          return this.elt.value;
        }
      }
    };
    return self;
  };

  /**
   * Creates a radio button &lt;input&gt;&lt;/input&gt; element in the DOM.
   * The .option() method can be used to set options for the radio after it is
   * created. The .value() method will return the currently selected option.
   *
   * @method createRadio
   * @param  {String} [divId] the id and name of the created div and input field respectively
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div><code>
   * var radio;
   *
   * function setup() {
   *   radio = createRadio();
   *   radio.option("black");
   *   radio.option("white");
   *   radio.option("gray");
   *   radio.style('width', '60px');
   *   textAlign(CENTER);
   *   fill(255, 0, 0);
   * }
   *
   * function draw() {
   *   var val = radio.value();
   *   background(val);
   *   text(val, width/2, height/2);
   * }
   * </code></div>
   * <div><code>
   * var radio;
   *
   * function setup() {
   *   radio = createRadio();
   *   radio.option('apple', 1);
   *   radio.option('bread', 2);
   *   radio.option('juice', 3);
   *   radio.style('width', '60px');
   *   textAlign(CENTER);
   * }
   *
   * function draw() {
   *   background(200);
   *   var val = radio.value();
   *   if (val) {
   *     text('item cost is $'+val, width/2, height/2);
   *   }
   * }
   * </code></div>
   */
  p5.prototype.createRadio = function() {
    var radios = document.querySelectorAll("input[type=radio]");
    var count = 0;
    if(radios.length > 1){
      var length = radios.length;
      var prev=radios[0].name;
      var current = radios[1].name;
      count = 1;
      for(var i = 1; i < length; i++) {
        current = radios[i].name;
        if(prev != current){
          count++;
        }
        prev = current;
      }
    }
    else if (radios.length == 1){
      count = 1;
    }
    var elt = document.createElement('div');
    var self = addElement(elt, this);
    var times = -1;
    self.option = function(name, value){
      var opt = document.createElement('input');
      opt.type = 'radio';
      opt.innerHTML = name;
      if (arguments.length > 1)
        opt.value = value;
      else
        opt.value = name;
      opt.setAttribute('name',"defaultradio"+count);
      elt.appendChild(opt);
      if (name){
        times++;
        var ran = Math.random().toString(36).slice(2);
        var label = document.createElement('label');
        opt.setAttribute('id', "defaultradio"+count+"-"+times);
        label.htmlFor = "defaultradio"+count+"-"+times;
        label.appendChild(document.createTextNode(name));
        elt.appendChild(label);
      }
      return opt;
    };
    self.selected = function(){
      var length = this.elt.childNodes.length;
      if(arguments.length == 1) {
        for (var i = 0; i < length; i+=2){
          if(this.elt.childNodes[i].value == arguments[0])
            this.elt.childNodes[i].checked = true;
        }
        return this;
      } else {
        for (var i = 0; i < length; i+=2){
          if(this.elt.childNodes[i].checked == true)
            return this.elt.childNodes[i].value;
        }
      }
    };
    self.value = function(){
      var length = this.elt.childNodes.length;
      if(arguments.length == 1) {
        for (var i = 0; i < length; i+=2){
          if(this.elt.childNodes[i].value == arguments[0])
            this.elt.childNodes[i].checked = true;
        }
        return this;
      } else {
        for (var i = 0; i < length; i+=2){
          if(this.elt.childNodes[i].checked == true)
            return this.elt.childNodes[i].value;
        }
        return "";
      }
    };
    return self
  };

  /**
   * Creates an &lt;input&gt;&lt;/input&gt; element in the DOM for text input.
   * Use .size() to set the display length of the box.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createInput
   * @param  {Number} [value] default value of the input box
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * function setup(){
   *   var inp = createInput('');
   *   inp.input(myInputEvent);
   * }
   *
   * function myInputEvent(){
   *   console.log('you are typing: ', this.value());
   * }
   *
   * </code></div>
   */
  p5.prototype.createInput = function(value) {
    var elt = document.createElement('input');
    elt.type = 'text';
    if (value) elt.value = value;
    return addElement(elt, this);
  };

  /**
   * Creates an &lt;input&gt;&lt;/input&gt; element in the DOM of type 'file'.
   * This allows users to select local files for use in a sketch.
   *
   * @method createFileInput
   * @param  {Function} [callback] callback function for when a file loaded
   * @param  {String} [multiple] optional to allow multiple files selected
   * @return {Object/p5.Element} pointer to p5.Element holding created DOM element
   */
  p5.prototype.createFileInput = function(callback, multiple) {

    // Is the file stuff supported?
    if (window.File && window.FileReader && window.FileList && window.Blob) {
      // Yup, we're ok and make an input file selector
      var elt = document.createElement('input');
      elt.type = 'file';

      // If we get a second argument that evaluates to true
      // then we are looking for multiple files
      if (multiple) {
        // Anything gets the job done
        elt.multiple = 'multiple';
      }

      // Function to handle when a file is selected
      // We're simplifying life and assuming that we always
      // want to load every selected file
      function handleFileSelect(evt) {
        // These are the files
        var files = evt.target.files;
        // Load each one and trigger a callback
        for (var i = 0; i < files.length; i++) {
          var f = files[i];
          var reader = new FileReader();
          function makeLoader(theFile) {
            // Making a p5.File object
            var p5file = new p5.File(theFile);
            return function(e) {
              p5file.data = e.target.result;
              callback(p5file);
            };
          };
          reader.onload = makeLoader(f);

          // Text or data?
          // This should likely be improved
          if (f.type.indexOf('text') > -1) {
            reader.readAsText(f);
          } else {
            reader.readAsDataURL(f);
          }
        }
      }

      // Now let's handle when a file was selected
      elt.addEventListener('change', handleFileSelect, false);
      return addElement(elt, this);
    } else {
      console.log('The File APIs are not fully supported in this browser. Cannot create element.');
    }
  };


  /** VIDEO STUFF **/

  function createMedia(pInst, type, src, callback) {
    var elt = document.createElement(type);

    // allow src to be empty
    var src = src || '';
    if (typeof src === 'string') {
      src = [src];
    }
    for (var i=0; i<src.length; i++) {
      var source = document.createElement('source');
      source.src = src[i];
      elt.appendChild(source);
    }
    if (typeof callback !== 'undefined') {
      var callbackHandler = function() {
        callback();
        elt.removeEventListener('canplaythrough', callbackHandler);
      }
      elt.addEventListener('canplaythrough', callbackHandler);
    }

    var c = addElement(elt, pInst, true);
    c.loadedmetadata = false;
    // set width and height onload metadata
    elt.addEventListener('loadedmetadata', function() {
      c.width = elt.videoWidth;
      c.height = elt.videoHeight;
      // set elt width and height if not set
      if (c.elt.width === 0) c.elt.width = elt.videoWidth;
      if (c.elt.height === 0) c.elt.height = elt.videoHeight;
      c.loadedmetadata = true;
    });

    return c;
  }
  /**
   * Creates an HTML5 &lt;video&gt; element in the DOM for simple playback
   * of audio/video. Shown by default, can be hidden with .hide()
   * and drawn into canvas using video(). Appends to the container
   * node if one is specified, otherwise appends to body. The first parameter
   * can be either a single string path to a video file, or an array of string
   * paths to different formats of the same video. This is useful for ensuring
   * that your video can play across different browsers, as each supports
   * different formats. See <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats">this
   * page</a> for further information about supported formats.
   *
   * @method createVideo
   * @param  {String|Array} src  path to a video file, or array of paths for
   *                             supporting different browsers
   * @param  {Object} [callback] callback function to be called upon
   *                             'canplaythrough' event fire, that is, when the
   *                             browser can play the media, and estimates that
   *                             enough data has been loaded to play the media
   *                             up to its end without having to stop for
   *                             further buffering of content
   * @return {Object/p5.Element} pointer to video p5.Element
   */
  p5.prototype.createVideo = function(src, callback) {
    return createMedia(this, 'video', src, callback);
  };

  /** AUDIO STUFF **/

  /**
   * Creates a hidden HTML5 &lt;audio&gt; element in the DOM for simple audio
   * playback. Appends to the container node if one is specified,
   * otherwise appends to body. The first parameter
   * can be either a single string path to a audio file, or an array of string
   * paths to different formats of the same audio. This is useful for ensuring
   * that your audio can play across different browsers, as each supports
   * different formats. See <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Supported_media_formats">this
   * page for further information about supported formats</a>.
   *
   * @method createAudio
   * @param  {String|Array} src  path to an audio file, or array of paths for
   *                             supporting different browsers
   * @param  {Object} [callback] callback function to be called upon
   *                             'canplaythrough' event fire, that is, when the
   *                             browser can play the media, and estimates that
   *                             enough data has been loaded to play the media
   *                             up to its end without having to stop for
   *                             further buffering of content
   * @return {Object/p5.Element} pointer to audio p5.Element
   */
  p5.prototype.createAudio = function(src, callback) {
    return createMedia(this, 'audio', src, callback);
  };


  /** CAMERA STUFF **/

  p5.prototype.VIDEO = 'video';
  p5.prototype.AUDIO = 'audio';

  navigator.getUserMedia  = navigator.getUserMedia ||
                            navigator.webkitGetUserMedia ||
                            navigator.mozGetUserMedia ||
                            navigator.msGetUserMedia;

  /**
   * <p>Creates a new &lt;video&gt; element that contains the audio/video feed
   * from a webcam. This can be drawn onto the canvas using video().</p>
   * <p>More specific properties of the feed can be passing in a Constraints object.
   * See the
   * <a href="http://w3c.github.io/mediacapture-main/getusermedia.html#media-track-constraints"> W3C
   * spec</a> for possible properties. Note that not all of these are supported
   * by all browsers.</p>
   * <p>Security note: A new browser security specification requires that getUserMedia,
   * which is behind createCapture(), only works when you're running the code locally,
   * or on HTTPS. Learn more <a href="http://stackoverflow.com/questions/34197653/getusermedia-in-chrome-47-without-using-https">here</a>
   * and <a href="https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia">here</a>.</p>
   *
   * @method createCapture
   * @param  {String|Constant|Object}   type type of capture, either VIDEO or
   *                                    AUDIO if none specified, default both,
   *                                    or a Constraints object
   * @param  {Function}                 callback function to be called once
   *                                    stream has loaded
   * @return {Object/p5.Element} capture video p5.Element
   * @example
   * <div class='norender'><code>
   * var capture;
   *
   * function setup() {
   *   createCanvas(480, 120);
   *   capture = createCapture(VIDEO);
   * }
   *
   * function draw() {
   *   image(capture, 0, 0, width, width*capture.height/capture.width);
   *   filter(INVERT);
   * }
   * </code></div>
   * <div class='norender'><code>
   * function setup() {
   *   createCanvas(480, 120);
   *   var constraints = {
   *     video: {
   *       mandatory: {
   *         minWidth: 1280,
   *         minHeight: 720
   *       },
   *       optional: [
   *         { maxFrameRate: 10 }
   *       ]
   *     },
   *     audio: true
   *   };
   *   createCapture(constraints, function(stream) {
   *     console.log(stream);
   *   });
   * }
   * </code></div>
   */
  p5.prototype.createCapture = function() {
    var useVideo = true;
    var useAudio = true;
    var constraints;
    var cb;
    for (var i=0; i<arguments.length; i++) {
      if (arguments[i] === p5.prototype.VIDEO) {
        useAudio = false;
      } else if (arguments[i] === p5.prototype.AUDIO) {
        useVideo = false;
      } else if (typeof arguments[i] === 'object') {
        constraints = arguments[i];
      } else if (typeof arguments[i] === 'function') {
        cb = arguments[i];
      }
    }

    if (navigator.getUserMedia) {
      var elt = document.createElement('video');

      if (!constraints) {
        constraints = {video: useVideo, audio: useAudio};
      }

      navigator.getUserMedia(constraints, function(stream) {
        elt.src = window.URL.createObjectURL(stream);
          if (cb) {
            cb(stream);
          }
      }, function(e) { console.log(e); });
    } else {
      throw 'getUserMedia not supported in this browser';
    }
    var c = addElement(elt, this, true);
    c.loadedmetadata = false;
    // set width and height onload metadata
    elt.addEventListener('loadedmetadata', function() {
      elt.play();
      c.width = c.elt.width = elt.videoWidth;
      c.height = c.elt.height = elt.videoHeight;
      c.loadedmetadata = true;
    });
    return c;
  };

  /**
   * Creates element with given tag in the DOM with given content.
   * Appends to the container node if one is specified, otherwise
   * appends to body.
   *
   * @method createElement
   * @param  {String} tag tag for the new element
   * @param  {String} [content] html content to be inserted into the element
   * @return {Object/p5.Element} pointer to p5.Element holding created node
   * @example
   * <div class='norender'><code>
   * var h2 = createElement('h2','im an h2 p5.element!');
   * </code></div>
   */
  p5.prototype.createElement = function(tag, content) {
    var elt = document.createElement(tag);
    if (typeof content !== 'undefined') {
      elt.innerHTML = content;
    }
    return addElement(elt, this);
  };


// =============================================================================
//                         p5.Element additions
// =============================================================================
  /**
   *
   * Adds specified class to the element.
   *
   * @for p5.Element
   * @method addClass
   * @param  {String} class name of class to add
   * @return {Object/p5.Element}
   * @example
   * <div class='norender'><code>
   * var div = createDiv('div');
   * div.addClass('myClass');
   * </code></div>
   */
  p5.Element.prototype.addClass = function(c) {
    if (this.elt.className) {
      // PEND don't add class more than once
      //var regex = new RegExp('[^a-zA-Z\d:]?'+c+'[^a-zA-Z\d:]?');
      //if (this.elt.className.search(/[^a-zA-Z\d:]?hi[^a-zA-Z\d:]?/) === -1) {
      this.elt.className = this.elt.className+' '+c;
      //}
    } else {
      this.elt.className = c;
    }
    return this;
  }

  /**
   *
   * Removes specified class from the element.
   *
   * @method removeClass
   * @param  {String} class name of class to remove
   * @return {Object/p5.Element}
   */
  p5.Element.prototype.removeClass = function(c) {
    var regex = new RegExp('(?:^|\\s)'+c+'(?!\\S)');
    this.elt.className = this.elt.className.replace(regex, '');
    this.elt.className = this.elt.className.replace(/^\s+|\s+$/g, ""); //prettify (optional)
    return this;
  }

  /**
   *
   * Attaches the element  as a child to the parent specified.
   * Accepts either a string ID, DOM node, or p5.Element.
   * If no argument is specified, an array of children DOM nodes is returned.
   *
   * @method child
   * @param  {String|Object|p5.Element} [child] the ID, DOM node, or p5.Element
   *                         to add to the current element
   * @return {p5.Element}
   * @example
   * <div class='norender'><code>
   * var div0 = createDiv('this is the parent');
   * var div1 = createDiv('this is the child');
   * div0.child(div1); // use p5.Element
   * </code></div>
   * <div class='norender'><code>
   * var div0 = createDiv('this is the parent');
   * var div1 = createDiv('this is the child');
   * div1.id('apples');
   * div0.child('apples'); // use id
   * </code></div>
   * <div class='norender'><code>
   * var div0 = createDiv('this is the parent');
   * var elt = document.getElementById('myChildDiv');
   * div0.child(elt); // use element from page
   * </code></div>
   */
  p5.Element.prototype.child = function(c) {
    if (c === null){
      return this.elt.childNodes
    }
    if (typeof c === 'string') {
      if (c[0] === '#') {
        c = c.substring(1);
      }
      c = document.getElementById(c);
    } else if (c instanceof p5.Element) {
      c = c.elt;
    }
    this.elt.appendChild(c);
    return this;
  };

  /**
   * Centers a p5 Element either vertically, horizontally,
   * or both, relative to its parent or according to
   * the body if the Element has no parent. If no argument is passed
   * the Element is aligned both vertically and horizontally.
   *
   * @param  {String} align       passing 'vertical', 'horizontal' aligns element accordingly
   * @return {Object/p5.Element} pointer to p5.Element
   * @example
   * <div><code>
   * function setup() {
   *   var div = createDiv('').size(10,10);
   *   div.style('background-color','orange');
   *   div.center();
   *
   * }
   * </code></div>
   */
  p5.Element.prototype.center = function(align) {
    var style = this.elt.style.display;
    var hidden = this.elt.style.display === 'none';
    var parentHidden = this.parent().style.display === 'none';
    var pos = { x : this.elt.offsetLeft, y : this.elt.offsetTop };

    if (hidden) this.show();

    this.elt.style.display = 'block';
    this.position(0,0);

    if (parentHidden) this.parent().style.display = 'block';

    var wOffset = Math.abs(this.parent().offsetWidth - this.elt.offsetWidth);
    var hOffset = Math.abs(this.parent().offsetHeight - this.elt.offsetHeight);
    var y = pos.y;
    var x = pos.x;

    if (align === 'both' || align === undefined){
      this.position(wOffset/2, hOffset/2);
    }else if (align === 'horizontal'){
      this.position(wOffset/2, y);
    }else if (align === 'vertical'){
      this.position(x, hOffset/2);
    }

    this.style('display', style);

    if (hidden) this.hide();

    if (parentHidden) this.parent().style.display = 'none';

    return this;
  };

  /**
   *
   * If an argument is given, sets the inner HTML of the element,
   * replacing any existing html. If no arguments are given, returns
   * the inner HTML of the element.
   *
   * @for p5.Element
   * @method html
   * @param  {String} [html] the HTML to be placed inside the element
   * @return {Object/p5.Element|String}
   * @example
   * <div class='norender'><code>
   * var div = createDiv('').size(100,100);
   * div.style('background-color','orange');
   * div.html('hi');
   * </code></div>
   */
  p5.Element.prototype.html = function(html) {
    if (typeof html !== 'undefined') {
      this.elt.innerHTML = html;
      return this;
    } else {
      return this.elt.innerHTML;
    }
  };

  /**
   *
   * Sets the position of the element relative to (0, 0) of the
   * window. Essentially, sets position:absolute and left and top
   * properties of style. If no arguments given returns the x and y position
   * of the element in an object.
   *
   * @method position
   * @param  {Number} [x] x-position relative to upper left of window
   * @param  {Number} [y] y-position relative to upper left of window
   * @return {Object/p5.Element}
   * @example
   * <div><code class='norender'>
   * function setup() {
   *   var cnv = createCanvas(100, 100);
   *   // positions canvas 50px to the right and 100px
   *   // below upper left corner of the window
   *   cnv.position(50, 100);
   * }
   * </code></div>
   */
  p5.Element.prototype.position = function() {
    if (arguments.length === 0){
      return { 'x' : this.elt.offsetLeft , 'y' : this.elt.offsetTop };
    }else{
      this.elt.style.position = 'absolute';
      this.elt.style.left = arguments[0]+'px';
      this.elt.style.top = arguments[1]+'px';
      this.x = arguments[0];
      this.y = arguments[1];
      return this;
    }
  };

  /* Helper method called by p5.Element.style() */
  p5.Element.prototype._translate = function(){
    this.elt.style.position = 'absolute';
    // save out initial non-translate transform styling
    var transform = '';
    if (this.elt.style.transform) {
      transform = this.elt.style.transform.replace(/translate3d\(.*\)/g, '');
      transform = transform.replace(/translate[X-Z]?\(.*\)/g, '');
    }
    if (arguments.length === 2) {
      this.elt.style.transform = 'translate('+arguments[0]+'px, '+arguments[1]+'px)';
    } else if (arguments.length > 2) {
      this.elt.style.transform = 'translate3d('+arguments[0]+'px,'+arguments[1]+'px,'+arguments[2]+'px)';
      if (arguments.length === 3) {
        this.elt.parentElement.style.perspective = '1000px';
      } else {
        this.elt.parentElement.style.perspective = arguments[3]+'px';
      }
    }
    // add any extra transform styling back on end
    this.elt.style.transform += transform;
    return this;
  };

  /* Helper method called by p5.Element.style() */
  p5.Element.prototype._rotate = function(){
    // save out initial non-rotate transform styling
    var transform = '';
    if (this.elt.style.transform) {
      var transform = this.elt.style.transform.replace(/rotate3d\(.*\)/g, '');
      transform = transform.replace(/rotate[X-Z]?\(.*\)/g, '');
    }

    if (arguments.length === 1){
      this.elt.style.transform = 'rotate('+arguments[0]+'deg)';
    }else if (arguments.length === 2){
      this.elt.style.transform = 'rotate('+arguments[0]+'deg, '+arguments[1]+'deg)';
    }else if (arguments.length === 3){
      this.elt.style.transform = 'rotateX('+arguments[0]+'deg)';
      this.elt.style.transform += 'rotateY('+arguments[1]+'deg)';
      this.elt.style.transform += 'rotateZ('+arguments[2]+'deg)';
    }
    // add remaining transform back on
    this.elt.style.transform += transform;
    return this;
  };

  /**
   * Sets the given style (css) property (1st arg) of the element with the
   * given value (2nd arg). If a single argument is given, .style()
   * returns the value of the given property; however, if the single argument
   * is given in css syntax ('text-align:center'), .style() sets the css
   * appropriatly. .style() also handles 2d and 3d css transforms. If
   * the 1st arg is 'rotate', 'translate', or 'position', the following arguments
   * accept Numbers as values. ('translate', 10, 100, 50);
   *
   * @method style
   * @param  {String} property   property to be set
   * @param  {String|Number|p5.Color} [value]   value to assign to property
   * @param  {String|Number} [value]   value to assign to property (rotate/translate)
   * @param  {String|Number} [value]   value to assign to property (rotate/translate)
   * @param  {String|Number} [value]   value to assign to property (translate)
   * @return {String|Object/p5.Element} value of property, if no value is specified
   * or p5.Element
   * @example
   * <div><code class="norender">
   * var myDiv = createDiv("I like pandas.");
   * myDiv.style("font-size", "18px");
   * myDiv.style("color", "#ff0000");
   * </code></div>
   * <div><code class="norender">
   * var col = color(25,23,200,50);
   * var button = createButton("button");
   * button.style("background-color", col);
   * button.position(10, 10);
   * </code></div>
   * <div><code class="norender">
   * var myDiv = createDiv("I like lizards.");
   * myDiv.style("position", 20, 20);
   * myDiv.style("rotate", 45);
   * </code></div>
   * <div><code class="norender">
   * var myDiv;
   * function setup() {
   *   background(200);
   *   myDiv = createDiv("I like gray.");
   *   myDiv.position(20, 20);
   * }
   *
   * function draw() {
   *   myDiv.style("font-size", mouseX+"px");
   * }
   * </code></div>
   */
  p5.Element.prototype.style = function(prop, val) {
    var self = this;

    if (val instanceof p5.Color) {
      val = 'rgba(' + val.levels[0] + ',' + val.levels[1] + ',' + val.levels[2] + ',' + val.levels[3]/255 + ')'
    }

    if (typeof val === 'undefined') {
      if (prop.indexOf(':') === -1) {
        var styles = window.getComputedStyle(self.elt);
        var style = styles.getPropertyValue(prop);
        return style;
      } else {
        var attrs = prop.split(';');
        for (var i = 0; i < attrs.length; i++) {
          var parts = attrs[i].split(':');
          if (parts[0] && parts[1]) {
            this.elt.style[parts[0].trim()] = parts[1].trim();
          }
        }
      }
    } else {
      if (prop === 'rotate' || prop === 'translate' || prop === 'position'){
        var trans = Array.prototype.shift.apply(arguments);
        var f = this[trans] || this['_'+trans];
        f.apply(this, arguments);
      } else {
        this.elt.style[prop] = val;
        if (prop === 'width' || prop === 'height' || prop === 'left' || prop === 'top') {
          var numVal = val.replace(/\D+/g, '');
          this[prop] = parseInt(numVal, 10); // pend: is this necessary?
        }
      }
    }
    return this;
  };


  /**
   *
   * Adds a new attribute or changes the value of an existing attribute
   * on the specified element. If no value is specified, returns the
   * value of the given attribute, or null if attribute is not set.
   *
   * @method attribute
   * @param  {String} attr       attribute to set
   * @param  {String} [value]    value to assign to attribute
   * @return {String|Object/p5.Element} value of attribute, if no value is
   *                             specified or p5.Element
   * @example
   * <div class="norender"><code>
   * var myDiv = createDiv("I like pandas.");
   * myDiv.attribute("align", "center");
   * </code></div>
   */
  p5.Element.prototype.attribute = function(attr, value) {
    if (typeof value === 'undefined') {
      return this.elt.getAttribute(attr);
    } else {
      this.elt.setAttribute(attr, value);
      return this;
    }
  };


  /**
   *
   * Removes an attribute on the specified element.
   *
   * @method removeAttribute
   * @param  {String} attr       attribute to remove
   * @return {Object/p5.Element}
   *
   * @example
   * <div><code>
   * var button;
   * var checkbox;
   *
   * function setup() {
   *   checkbox = createCheckbox('enable', true);
   *   checkbox.changed(enableButton);
   *   button = createButton('button');
   *   button.position(10, 10);
   * }
   *
   * function enableButton() {
   *   if( this.checked() ) {
   *     // Re-enable the button
   *     button.removeAttribute('disabled');
   *   } else {
   *     // Disable the button
   *     button.attribute('disabled','');
   *   }
   * }
   * </code></div>
   */
  p5.Element.prototype.removeAttribute = function(attr) {
    this.elt.removeAttribute(attr);
    return this;
  };


  /**
   * Either returns the value of the element if no arguments
   * given, or sets the value of the element.
   *
   * @method value
   * @param  {String|Number}     [value]
   * @return {String|Object/p5.Element} value of element if no value is specified or p5.Element
   * @example
   * <div class='norender'><code>
   * // gets the value
   * var inp;
   * function setup() {
   *   inp = createInput('');
   * }
   *
   * function mousePressed() {
   *   print(inp.value());
   * }
   * </code></div>
   * <div class='norender'><code>
   * // sets the value
   * var inp;
   * function setup() {
   *   inp = createInput('myValue');
   * }
   *
   * function mousePressed() {
   *   inp.value("myValue");
   * }
   * </code></div>
   */
  p5.Element.prototype.value = function() {
    if (arguments.length > 0) {
      this.elt.value = arguments[0];
      return this;
    } else {
      if (this.elt.type === 'range') {
        return parseFloat(this.elt.value);
      }
      else return this.elt.value;
    }
  };

  /**
   *
   * Shows the current element. Essentially, setting display:block for the style.
   *
   * @method show
   * @return {Object/p5.Element}
   * @example
   * <div class='norender'><code>
   * var div = createDiv('div');
   * div.style("display", "none");
   * div.show(); // turns display to block
   * </code></div>
   */
  p5.Element.prototype.show = function() {
    this.elt.style.display = 'block';
    return this;
  };

  /**
   * Hides the current element. Essentially, setting display:none for the style.
   *
   * @method hide
   * @return {Object/p5.Element}
   * @example
   * <div class='norender'><code>
   * var div = createDiv('this is a div');
   * div.hide();
   * </code></div>
   */
  p5.Element.prototype.hide = function() {
    this.elt.style.display = 'none';
    return this;
  };

  /**
   *
   * Sets the width and height of the element. AUTO can be used to
   * only adjust one dimension. If no arguments given returns the width and height
   * of the element in an object.
   *
   * @method size
   * @param  {Number} [w] width of the element
   * @param  {Number} [h] height of the element
   * @return {Object/p5.Element}
   * @example
   * <div class='norender'><code>
   * var div = createDiv('this is a div');
   * div.size(100, 100);
   * </code></div>
   */
  p5.Element.prototype.size = function(w, h) {
    if (arguments.length === 0){
      return { 'width' : this.elt.offsetWidth , 'height' : this.elt.offsetHeight };
    }else{
      var aW = w;
      var aH = h;
      var AUTO = p5.prototype.AUTO;
      if (aW !== AUTO || aH !== AUTO) {
        if (aW === AUTO) {
          aW = h * this.width / this.height;
        } else if (aH === AUTO) {
          aH = w * this.height / this.width;
        }
        // set diff for cnv vs normal div
        if (this.elt instanceof HTMLCanvasElement) {
          var j = {};
          var k  = this.elt.getContext('2d');
          for (var prop in k) {
            j[prop] = k[prop];
          }
          this.elt.setAttribute('width', aW * this._pInst._pixelDensity);
          this.elt.setAttribute('height', aH * this._pInst._pixelDensity);
          this.elt.setAttribute('style', 'width:' + aW + 'px; height:' + aH + 'px');
          this._pInst.scale(this._pInst._pixelDensity, this._pInst._pixelDensity);
          for (var prop in j) {
            this.elt.getContext('2d')[prop] = j[prop];
          }
        } else {
          this.elt.style.width = aW+'px';
          this.elt.style.height = aH+'px';
          this.elt.width = aW;
          this.elt.height = aH;
          this.width = aW;
          this.height = aH;
        }

        this.width = this.elt.offsetWidth;
        this.height = this.elt.offsetHeight;

        if (this._pInst) { // main canvas associated with p5 instance
          if (this._pInst._curElement.elt === this.elt) {
            this._pInst._setProperty('width', this.elt.offsetWidth);
            this._pInst._setProperty('height', this.elt.offsetHeight);
          }
        }
      }
      return this;
    }
  };

  /**
   * Removes the element and deregisters all listeners.
   * @method remove
   * @example
   * <div class='norender'><code>
   * var myDiv = createDiv('this is some text');
   * myDiv.remove();
   * </code></div>
   */
  p5.Element.prototype.remove = function() {
    // deregister events
    for (var ev in this._events) {
      this.elt.removeEventListener(ev, this._events[ev]);
    }
    if (this.elt.parentNode) {
      this.elt.parentNode.removeChild(this.elt);
    }
    delete(this);
  };



// =============================================================================
//                         p5.MediaElement additions
// =============================================================================


  /**
   * Extends p5.Element to handle audio and video. In addition to the methods
   * of p5.Element, it also contains methods for controlling media. It is not
   * called directly, but p5.MediaElements are created by calling createVideo,
   * createAudio, and createCapture.
   *
   * @class p5.MediaElement
   * @constructor
   * @param {String} elt DOM node that is wrapped
   * @param {Object} [pInst] pointer to p5 instance
   */
  p5.MediaElement = function(elt, pInst) {
    p5.Element.call(this, elt, pInst);

    var self = this;
    this.elt.crossOrigin = 'anonymous';

    this._prevTime = 0;
    this._cueIDCounter = 0;
    this._cues = [];
    this._pixelDensity = 1;

    /**
     *  Path to the media element source.
     *
     *  @property src
     *  @return {String} src
     */
    Object.defineProperty(self, 'src', {
      get: function() {
        var firstChildSrc = self.elt.children[0].src;
        var srcVal = self.elt.src === window.location.href ? '' : self.elt.src;
        var ret = firstChildSrc === window.location.href ? srcVal : firstChildSrc;
        return ret;
      },
      set: function(newValue) {
        for (var i = 0; i < self.elt.children.length; i++) {
          self.elt.removeChild(self.elt.children[i]);
        }
        var source = document.createElement('source');
        source.src = newValue;
        elt.appendChild(source);
        self.elt.src = newValue;
      },
    });

    // private _onended callback, set by the method: onended(callback)
    self._onended = function() {};
    self.elt.onended = function() {
      self._onended(self);
    }
  };
  p5.MediaElement.prototype = Object.create(p5.Element.prototype);




  /**
   * Play an HTML5 media element.
   *
   * @method play
   * @return {Object/p5.Element}
   */
  p5.MediaElement.prototype.play = function() {
    if (this.elt.currentTime === this.elt.duration) {
      this.elt.currentTime = 0;
    }

    if (this.elt.readyState > 1) {
      this.elt.play();
    } else {
      // in Chrome, playback cannot resume after being stopped and must reload
      this.elt.load();
      this.elt.play();
    }
    return this;
  };

  /**
   * Stops an HTML5 media element (sets current time to zero).
   *
   * @method stop
   * @return {Object/p5.Element}
   */
  p5.MediaElement.prototype.stop = function() {
    this.elt.pause();
    this.elt.currentTime = 0;
    return this;
  };

  /**
   * Pauses an HTML5 media element.
   *
   * @method pause
   * @return {Object/p5.Element}
   */
  p5.MediaElement.prototype.pause = function() {
    this.elt.pause();
    return this;
  };

  /**
   * Set 'loop' to true for an HTML5 media element, and starts playing.
   *
   * @method loop
   * @return {Object/p5.Element}
   */
  p5.MediaElement.prototype.loop = function() {
    this.elt.setAttribute('loop', true);
    this.play();
    return this;
  };
  /**
   * Set 'loop' to false for an HTML5 media element. Element will stop
   * when it reaches the end.
   *
   * @method noLoop
   * @return {Object/p5.Element}
   */
  p5.MediaElement.prototype.noLoop = function() {
    this.elt.setAttribute('loop', false);
    return this;
  };


  /**
   * Set HTML5 media element to autoplay or not.
   *
   * @method autoplay
   * @param {Boolean} autoplay whether the element should autoplay
   * @return {Object/p5.Element}
   */
  p5.MediaElement.prototype.autoplay = function(val) {
    this.elt.setAttribute('autoplay', val);
    return this;
  };

  /**
   * Sets volume for this HTML5 media element. If no argument is given,
   * returns the current volume.
   *
   * @param {Number}            [val] volume between 0.0 and 1.0
   * @return {Number|p5.MediaElement} current volume or p5.MediaElement
   * @method volume
   */
  p5.MediaElement.prototype.volume = function(val) {
    if (typeof val === 'undefined') {
      return this.elt.volume;
    } else {
      this.elt.volume = val;
    }
  };

  /**
   * If no arguments are given, returns the current playback speed of the
   * element. The speed parameter sets the speed where 2.0 will play the
   * element twice as fast, 0.5 will play at half the speed, and -1 will play
   * the element in normal speed in reverse.(Note that not all browsers support
   * backward playback and even if they do, playback might not be smooth.)
   *
   * @method speed
   * @param {Number} [speed]  speed multiplier for element playback
   * @return {Number|Object/p5.MediaElement} current playback speed or p5.MediaElement
   */
  p5.MediaElement.prototype.speed = function(val) {
    if (typeof val === 'undefined') {
      return this.elt.playbackRate;
    } else {
      this.elt.playbackRate = val;
    }
  };

  /**
   * If no arguments are given, returns the current time of the element.
   * If an argument is given the current time of the element is set to it.
   *
   * @method time
   * @param {Number} [time] time to jump to (in seconds)
   * @return {Number|Object/p5.MediaElement} current time (in seconds)
   *                                  or p5.MediaElement
   */
  p5.MediaElement.prototype.time = function(val) {
    if (typeof val === 'undefined') {
      return this.elt.currentTime;
    } else {
      this.elt.currentTime = val;
    }
  };

  /**
   * Returns the duration of the HTML5 media element.
   *
   * @method duration
   * @return {Number} duration
   */
  p5.MediaElement.prototype.duration = function() {
    return this.elt.duration;
  };
  p5.MediaElement.prototype.pixels = [];
  p5.MediaElement.prototype.loadPixels = function() {
    if (!this.canvas) {
      this.canvas = document.createElement('canvas');
      this.drawingContext = this.canvas.getContext('2d');
    }
    if (this.loadedmetadata) { // wait for metadata for w/h
      if (this.canvas.width !== this.elt.width) {
        this.canvas.width = this.elt.width;
        this.canvas.height = this.elt.height;
        this.width = this.canvas.width;
        this.height = this.canvas.height;
      }
      this.drawingContext.drawImage(this.elt, 0, 0, this.canvas.width, this.canvas.height);
      p5.Renderer2D.prototype.loadPixels.call(this);
    }
    return this;
  }
  p5.MediaElement.prototype.updatePixels =  function(x, y, w, h){
    if (this.loadedmetadata) { // wait for metadata
      p5.Renderer2D.prototype.updatePixels.call(this, x, y, w, h);
    }
    return this;
  }
  p5.MediaElement.prototype.get = function(x, y, w, h){
    if (this.loadedmetadata) { // wait for metadata
      return p5.Renderer2D.prototype.get.call(this, x, y, w, h);
    } else if (!x) {
      return new p5.Image(1, 1);
    } else {
      return [0, 0, 0, 255];
    }
  };
  p5.MediaElement.prototype.set = function(x, y, imgOrCol){
    if (this.loadedmetadata) { // wait for metadata
      p5.Renderer2D.prototype.set.call(this, x, y, imgOrCol);
    }
  };
  p5.MediaElement.prototype.copy = function(){
    p5.Renderer2D.prototype.copy.apply(this, arguments);
  };
  p5.MediaElement.prototype.mask = function(){
    this.loadPixels();
    p5.Image.prototype.mask.apply(this, arguments);
  };
  /**
   *  Schedule an event to be called when the audio or video
   *  element reaches the end. If the element is looping,
   *  this will not be called. The element is passed in
   *  as the argument to the onended callback.
   *
   *  @method  onended
   *  @param  {Function} callback function to call when the
   *                              soundfile has ended. The
   *                              media element will be passed
   *                              in as the argument to the
   *                              callback.
   *  @return {Object/p5.MediaElement}
   *  @example
   *  <div><code>
   *  function setup() {
   *    audioEl = createAudio('assets/beat.mp3');
   *    audioEl.showControls(true);
   *    audioEl.onended(sayDone);
   *  }
   *
   *  function sayDone(elt) {
   *    alert('done playing ' + elt.src );
   *  }
   *  </code></div>
   */
  p5.MediaElement.prototype.onended = function(callback) {
    this._onended = callback;
    return this;
  };


  /*** CONNECT TO WEB AUDIO API / p5.sound.js ***/

  /**
   *  Send the audio output of this element to a specified audioNode or
   *  p5.sound object. If no element is provided, connects to p5's master
   *  output. That connection is established when this method is first called.
   *  All connections are removed by the .disconnect() method.
   *
   *  This method is meant to be used with the p5.sound.js addon library.
   *
   *  @method  connect
   *  @param  {AudioNode|p5.sound object} audioNode AudioNode from the Web Audio API,
   *  or an object from the p5.sound library
   */
  p5.MediaElement.prototype.connect = function(obj) {
    var audioContext, masterOutput;

    // if p5.sound exists, same audio context
    if (typeof p5.prototype.getAudioContext === 'function') {
      audioContext = p5.prototype.getAudioContext();
      masterOutput = p5.soundOut.input;
    } else {
      try {
        audioContext = obj.context;
        masterOutput = audioContext.destination
      } catch(e) {
        throw 'connect() is meant to be used with Web Audio API or p5.sound.js'
      }
    }

    // create a Web Audio MediaElementAudioSourceNode if none already exists
    if (!this.audioSourceNode) {
      this.audioSourceNode = audioContext.createMediaElementSource(this.elt);

      // connect to master output when this method is first called
      this.audioSourceNode.connect(masterOutput);
    }

    // connect to object if provided
    if (obj) {
      if (obj.input) {
        this.audioSourceNode.connect(obj.input);
      } else {
        this.audioSourceNode.connect(obj);
      }
    }

    // otherwise connect to master output of p5.sound / AudioContext
    else {
      this.audioSourceNode.connect(masterOutput);
    }

  };

  /**
   *  Disconnect all Web Audio routing, including to master output.
   *  This is useful if you want to re-route the output through
   *  audio effects, for example.
   *
   *  @method  disconnect
   */
  p5.MediaElement.prototype.disconnect = function() {
    if (this.audioSourceNode) {
      this.audioSourceNode.disconnect();
    } else {
      throw 'nothing to disconnect';
    }
  };


  /*** SHOW / HIDE CONTROLS ***/

  /**
   *  Show the default MediaElement controls, as determined by the web browser.
   *
   *  @method  showControls
   */
  p5.MediaElement.prototype.showControls = function() {
    // must set style for the element to show on the page
    this.elt.style['text-align'] = 'inherit';
    this.elt.controls = true;
  };

  /**
   *  Hide the default mediaElement controls.
   *
   *  @method hideControls
   */
  p5.MediaElement.prototype.hideControls = function() {
    this.elt.controls = false;
  };

  /*** SCHEDULE EVENTS ***/

  /**
   *  Schedule events to trigger every time a MediaElement
   *  (audio/video) reaches a playback cue point.
   *
   *  Accepts a callback function, a time (in seconds) at which to trigger
   *  the callback, and an optional parameter for the callback.
   *
   *  Time will be passed as the first parameter to the callback function,
   *  and param will be the second parameter.
   *
   *
   *  @method  addCue
   *  @param {Number}   time     Time in seconds, relative to this media
   *                             element's playback. For example, to trigger
   *                             an event every time playback reaches two
   *                             seconds, pass in the number 2. This will be
   *                             passed as the first parameter to
   *                             the callback function.
   *  @param {Function} callback Name of a function that will be
   *                             called at the given time. The callback will
   *                             receive time and (optionally) param as its
   *                             two parameters.
   *  @param {Object} [value]    An object to be passed as the
   *                             second parameter to the
   *                             callback function.
   *  @return {Number} id ID of this cue,
   *                      useful for removeCue(id)
   *  @example
   *  <div><code>
   *  function setup() {
   *    background(255,255,255);
   *
   *    audioEl = createAudio('assets/beat.mp3');
   *    audioEl.showControls();
   *
   *    // schedule three calls to changeBackground
   *    audioEl.addCue(0.5, changeBackground, color(255,0,0) );
   *    audioEl.addCue(1.0, changeBackground, color(0,255,0) );
   *    audioEl.addCue(2.5, changeBackground, color(0,0,255) );
   *    audioEl.addCue(3.0, changeBackground, color(0,255,255) );
   *    audioEl.addCue(4.2, changeBackground, color(255,255,0) );
   *    audioEl.addCue(5.0, changeBackground, color(255,255,0) );
   *  }
   *
   *  function changeBackground(val) {
   *    background(val);
   *  }
   *  </code></div>
   */
  p5.MediaElement.prototype.addCue = function(time, callback, val) {
    var id = this._cueIDCounter++;

    var cue = new Cue(callback, time, id, val);
    this._cues.push(cue);

    if (!this.elt.ontimeupdate) {
      this.elt.ontimeupdate = this._onTimeUpdate.bind(this);
    }

    return id;
  };

  /**
   *  Remove a callback based on its ID. The ID is returned by the
   *  addCue method.
   *
   *  @method removeCue
   *  @param  {Number} id ID of the cue, as returned by addCue
   */
  p5.MediaElement.prototype.removeCue = function(id) {
    for (var i = 0; i < this._cues.length; i++) {
      var cue = this._cues[i];
      if (cue.id === id) {
        this.cues.splice(i, 1);
      }
    }

    if (this._cues.length === 0) {
      this.elt.ontimeupdate = null
    }
  };

  /**
   *  Remove all of the callbacks that had originally been scheduled
   *  via the addCue method.
   *
   *  @method  clearCues
   */
  p5.MediaElement.prototype.clearCues = function() {
    this._cues = [];
    this.elt.ontimeupdate = null;
  };

  // private method that checks for cues to be fired if events
  // have been scheduled using addCue(callback, time).
  p5.MediaElement.prototype._onTimeUpdate = function() {
    var playbackTime = this.time();

    for (var i = 0 ; i < this._cues.length; i++) {
      var callbackTime = this._cues[i].time;
      var val = this._cues[i].val;


      if (this._prevTime < callbackTime && callbackTime <= playbackTime) {

        // pass the scheduled callbackTime as parameter to the callback
        this._cues[i].callback(val);
      }

    }

    this._prevTime = playbackTime;
  };


  // Cue inspired by JavaScript setTimeout, and the
  // Tone.js Transport Timeline Event, MIT License Yotam Mann 2015 tonejs.org
  var Cue = function(callback, time, id, val) {
    this.callback = callback;
    this.time = time;
    this.id = id;
    this.val = val;
  };

// =============================================================================
//                         p5.File
// =============================================================================


  /**
   * Base class for a file
   * Using this for createFileInput
   *
   * @class p5.File
   * @constructor
   * @param {File} file File that is wrapped
   * @param {Object} [pInst] pointer to p5 instance
   */
  p5.File = function(file, pInst) {
    /**
     * Underlying File object. All normal File methods can be called on this.
     *
     * @property file
     */
    this.file = file;

    this._pInst = pInst;

    // Splitting out the file type into two components
    // This makes determining if image or text etc simpler
    var typeList = file.type.split('/');
    /**
     * File type (image, text, etc.)
     *
     * @property type
     */
    this.type = typeList[0];
    /**
     * File subtype (usually the file extension jpg, png, xml, etc.)
     *
     * @property subtype
     */
    this.subtype = typeList[1];
    /**
     * File name
     *
     * @property name
     */
    this.name = file.name;
    /**
     * File size
     *
     * @property size
     */
    this.size = file.size;

    /**
     * URL string containing image data.
     *
     * @property data
     */
    this.data = undefined;
  };

}));


================================================
FILE: 01_graphic_elements/03_initials/initials_javascript/libraries/p5.js
================================================
/*! p5.js v0.5.4 October 01, 2016 */
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.p5 = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){

},{}],2:[function(_dereq_,module,exports){
// Run-time checking of preconditions.

'use strict';

// Precondition function that checks if the given predicate is true.
// If not, it will throw an error.
exports.argument = function(predicate, message) {
    if (!predicate) {
        throw new Error(message);
    }
};

// Precondition function that checks if the given assertion is true.
// If not, it will throw an error.
exports.assert = exports.argument;

},{}],3:[function(_dereq_,module,exports){
// Drawing utility functions.

'use strict';

// Draw a line on the given context from point `x1,y1` to point `x2,y2`.
function line(ctx, x1, y1, x2, y2) {
    ctx.beginPath();
    ctx.moveTo(x1, y1);
    ctx.lineTo(x2, y2);
    ctx.stroke();
}

exports.line = line;

},{}],4:[function(_dereq_,module,exports){
// Glyph encoding

'use strict';

var cffStandardStrings = [
    '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',
    'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two',
    'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',
    'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
    'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
    'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 'sterling',
    'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle', 'quotedblleft', 'guillemotleft',
    'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 'periodcentered', 'paragraph',
    'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand',
    'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', 'ring',
    'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE',
    'ordmasculine', 'ae', 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
    'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn',
    'threequarters', 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
    'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex',
    'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
    'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute',
    'Ydieresis', 'Zcaron', 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 'eacute',
    'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute',
    'ocircumflex', 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 'ugrave',
    'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior',
    'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff', 'onedotenleader',
    'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
    'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 'threequartersemdash', 'periodsuperior',
    'questionsmall', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
    'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 'tsuperior', 'ff', 'ffi', 'ffl',
    'parenleftinferior', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall',
    'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall',
    'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall',
    'centoldstyle', 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
    'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall',
    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
    'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
    'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
    'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
    'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
    'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
    'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall',
    'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
    'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall', '001.000',
    '001.001', '001.002', '001.003', 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'];

var cffStandardEncoding = [
    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', '', '', '', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', 'quoteright',
    'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two',
    'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater',
    'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
    'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
    'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
    'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', '', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    'exclamdown', 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 'quotesingle',
    'quotedblleft', 'guillemotleft', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger',
    'daggerdbl', 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 'quotedblright',
    'guillemotright', 'ellipsis', 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 'tilde',
    'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', '', 'hungarumlaut', 'ogonek', 'caron',
    'emdash', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', '',
    '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', '', '', '', 'dotlessi', '', '',
    'lslash', 'oslash', 'oe', 'germandbls'];

var cffExpertEncoding = [
    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    '', '', '', '', 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 'dollarsuperior',
    'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader',
    'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
    'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
    'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 'questionsmall', '', 'asuperior',
    'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
    'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', '', 'ff', 'fi', 'fl', 'ffi', 'ffl',
    'parenleftinferior', '', 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall',
    'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall',
    'Msmall', 'Nsmall', 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
    'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '',
    '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
    'exclamdownsmall', 'centoldstyle', 'Lslashsmall', '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
    'Brevesmall', 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 'figuredash', 'hypheninferior',
    '', '', 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
    'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', '',
    '', 'zerosuperior', 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
    'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
    'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
    'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
    'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
    'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
    'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall',
    'Ocircumflexsmall', 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
    'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 'Ydieresissmall'];

var standardNames = [
    '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
    'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
    'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
    'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
    'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
    'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
    'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
    'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave',
    'acircumflex', 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
    'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis',
    'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section',
    'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 'dieresis', 'notequal',
    'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation',
    'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 'questiondown',
    'exclamdown', 'logicalnot', 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 'guillemotright',
    'ellipsis', 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft',
    'quotedblright', 'quoteleft', 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
    'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase',
    'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
    'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 'Ucircumflex',
    'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
    'ogonek', 'caron', 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 'Eth', 'eth',
    'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 'onesuperior', 'twosuperior', 'threesuperior',
    'onehalf', 'onequarter', 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 'scedilla',
    'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];

// This is the encoding used for fonts created from scratch.
// It loops through all glyphs and finds the appropriate unicode value.
// Since it's linear time, other encodings will be faster.
function DefaultEncoding(font) {
    this.font = font;
}

DefaultEncoding.prototype.charToGlyphIndex = function(c) {
    var code = c.charCodeAt(0);
    var glyphs = this.font.glyphs;
    if (glyphs) {
        for (var i = 0; i < glyphs.length; i += 1) {
            var glyph = glyphs.get(i);
            for (var j = 0; j < glyph.unicodes.length; j += 1) {
                if (glyph.unicodes[j] === code) {
                    return i;
                }
            }
        }
    } else {
        return null;
    }
};

function CmapEncoding(cmap) {
    this.cmap = cmap;
}

CmapEncoding.prototype.charToGlyphIndex = function(c) {
    return this.cmap.glyphIndexMap[c.charCodeAt(0)] || 0;
};

function CffEncoding(encoding, charset) {
    this.encoding = encoding;
    this.charset = charset;
}

CffEncoding.prototype.charToGlyphIndex = function(s) {
    var code = s.charCodeAt(0);
    var charName = this.encoding[code];
    return this.charset.indexOf(charName);
};

function GlyphNames(post) {
    var i;
    switch (post.version) {
    case 1:
        this.names = exports.standardNames.slice();
        break;
    case 2:
        this.names = new Array(post.numberOfGlyphs);
        for (i = 0; i < post.numberOfGlyphs; i++) {
            if (post.glyphNameIndex[i] < exports.standardNames.length) {
                this.names[i] = exports.standardNames[post.glyphNameIndex[i]];
            } else {
                this.names[i] = post.names[post.glyphNameIndex[i] - exports.standardNames.length];
            }
        }

        break;
    case 2.5:
        this.names = new Array(post.numberOfGlyphs);
        for (i = 0; i < post.numberOfGlyphs; i++) {
            this.names[i] = exports.standardNames[i + post.glyphNameIndex[i]];
        }

        break;
    case 3:
        this.names = [];
        break;
    }
}

GlyphNames.prototype.nameToGlyphIndex = function(name) {
    return this.names.indexOf(name);
};

GlyphNames.prototype.glyphIndexToName = function(gid) {
    return this.names[gid];
};

function addGlyphNames(font) {
    var glyph;
    var glyphIndexMap = font.tables.cmap.glyphIndexMap;
    var charCodes = Object.keys(glyphIndexMap);

    for (var i = 0; i < charCodes.length; i += 1) {
        var c = charCodes[i];
        var glyphIndex = glyphIndexMap[c];
        glyph = font.glyphs.get(glyphIndex);
        glyph.addUnicode(parseInt(c));
    }

    for (i = 0; i < font.glyphs.length; i += 1) {
        glyph = font.glyphs.get(i);
        if (font.cffEncoding) {
            glyph.name = font.cffEncoding.charset[i];
        } else {
            glyph.name = font.glyphNames.glyphIndexToName(i);
        }
    }
}

exports.cffStandardStrings = cffStandardStrings;
exports.cffStandardEncoding = cffStandardEncoding;
exports.cffExpertEncoding = cffExpertEncoding;
exports.standardNames = standardNames;
exports.DefaultEncoding = DefaultEncoding;
exports.CmapEncoding = CmapEncoding;
exports.CffEncoding = CffEncoding;
exports.GlyphNames = GlyphNames;
exports.addGlyphNames = addGlyphNames;

},{}],5:[function(_dereq_,module,exports){
// The Font object

'use strict';

var path = _dereq_('./path');
var sfnt = _dereq_('./tables/sfnt');
var encoding = _dereq_('./encoding');
var glyphset = _dereq_('./glyphset');

// A Font represents a loaded OpenType font file.
// It contains a set of glyphs and methods to draw text on a drawing context,
// or to get a path representing the text.
function Font(options) {
    options = options || {};

    // OS X will complain if the names are empty, so we put a single space everywhere by default.
    this.familyName = options.familyName || ' ';
    this.styleName = options.styleName || ' ';
    this.designer = options.designer || ' ';
    this.designerURL = options.designerURL || ' ';
    this.manufacturer = options.manufacturer || ' ';
    this.manufacturerURL = options.manufacturerURL || ' ';
    this.license = options.license || ' ';
    this.licenseURL = options.licenseURL || ' ';
    this.version = options.version || 'Version 0.1';
    this.description = options.description || ' ';
    this.copyright = options.copyright || ' ';
    this.trademark = options.trademark || ' ';
    this.unitsPerEm = options.unitsPerEm || 1000;
    this.ascender = options.ascender;
    this.descender = options.descender;
    this.supported = true;
    this.glyphs = new glyphset.GlyphSet(this, options.glyphs || []);
    this.encoding = new encoding.DefaultEncoding(this);
    this.tables = {};
}

// Check if the font has a glyph for the given character.
Font.prototype.hasChar = function(c) {
    return this.encoding.charToGlyphIndex(c) !== null;
};

// Convert the given character to a single glyph index.
// Note that this function assumes that there is a one-to-one mapping between
// the given character and a glyph; for complex scripts this might not be the case.
Font.prototype.charToGlyphIndex = function(s) {
    return this.encoding.charToGlyphIndex(s);
};

// Convert the given character to a single Glyph object.
// Note that this function assumes that there is a one-to-one mapping between
// the given character and a glyph; for complex scripts this might not be the case.
Font.prototype.charToGlyph = function(c) {
    var glyphIndex = this.charToGlyphIndex(c);
    var glyph = this.glyphs.get(glyphIndex);
    if (!glyph) {
        // .notdef
        glyph = this.glyphs.get(0);
    }

    return glyph;
};

// Convert the given text to a list of Glyph objects.
// Note that there is no strict one-to-one mapping between characters and
// glyphs, so the list of returned glyphs can be larger or smaller than the
// length of the given string.
Font.prototype.stringToGlyphs = function(s) {
    var glyphs = [];
    for (var i = 0; i < s.length; i += 1) {
        var c = s[i];
        glyphs.push(this.charToGlyph(c));
    }

    return glyphs;
};

Font.prototype.nameToGlyphIndex = function(name) {
    return this.glyphNames.nameToGlyphIndex(name);
};

Font.prototype.nameToGlyph = function(name) {
    var glyphIndex = this.nametoGlyphIndex(name);
    var glyph = this.glyphs.get(glyphIndex);
    if (!glyph) {
        // .notdef
        glyph = this.glyphs.get(0);
    }

    return glyph;
};

Font.prototype.glyphIndexToName = function(gid) {
    if (!this.glyphNames.glyphIndexToName) {
        return '';
    }

    return this.glyphNames.glyphIndexToName(gid);
};

// Retrieve the value of the kerning pair between the left glyph (or its index)
// and the right glyph (or its index). If no kerning pair is found, return 0.
// The kerning value gets added to the advance width when calculating the spacing
// between glyphs.
Font.prototype.getKerningValue = function(leftGlyph, rightGlyph) {
    leftGlyph = leftGlyph.index || leftGlyph;
    rightGlyph = rightGlyph.index || rightGlyph;
    var gposKerning = this.getGposKerningValue;
    return gposKerning ? gposKerning(leftGlyph, rightGlyph) :
        (this.kerningPairs[leftGlyph + ',' + rightGlyph] || 0);
};

// Helper function that invokes the given callback for each glyph in the given text.
// The callback gets `(glyph, x, y, fontSize, options)`.
Font.prototype.forEachGlyph = function(text, x, y, fontSize, options, callback) {
    if (!this.supported) {
        return;
    }

    x = x !== undefined ? x : 0;
    y = y !== undefined ? y : 0;
    fontSize = fontSize !== undefined ? fontSize : 72;
    options = options || {};
    var kerning = options.kerning === undefined ? true : options.kerning;
    var fontScale = 1 / this.unitsPerEm * fontSize;
    var glyphs = this.stringToGlyphs(text);
    for (var i = 0; i < glyphs.length; i += 1) {
        var glyph = glyphs[i];
        callback(glyph, x, y, fontSize, options);
        if (glyph.advanceWidth) {
            x += glyph.advanceWidth * fontScale;
        }

        if (kerning && i < glyphs.length - 1) {
            var kerningValue = this.getKerningValue(glyph, glyphs[i + 1]);
            x += kerningValue * fontScale;
        }
    }
};

// Create a Path object that represents the given text.
//
// text - The text to create.
// x - Horizontal position of the beginning of the text. (default: 0)
// y - Vertical position of the *baseline* of the text. (default: 0)
// fontSize - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`. (default: 72)
// Options is an optional object that contains:
// - kerning - Whether to take kerning information into account. (default: true)
//
// Returns a Path object.
Font.prototype.getPath = function(text, x, y, fontSize, options) {
    var fullPath = new path.Path();
    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
        var glyphPath = glyph.getPath(gX, gY, gFontSize);
        fullPath.extend(glyphPath);
    });

    return fullPath;
};

// Draw the text on the given drawing context.
//
// ctx - A 2D drawing context, like Canvas.
// text - The text to create.
// x - Horizontal position of the beginning of the text. (default: 0)
// y - Vertical position of the *baseline* of the text. (default: 0)
// fontSize - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`. (default: 72)
// Options is an optional object that contains:
// - kerning - Whether to take kerning information into account. (default: true)
Font.prototype.draw = function(ctx, text, x, y, fontSize, options) {
    this.getPath(text, x, y, fontSize, options).draw(ctx);
};

// Draw the points of all glyphs in the text.
// On-curve points will be drawn in blue, off-curve points will be drawn in red.
//
// ctx - A 2D drawing context, like Canvas.
// text - The text to create.
// x - Horizontal position of the beginning of the text. (default: 0)
// y - Vertical position of the *baseline* of the text. (default: 0)
// fontSize - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`. (default: 72)
// Options is an optional object that contains:
// - kerning - Whether to take kerning information into account. (default: true)
Font.prototype.drawPoints = function(ctx, text, x, y, fontSize, options) {
    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
        glyph.drawPoints(ctx, gX, gY, gFontSize);
    });
};

// Draw lines indicating important font measurements for all glyphs in the text.
// Black lines indicate the origin of the coordinate system (point 0,0).
// Blue lines indicate the glyph bounding box.
// Green line indicates the advance width of the glyph.
//
// ctx - A 2D drawing context, like Canvas.
// text - The text to create.
// x - Horizontal position of the beginning of the text. (default: 0)
// y - Vertical position of the *baseline* of the text. (default: 0)
// fontSize - Font size in pixels. We scale the glyph units by `1 / unitsPerEm * fontSize`. (default: 72)
// Options is an optional object that contains:
// - kerning - Whether to take kerning information into account. (default: true)
Font.prototype.drawMetrics = function(ctx, text, x, y, fontSize, options) {
    this.forEachGlyph(text, x, y, fontSize, options, function(glyph, gX, gY, gFontSize) {
        glyph.drawMetrics(ctx, gX, gY, gFontSize);
    });
};

// Validate
Font.prototype.validate = function() {
    var warnings = [];
    var _this = this;

    function assert(predicate, message) {
        if (!predicate) {
            warnings.push(message);
        }
    }

    function assertStringAttribute(attrName) {
        assert(_this[attrName] && _this[attrName].trim().length > 0, 'No ' + attrName + ' specified.');
    }

    // Identification information
    assertStringAttribute('familyName');
    assertStringAttribute('weightName');
    assertStringAttribute('manufacturer');
    assertStringAttribute('copyright');
    assertStringAttribute('version');

    // Dimension information
    assert(this.unitsPerEm > 0, 'No unitsPerEm specified.');
};

// Convert the font object to a SFNT data structure.
// This structure contains all the necessary tables and metadata to create a binary OTF file.
Font.prototype.toTables = function() {
    return sfnt.fontToTable(this);
};

Font.prototype.toBuffer = function() {
    var sfntTable = this.toTables();
    var bytes = sfntTable.encode();
    var buffer = new ArrayBuffer(bytes.length);
    var intArray = new Uint8Array(buffer);
    for (var i = 0; i < bytes.length; i++) {
        intArray[i] = bytes[i];
    }

    return buffer;
};

// Initiate a download of the OpenType font.
Font.prototype.download = function() {
    var fileName = this.familyName.replace(/\s/g, '') + '-' + this.styleName + '.otf';
    var buffer = this.toBuffer();

    window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
    window.requestFileSystem(window.TEMPORARY, buffer.byteLength, function(fs) {
        fs.root.getFile(fileName, {create: true}, function(fileEntry) {
            fileEntry.createWriter(function(writer) {
                var dataView = new DataView(buffer);
                var blob = new Blob([dataView], {type: 'font/opentype'});
                writer.write(blob);

                writer.addEventListener('writeend', function() {
                    // Navigating to the file will download it.
                    location.href = fileEntry.toURL();
                }, false);
            });
        });
    },

    function(err) {
        throw err;
    });
};

exports.Font = Font;

},{"./encoding":4,"./glyphset":7,"./path":10,"./tables/sfnt":25}],6:[function(_dereq_,module,exports){
// The Glyph object

'use strict';

var check = _dereq_('./check');
var draw = _dereq_('./draw');
var path = _dereq_('./path');

function getPathDefinition(glyph, path) {
    var _path = path || { commands: [] };
    return {
        configurable: true,

        get: function() {
            if (typeof _path === 'function') {
                _path = _path();
            }

            return _path;
        },

        set: function(p) {
            _path = p;
        }
    };
}

// A Glyph is an individual mark that often corresponds to a character.
// Some glyphs, such as ligatures, are a combination of many characters.
// Glyphs are the basic building blocks of a font.
//
// The `Glyph` class contains utility methods for drawing the path and its points.
function Glyph(options) {
    // By putting all the code on a prototype function (which is only declared once)
    // we reduce the memory requirements for larger fonts by some 2%
    this.bindConstructorValues(options);
}

Glyph.prototype.bindConstructorValues = function(options) {
    this.index = options.index || 0;

    // These three values cannnot be deferred for memory optimization:
    this.name = options.name || null;
    this.unicode = options.unicode || undefined;
    this.unicodes = options.unicodes || options.unicode !== undefined ? [options.unicode] : [];

    // But by binding these values only when necessary, we reduce can
    // the memory requirements by almost 3% for larger fonts.
    if (options.xMin) {
        this.xMin = options.xMin;
    }

    if (options.yMin) {
        this.yMin = options.yMin;
    }

    if (options.xMax) {
        this.xMax = options.xMax;
    }

    if (options.yMax) {
        this.yMax = options.yMax;
    }

    if (options.advanceWidth) {
        this.advanceWidth = options.advanceWidth;
    }

    // The path for a glyph is the most memory intensive, and is bound as a value
    // with a getter/setter to ensure we actually do path parsing only once the
    // path is actually needed by anything.
    Object.defineProperty(this, 'path', getPathDefinition(this, options.path));
};

Glyph.prototype.addUnicode = function(unicode) {
    if (this.unicodes.length === 0) {
        this.unicode = unicode;
    }

    this.unicodes.push(unicode);
};

// Convert the glyph to a Path we can draw on a drawing context.
//
// x - Horizontal position of the glyph. (default: 0)
// y - Vertical position of the *baseline* of the glyph. (default: 0)
// fontSize - Font size, in pixels (default: 72).
Glyph.prototype.getPath = function(x, y, fontSize) {
    x = x !== undefined ? x : 0;
    y = y !== undefined ? y : 0;
    fontSize = fontSize !== undefined ? fontSize : 72;
    var scale = 1 / this.path.unitsPerEm * fontSize;
    var p = new path.Path();
    var commands = this.path.commands;
    for (var i = 0; i < commands.length; i += 1) {
        var cmd = commands[i];
        if (cmd.type === 'M') {
            p.moveTo(x + (cmd.x * scale), y + (-cmd.y * scale));
        } else if (cmd.type === 'L') {
            p.lineTo(x + (cmd.x * scale), y + (-cmd.y * scale));
        } else if (cmd.type === 'Q') {
            p.quadraticCurveTo(x + (cmd.x1 * scale), y + (-cmd.y1 * scale),
                               x + (cmd.x * scale), y + (-cmd.y * scale));
        } else if (cmd.type === 'C') {
            p.curveTo(x + (cmd.x1 * scale), y + (-cmd.y1 * scale),
                      x + (cmd.x2 * scale), y + (-cmd.y2 * scale),
                      x + (cmd.x * scale), y + (-cmd.y * scale));
        } else if (cmd.type === 'Z') {
            p.closePath();
        }
    }

    return p;
};

// Split the glyph into contours.
// This function is here for backwards compatibility, and to
// provide raw access to the TrueType glyph outlines.
Glyph.prototype.getContours = function() {
    if (this.points === undefined) {
        return [];
    }

    var contours = [];
    var currentContour = [];
    for (var i = 0; i < this.points.length; i += 1) {
        var pt = this.points[i];
        currentContour.push(pt);
        if (pt.lastPointOfContour) {
            contours.push(currentContour);
            currentContour = [];
        }
    }

    check.argument(currentContour.length === 0, 'There are still points left in the current contour.');
    return contours;
};

// Calculate the xMin/yMin/xMax/yMax/lsb/rsb for a Glyph.
Glyph.prototype.getMetrics = function() {
    var commands = this.path.commands;
    var xCoords = [];
    var yCoords = [];
    for (var i = 0; i < commands.length; i += 1) {
        var cmd = commands[i];
        if (cmd.type !== 'Z') {
            xCoords.push(cmd.x);
            yCoords.push(cmd.y);
        }

        if (cmd.type === 'Q' || cmd.type === 'C') {
            xCoords.push(cmd.x1);
            yCoords.push(cmd.y1);
        }

        if (cmd.type === 'C') {
            xCoords.push(cmd.x2);
            yCoords.push(cmd.y2);
        }
    }

    var metrics = {
        xMin: Math.min.apply(null, xCoords),
        yMin: Math.min.apply(null, yCoords),
        xMax: Math.max.apply(null, xCoords),
        yMax: Math.max.apply(null, yCoords),
        leftSideBearing: 0
    };
    metrics.rightSideBearing = this.advanceWidth - metrics.leftSideBearing - (metrics.xMax - metrics.xMin);
    return metrics;
};

// Draw the glyph on the given context.
//
// ctx - The drawing context.
// x - Horizontal position of the glyph. (default: 0)
// y - Vertical position of the *baseline* of the glyph. (default: 0)
// fontSize - Font size, in pixels (default: 72).
Glyph.prototype.draw = function(ctx, x, y, fontSize) {
    this.getPath(x, y, fontSize).draw(ctx);
};

// Draw the points of the glyph.
// On-curve points will be drawn in blue, off-curve points will be drawn in red.
//
// ctx - The drawing context.
// x - Horizontal position of the glyph. (default: 0)
// y - Vertical position of the *baseline* of the glyph. (default: 0)
// fontSize - Font size, in pixels (default: 72).
Glyph.prototype.drawPoints = function(ctx, x, y, fontSize) {

    function drawCircles(l, x, y, scale) {
        var PI_SQ = Math.PI * 2;
        ctx.beginPath();
        for (var j = 0; j < l.length; j += 1) {
            ctx.moveTo(x + (l[j].x * scale), y + (l[j].y * scale));
            ctx.arc(x + (l[j].x * scale), y + (l[j].y * scale), 2, 0, PI_SQ, false);
        }

        ctx.closePath();
        ctx.fill();
    }

    x = x !== undefined ? x : 0;
    y = y !== undefined ? y : 0;
    fontSize = fontSize !== undefined ? fontSize : 24;
    var scale = 1 / this.path.unitsPerEm * fontSize;

    var blueCircles = [];
    var redCircles = [];
    var path = this.path;
    for (var i = 0; i < path.commands.length; i += 1) {
        var cmd = path.commands[i];
        if (cmd.x !== undefined) {
            blueCircles.push({x: cmd.x, y: -cmd.y});
        }

        if (cmd.x1 !== undefined) {
            redCircles.push({x: cmd.x1, y: -cmd.y1});
        }

        if (cmd.x2 !== undefined) {
            redCircles.push({x: cmd.x2, y: -cmd.y2});
        }
    }

    ctx.fillStyle = 'blue';
    drawCircles(blueCircles, x, y, scale);
    ctx.fillStyle = 'red';
    drawCircles(redCircles, x, y, scale);
};

// Draw lines indicating important font measurements.
// Black lines indicate the origin of the coordinate system (point 0,0).
// Blue lines indicate the glyph bounding box.
// Green line indicates the advance width of the glyph.
//
// ctx - The drawing context.
// x - Horizontal position of the glyph. (default: 0)
// y - Vertical position of the *baseline* of the glyph. (default: 0)
// fontSize - Font size, in pixels (default: 72).
Glyph.prototype.drawMetrics = function(ctx, x, y, fontSize) {
    var scale;
    x = x !== undefined ? x : 0;
    y = y !== undefined ? y : 0;
    fontSize = fontSize !== undefined ? fontSize : 24;
    scale = 1 / this.path.unitsPerEm * fontSize;
    ctx.lineWidth = 1;

    // Draw the origin
    ctx.strokeStyle = 'black';
    draw.line(ctx, x, -10000, x, 10000);
    draw.line(ctx, -10000, y, 10000, y);

    // This code is here due to memory optimization: by not using
    // defaults in the constructor, we save a notable amount of memory.
    var xMin = this.xMin || 0;
    var yMin = this.yMin || 0;
    var xMax = this.xMax || 0;
    var yMax = this.yMax || 0;
    var advanceWidth = this.advanceWidth || 0;

    // Draw the glyph box
    ctx.strokeStyle = 'blue';
    draw.line(ctx, x + (xMin * scale), -10000, x + (xMin * scale), 10000);
    draw.line(ctx, x + (xMax * scale), -10000, x + (xMax * scale), 10000);
    draw.line(ctx, -10000, y + (-yMin * scale), 10000, y + (-yMin * scale));
    draw.line(ctx, -10000, y + (-yMax * scale), 10000, y + (-yMax * scale));

    // Draw the advance width
    ctx.strokeStyle = 'green';
    draw.line(ctx, x + (advanceWidth * scale), -10000, x + (advanceWidth * scale), 10000);
};

exports.Glyph = Glyph;

},{"./check":2,"./draw":3,"./path":10}],7:[function(_dereq_,module,exports){
// The GlyphSet object

'use strict';

var _glyph = _dereq_('./glyph');

// A GlyphSet represents all glyphs available in the font, but modelled using
// a deferred glyph loader, for retrieving glyphs only once they are absolutely
// necessary, to keep the memory footprint down.
function GlyphSet(font, glyphs) {
    this.font = font;
    this.glyphs = {};
    if (Array.isArray(glyphs)) {
        for (var i = 0; i < glyphs.length; i++) {
            this.glyphs[i] = glyphs[i];
        }
    }

    this.length = (glyphs && glyphs.length) || 0;
}

GlyphSet.prototype.get = function(index) {
    if (typeof this.glyphs[index] === 'function') {
        this.glyphs[index] = this.glyphs[index]();
    }

    return this.glyphs[index];
};

GlyphSet.prototype.push = function(index, loader) {
    this.glyphs[index] = loader;
    this.length++;
};

function glyphLoader(font, index) {
    return new _glyph.Glyph({index: index, font: font});
}

/**
 * Generate a stub glyph that can be filled with all metadata *except*
 * the "points" and "path" properties, which must be loaded only once
 * the glyph's path is actually requested for text shaping.
 */

function ttfGlyphLoader(font, index, parseGlyph, data, position, buildPath) {
    return function() {
        var glyph = new _glyph.Glyph({index: index, font: font});

        glyph.path = function() {
            parseGlyph(glyph, data, position);
            var path = buildPath(font.glyphs, glyph);
            path.unitsPerEm = font.unitsPerEm;
            return path;
        };

        return glyph;
    };
}

function cffGlyphLoader(font, index, parseCFFCharstring, charstring) {
    return function() {
        var glyph = new _glyph.Glyph({index: index, font: font});

        glyph.path = function() {
            var path = parseCFFCharstring(font, glyph, charstring);
            path.unitsPerEm = font.unitsPerEm;
            return path;
        };

        return glyph;
    };
}

exports.GlyphSet = GlyphSet;
exports.glyphLoader = glyphLoader;
exports.ttfGlyphLoader = ttfGlyphLoader;
exports.cffGlyphLoader = cffGlyphLoader;

},{"./glyph":6}],8:[function(_dereq_,module,exports){
// opentype.js
// https://github.com/nodebox/opentype.js
// (c) 2015 Frederik De Bleser
// opentype.js may be freely distributed under the MIT license.

/* global ArrayBuffer, DataView, Uint8Array, XMLHttpRequest  */

'use strict';

var encoding = _dereq_('./encoding');
var _font = _dereq_('./font');
var glyph = _dereq_('./glyph');
var parse = _dereq_('./parse');
var path = _dereq_('./path');

var cmap = _dereq_('./tables/cmap');
var cff = _dereq_('./tables/cff');
var glyf = _dereq_('./tables/glyf');
var gpos = _dereq_('./tables/gpos');
var head = _dereq_('./tables/head');
var hhea = _dereq_('./tables/hhea');
var hmtx = _dereq_('./tables/hmtx');
var kern = _dereq_('./tables/kern');
var loca = _dereq_('./tables/loca');
var maxp = _dereq_('./tables/maxp');
var _name = _dereq_('./tables/name');
var os2 = _dereq_('./tables/os2');
var post = _dereq_('./tables/post');

// File loaders /////////////////////////////////////////////////////////

// Convert a Node.js Buffer to an ArrayBuffer
function toArrayBuffer(buffer) {
    var arrayBuffer = new ArrayBuffer(buffer.length);
    var data = new Uint8Array(arrayBuffer);
    for (var i = 0; i < buffer.length; i += 1) {
        data[i] = buffer[i];
    }

    return arrayBuffer;
}

function loadFromFile(path, callback) {
    var fs = _dereq_('fs');
    fs.readFile(path, function(err, buffer) {
        if (err) {
            return callback(err.message);
        }

        callback(null, toArrayBuffer(buffer));
    });
}

function loadFromUrl(url, callback) {
    var request = new XMLHttpRequest();
    request.open('get', url, true);
    request.responseType = 'arraybuffer';
    request.onload = function() {
        if (request.status !== 200) {
            return callback('Font could not be loaded: ' + request.statusText);
        }

        return callback(null, request.response);
    };

    request.send();
}

// Public API ///////////////////////////////////////////////////////////

// Parse the OpenType file data (as an ArrayBuffer) and return a Font object.
// If the file could not be parsed (most likely because it contains Postscript outlines)
// we return an empty Font object with the `supported` flag set to `false`.
function parseBuffer(buffer) {
    var indexToLocFormat;
    var hmtxOffset;
    var glyfOffset;
    var locaOffset;
    var cffOffset;
    var kernOffset;
    var gposOffset;

    // OpenType fonts use big endian byte ordering.
    // We can't rely on typed array view types, because they operate with the endianness of the host computer.
    // Instead we use DataViews where we can specify endianness.

    var font = new _font.Font();
    var data = new DataView(buffer, 0);

    var version = parse.getFixed(data, 0);
    if (version === 1.0) {
        font.outlinesFormat = 'truetype';
    } else {
        version = parse.getTag(data, 0);
        if (version === 'OTTO') {
            font.outlinesFormat = 'cff';
        } else {
            throw new Error('Unsupported OpenType version ' + version);
        }
    }

    var numTables = parse.getUShort(data, 4);

    // Offset into the table records.
    var p = 12;
    for (var i = 0; i < numTables; i += 1) {
        var tag = parse.getTag(data, p);
        var offset = parse.getULong(data, p + 8);
        switch (tag) {
        case 'cmap':
            font.tables.cmap = cmap.parse(data, offset);
            font.encoding = new encoding.CmapEncoding(font.tables.cmap);
            if (!font.encoding) {
                font.supported = false;
            }

            break;
        case 'head':
            font.tables.head = head.parse(data, offset);
            font.unitsPerEm = font.tables.head.unitsPerEm;
            indexToLocFormat = font.tables.head.indexToLocFormat;
            break;
        case 'hhea':
            font.tables.hhea = hhea.parse(data, offset);
            font.ascender = font.tables.hhea.ascender;
            font.descender = font.tables.hhea.descender;
            font.numberOfHMetrics = font.tables.hhea.numberOfHMetrics;
            break;
        case 'hmtx':
            hmtxOffset = offset;
            break;
        case 'maxp':
            font.tables.maxp = maxp.parse(data, offset);
            font.numGlyphs = font.tables.maxp.numGlyphs;
            break;
        case 'name':
            font.tables.name = _name.parse(data, offset);
            font.familyName = font.tables.name.fontFamily;
            font.styleName = font.tables.name.fontSubfamily;
            break;
        case 'OS/2':
            font.tables.os2 = os2.parse(data, offset);
            break;
        case 'post':
            font.tables.post = post.parse(data, offset);
            font.glyphNames = new encoding.GlyphNames(font.tables.post);
            break;
        case 'glyf':
            glyfOffset = offset;
            break;
        case 'loca':
            locaOffset = offset;
            break;
        case 'CFF ':
            cffOffset = offset;
            break;
        case 'kern':
            kernOffset = offset;
            break;
        case 'GPOS':
            gposOffset = offset;
            break;
        }
        p += 16;
    }

    if (glyfOffset && locaOffset) {
        var shortVersion = indexToLocFormat === 0;
        var locaTable = loca.parse(data, locaOffset, font.numGlyphs, shortVersion);
        font.glyphs = glyf.parse(data, glyfOffset, locaTable, font);
        hmtx.parse(data, hmtxOffset, font.numberOfHMetrics, font.numGlyphs, font.glyphs);
        encoding.addGlyphNames(font);
    } else if (cffOffset) {
        cff.parse(data, cffOffset, font);
        encoding.addGlyphNames(font);
    } else {
        font.supported = false;
    }

    if (font.supported) {
        if (kernOffset) {
            font.kerningPairs = kern.parse(data, kernOffset);
        } else {
            font.kerningPairs = {};
        }

        if (gposOffset) {
            gpos.parse(data, gposOffset, font);
        }
    }

    return font;
}

// Asynchronously load the font from a URL or a filesystem. When done, call the callback
// with two arguments `(err, font)`. The `err` will be null on success,
// the `font` is a Font object.
//
// We use the node.js callback convention so that
// opentype.js can integrate with frameworks like async.js.
function load(url, callback) {
    var isNode = typeof window === 'undefined';
    var loadFn = isNode ? loadFromFile : loadFromUrl;
    loadFn(url, function(err, arrayBuffer) {
        if (err) {
            return callback(err);
        }

        var font = parseBuffer(arrayBuffer);
        if (!font.supported) {
            return callback('Font is not supported (is this a Postscript font?)');
        }

        return callback(null, font);
    });
}

exports._parse = parse;
exports.Font = _font.Font;
exports.Glyph = glyph.Glyph;
exports.Path = path.Path;
exports.parse = parseBuffer;
exports.load = load;

},{"./encoding":4,"./font":5,"./glyph":6,"./parse":9,"./path":10,"./tables/cff":12,"./tables/cmap":13,"./tables/glyf":14,"./tables/gpos":15,"./tables/head":16,"./tables/hhea":17,"./tables/hmtx":18,"./tables/kern":19,"./tables/loca":20,"./tables/maxp":21,"./tables/name":22,"./tables/os2":23,"./tables/post":24,"fs":1}],9:[function(_dereq_,module,exports){
// Parsing utility functions

'use strict';

// Retrieve an unsigned byte from the DataView.
exports.getByte = function getByte(dataView, offset) {
    return dataView.getUint8(offset);
};

exports.getCard8 = exports.getByte;

// Retrieve an unsigned 16-bit short from the DataView.
// The value is stored in big endian.
exports.getUShort = function(dataView, offset) {
    return dataView.getUint16(offset, false);
};

exports.getCard16 = exports.getUShort;

// Retrieve a signed 16-bit short from the DataView.
// The value is stored in big endian.
exports.getShort = function(dataView, offset) {
    return dataView.getInt16(offset, false);
};

// Retrieve an unsigned 32-bit long from the DataView.
// The value is stored in big endian.
exports.getULong = function(dataView, offset) {
    return dataView.getUint32(offset, false);
};

// Retrieve a 32-bit signed fixed-point number (16.16) from the DataView.
// The value is stored in big endian.
exports.getFixed = function(dataView, offset) {
    var decimal = dataView.getInt16(offset, false);
    var fraction = dataView.getUint16(offset + 2, false);
    return decimal + fraction / 65535;
};

// Retrieve a 4-character tag from the DataView.
// Tags are used to identify tables.
exports.getTag = function(dataView, offset) {
    var tag = '';
    for (var i = offset; i < offset + 4; i += 1) {
        tag += String.fromCharCode(dataView.getInt8(i));
    }

    return tag;
};

// Retrieve an offset from the DataView.
// Offsets are 1 to 4 bytes in length, depending on the offSize argument.
exports.getOffset = function(dataView, offset, offSize) {
    var v = 0;
    for (var i = 0; i < offSize; i += 1) {
        v <<= 8;
        v += dataView.getUint8(offset + i);
    }

    return v;
};

// Retrieve a number of bytes from start offset to the end offset from the DataView.
exports.getBytes = function(dataView, startOffset, endOffset) {
    var bytes = [];
    for (var i = startOffset; i < endOffset; i += 1) {
        bytes.push(dataView.getUint8(i));
    }

    return bytes;
};

// Convert the list of bytes to a string.
exports.bytesToString = function(bytes) {
    var s = '';
    for (var i = 0; i < bytes.length; i += 1) {
        s += String.fromCharCode(bytes[i]);
    }

    return s;
};

var typeOffsets = {
    byte: 1,
    uShort: 2,
    short: 2,
    uLong: 4,
    fixed: 4,
    longDateTime: 8,
    tag: 4
};

// A stateful parser that changes the offset whenever a value is retrieved.
// The data is a DataView.
function Parser(data, offset) {
    this.data = data;
    this.offset = offset;
    this.relativeOffset = 0;
}

Parser.prototype.parseByte = function() {
    var v = this.data.getUint8(this.offset + this.relativeOffset);
    this.relativeOffset += 1;
    return v;
};

Parser.prototype.parseChar = function() {
    var v = this.data.getInt8(this.offset + this.relativeOffset);
    this.relativeOffset += 1;
    return v;
};

Parser.prototype.parseCard8 = Parser.prototype.parseByte;

Parser.prototype.parseUShort = function() {
    var v = this.data.getUint16(this.offset + this.relativeOffset);
    this.relativeOffset += 2;
    return v;
};

Parser.prototype.parseCard16 = Parser.prototype.parseUShort;
Parser.prototype.parseSID = Parser.prototype.parseUShort;
Parser.prototype.parseOffset16 = Parser.prototype.parseUShort;

Parser.prototype.parseShort = function() {
    var v = this.data.getInt16(this.offset + this.relativeOffset);
    this.relativeOffset += 2;
    return v;
};

Parser.prototype.parseF2Dot14 = function() {
    var v = this.data.getInt16(this.offset + this.relativeOffset) / 16384;
    this.relativeOffset += 2;
    return v;
};

Parser.prototype.parseULong = function() {
    var v = exports.getULong(this.data, this.offset + this.relativeOffset);
    this.relativeOffset += 4;
    return v;
};

Parser.prototype.parseFixed = function() {
    var v = exports.getFixed(this.data, this.offset + this.relativeOffset);
    this.relativeOffset += 4;
    return v;
};

Parser.prototype.parseOffset16List =
Parser.prototype.parseUShortList = function(count) {
    var offsets = new Array(count);
    var dataView = this.data;
    var offset = this.offset + this.relativeOffset;
    for (var i = 0; i < count; i++) {
        offsets[i] = exports.getUShort(dataView, offset);
        offset += 2;
    }

    this.relativeOffset += count * 2;
    return offsets;
};

Parser.prototype.parseString = function(length) {
    var dataView = this.data;
    var offset = this.offset + this.relativeOffset;
    var string = '';
    this.relativeOffset += length;
    for (var i = 0; i < length; i++) {
        string += String.fromCharCode(dataView.getUint8(offset + i));
    }

    return string;
};

Parser.prototype.parseTag = function() {
    return this.parseString(4);
};

// LONGDATETIME is a 64-bit integer.
// JavaScript and unix timestamps traditionally use 32 bits, so we
// only take the last 32 bits.
Parser.prototype.parseLongDateTime = function() {
    var v = exports.getULong(this.data, this.offset + this.relativeOffset + 4);
    this.relativeOffset += 8;
    return v;
};

Parser.prototype.parseFixed = function() {
    var v = exports.getULong(this.data, this.offset + this.relativeOffset);
    this.relativeOffset += 4;
    return v / 65536;
};

Parser.prototype.parseVersion = function() {
    var major = exports.getUShort(this.data, this.offset + this.relativeOffset);

    // How to interpret the minor version is very vague in the spec. 0x5000 is 5, 0x1000 is 1
    // This returns the correct number if minor = 0xN000 where N is 0-9
    var minor = exports.getUShort(this.data, this.offset + this.relativeOffset + 2);
    this.relativeOffset += 4;
    return major + minor / 0x1000 / 10;
};

Parser.prototype.skip = function(type, amount) {
    if (amount === undefined) {
        amount = 1;
    }

    this.relativeOffset += typeOffsets[type] * amount;
};

exports.Parser = Parser;

},{}],10:[function(_dereq_,module,exports){
// Geometric objects

'use strict';

// A bézier path containing a set of path commands similar to a SVG path.
// Paths can be drawn on a context using `draw`.
function Path() {
    this.commands = [];
    this.fill = 'black';
    this.stroke = null;
    this.strokeWidth = 1;
}

Path.prototype.moveTo = function(x, y) {
    this.commands.push({
        type: 'M',
        x: x,
        y: y
    });
};

Path.prototype.lineTo = function(x, y) {
    this.commands.push({
        type: 'L',
        x: x,
        y: y
    });
};

Path.prototype.curveTo = Path.prototype.bezierCurveTo = function(x1, y1, x2, y2, x, y) {
    this.commands.push({
        type: 'C',
        x1: x1,
        y1: y1,
        x2: x2,
        y2: y2,
        x: x,
        y: y
    });
};

Path.prototype.quadTo = Path.prototype.quadraticCurveTo = function(x1, y1, x, y) {
    this.commands.push({
        type: 'Q',
        x1: x1,
        y1: y1,
        x: x,
        y: y
    });
};

Path.prototype.close = Path.prototype.closePath = function() {
    this.commands.push({
        type: 'Z'
    });
};

// Add the given path or list of commands to the commands of this path.
Path.prototype.extend = function(pathOrCommands) {
    if (pathOrCommands.commands) {
        pathOrCommands = pathOrCommands.commands;
    }

    Array.prototype.push.apply(this.commands, pathOrCommands);
};

// Draw the path to a 2D context.
Path.prototype.draw = function(ctx) {
    ctx.beginPath();
    for (var i = 0; i < this.commands.length; i += 1) {
        var cmd = this.commands[i];
        if (cmd.type === 'M') {
            ctx.moveTo(cmd.x, cmd.y);
        } else if (cmd.type === 'L') {
            ctx.lineTo(cmd.x, cmd.y);
        } else if (cmd.type === 'C') {
            ctx.bezierCurveTo(cmd.x1, cmd.y1, cmd.x2, cmd.y2, cmd.x, cmd.y);
        } else if (cmd.type === 'Q') {
            ctx.quadraticCurveTo(cmd.x1, cmd.y1, cmd.x, cmd.y);
        } else if (cmd.type === 'Z') {
            ctx.closePath();
        }
    }

    if (this.fill) {
        ctx.fillStyle = this.fill;
        ctx.fill();
    }

    if (this.stroke) {
        ctx.strokeStyle = this.stroke;
        ctx.lineWidth = this.strokeWidth;
        ctx.stroke();
    }
};

// Convert the Path to a string of path data instructions
// See http://www.w3.org/TR/SVG/paths.html#PathData
// Parameters:
// - decimalPlaces: The amount of decimal places for floating-point values (default: 2)
Path.prototype.toPathData = function(decimalPlaces) {
    decimalPlaces = decimalPlaces !== undefined ? decimalPlaces : 2;

    function floatToString(v) {
        if (Math.round(v) === v) {
            return '' + Math.round(v);
        } else {
            return v.toFixed(decimalPlaces);
        }
    }

    function packValues() {
        var s = '';
        for (var i = 0; i < arguments.length; i += 1) {
            var v = arguments[i];
            if (v >= 0 && i > 0) {
                s += ' ';
            }

            s += floatToString(v);
        }

        return s;
    }

    var d = '';
    for (var i = 0; i < this.commands.length; i += 1) {
        var cmd = this.commands[i];
        if (cmd.type === 'M') {
            d += 'M' + packValues(cmd.x, cmd.y);
        } else if (cmd.type === 'L') {
            d += 'L' + packValues(cmd.x, cmd.y);
        } else if (cmd.type === 'C') {
            d += 'C' + packValues(cmd.x1, cmd.y1, cmd.x2, cmd.y2, cmd.x, cmd.y);
        } else if (cmd.type === 'Q') {
            d += 'Q' + packValues(cmd.x1, cmd.y1, cmd.x, cmd.y);
        } else if (cmd.type === 'Z') {
            d += 'Z';
        }
    }

    return d;
};

// Convert the path to a SVG <path> element, as a string.
// Parameters:
// - decimalPlaces: The amount of decimal places for floating-point values (default: 2)
Path.prototype.toSVG = function(decimalPlaces) {
    var svg = '<path d="';
    svg += this.toPathData(decimalPlaces);
    svg += '"';
    if (this.fill & this.fill !== 'black') {
        if (this.fill === null) {
            svg += ' fill="none"';
        } else {
            svg += ' fill="' + this.fill + '"';
        }
    }

    if (this.stroke) {
        svg += ' stroke="' + this.stroke + '" stroke-width="' + this.strokeWidth + '"';
    }

    svg += '/>';
    return svg;
};

exports.Path = Path;

},{}],11:[function(_dereq_,module,exports){
// Table metadata

'use strict';

var check = _dereq_('./check');
var encode = _dereq_('./types').encode;
var sizeOf = _dereq_('./types').sizeOf;

function Table(tableName, fields, options) {
    var i;
    for (i = 0; i < fields.length; i += 1) {
        var field = fields[i];
        this[field.name] = field.value;
    }

    this.tableName = tableName;
    this.fields = fields;
    if (options) {
        var optionKeys = Object.keys(options);
        for (i = 0; i < optionKeys.length; i += 1) {
            var k = optionKeys[i];
            var v = options[k];
            if (this[k] !== undefined) {
                this[k] = v;
            }
        }
    }
}

Table.prototype.sizeOf = function() {
    var v = 0;
    for (var i = 0; i < this.fields.length; i += 1) {
        var field = this.fields[i];
        var value = this[field.name];
        if (value === undefined) {
            value = field.value;
        }

        if (typeof value.sizeOf === 'function') {
            v += value.sizeOf();
        } else {
            var sizeOfFunction = sizeOf[field.type];
            check.assert(typeof sizeOfFunction === 'function', 'Could not find sizeOf function for field' + field.name);
            v += sizeOfFunction(value);
        }
    }

    return v;
};

Table.prototype.encode = function() {
    return encode.TABLE(this);
};

exports.Table = Table;

},{"./check":2,"./types":26}],12:[function(_dereq_,module,exports){
// The `CFF` table contains the glyph outlines in PostScript format.
// https://www.microsoft.com/typography/OTSPEC/cff.htm
// http://download.microsoft.com/download/8/0/1/801a191c-029d-4af3-9642-555f6fe514ee/cff.pdf
// http://download.microsoft.com/download/8/0/1/801a191c-029d-4af3-9642-555f6fe514ee/type2.pdf

'use strict';

var encoding = _dereq_('../encoding');
var glyphset = _dereq_('../glyphset');
var parse = _dereq_('../parse');
var path = _dereq_('../path');
var table = _dereq_('../table');

// Custom equals function that can also check lists.
function equals(a, b) {
    if (a === b) {
        return true;
    } else if (Array.isArray(a) && Array.isArray(b)) {
        if (a.length !== b.length) {
            return false;
        }

        for (var i = 0; i < a.length; i += 1) {
            if (!equals(a[i], b[i])) {
                return false;
            }
        }

        return true;
    } else {
        return false;
    }
}

// Parse a `CFF` INDEX array.
// An index array consists of a list of offsets, then a list of objects at those offsets.
function parseCFFIndex(data, start, conversionFn) {
    //var i, objectOffset, endOffset;
    var offsets = [];
    var objects = [];
    var count = parse.getCard16(data, start);
    var i;
    var objectOffset;
    var endOffset;
    if (count !== 0) {
        var offsetSize = parse.getByte(data, start + 2);
        objectOffset = start + ((count + 1) * offsetSize) + 2;
        var pos = start + 3;
        for (i = 0; i < count + 1; i += 1) {
            offsets.push(parse.getOffset(data, pos, offsetSize));
            pos += offsetSize;
        }

        // The total size of the index array is 4 header bytes + the value of the last offset.
        endOffset = objectOffset + offsets[count];
    } else {
        endOffset = start + 2;
    }

    for (i = 0; i < offsets.length - 1; i += 1) {
        var value = parse.getBytes(data, objectOffset + offsets[i], objectOffset + offsets[i + 1]);
        if (conversionFn) {
            value = conversionFn(value);
        }

        objects.push(value);
    }

    return {objects: objects, startOffset: start, endOffset: endOffset};
}

// Parse a `CFF` DICT real value.
function parseFloatOperand(parser) {
    var s = '';
    var eof = 15;
    var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', 'E', 'E-', null, '-'];
    while (true) {
        var b = parser.parseByte();
        var n1 = b >> 4;
        var n2 = b & 15;

        if (n1 === eof) {
            break;
        }

        s += lookup[n1];

        if (n2 === eof) {
            break;
        }

        s += lookup[n2];
    }

    return parseFloat(s);
}

// Parse a `CFF` DICT operand.
function parseOperand(parser, b0) {
    var b1;
    var b2;
    var b3;
    var b4;
    if (b0 === 28) {
        b1 = parser.parseByte();
        b2 = parser.parseByte();
        return b1 << 8 | b2;
    }

    if (b0 === 29) {
        b1 = parser.parseByte();
        b2 = parser.parseByte();
        b3 = parser.parseByte();
        b4 = parser.parseByte();
        return b1 << 24 | b2 << 16 | b3 << 8 | b4;
    }

    if (b0 === 30) {
        return parseFloatOperand(parser);
    }

    if (b0 >= 32 && b0 <= 246) {
        return b0 - 139;
    }

    if (b0 >= 247 && b0 <= 250) {
        b1 = parser.parseByte();
        return (b0 - 247) * 256 + b1 + 108;
    }

    if (b0 >= 251 && b0 <= 254) {
        b1 = parser.parseByte();
        return -(b0 - 251) * 256 - b1 - 108;
    }

    throw new Error('Invalid b0 ' + b0);
}

// Convert the entries returned by `parseDict` to a proper dictionary.
// If a value is a list of one, it is unpacked.
function entriesToObject(entries) {
    var o = {};
    for (var i = 0; i < entries.length; i += 1) {
        var key = entries[i][0];
        var values = entries[i][1];
        var value;
        if (values.length === 1) {
            value = values[0];
        } else {
            value = values;
        }

        if (o.hasOwnProperty(key)) {
            throw new Error('Object ' + o + ' already has key ' + key);
        }

        o[key] = value;
    }

    return o;
}

// Parse a `CFF` DICT object.
// A dictionary contains key-value pairs in a compact tokenized format.
function parseCFFDict(data, start, size) {
    start = start !== undefined ? start : 0;
    var parser = new parse.Parser(data, start);
    var entries = [];
    var operands = [];
    size = size !== undefined ? size : data.length;

    while (parser.relativeOffset < size) {
        var op = parser.parseByte();

        // The first byte for each dict item distinguishes between operator (key) and operand (value).
        // Values <= 21 are operators.
        if (op <= 21) {
            // Two-byte operators have an initial escape byte of 12.
            if (op === 12) {
                op = 1200 + parser.parseByte();
            }

            entries.push([op, operands]);
            operands = [];
        } else {
            // Since the operands (values) come before the operators (keys), we store all operands in a list
            // until we encounter an operator.
            operands.push(parseOperand(parser, op));
        }
    }

    return entriesToObject(entries);
}

// Given a String Index (SID), return the value of the string.
// Strings below index 392 are standard CFF strings and are not encoded in the font.
function getCFFString(strings, index) {
    if (index <= 390) {
        index = encoding.cffStandardStrings[index];
    } else {
        index = strings[index - 391];
    }

    return index;
}

// Interpret a dictionary and return a new dictionary with readable keys and values for missing entries.
// This function takes `meta` which is a list of objects containing `operand`, `name` and `default`.
function interpretDict(dict, meta, strings) {
    var newDict = {};

    // Because we also want to include missing values, we start out from the meta list
    // and lookup values in the dict.
    for (var i = 0; i < meta.length; i += 1) {
        var m = meta[i];
        var value = dict[m.op];
        if (value === undefined) {
            value = m.value !== undefined ? m.value : null;
        }

        if (m.type === 'SID') {
            value = getCFFString(strings, value);
        }

        newDict[m.name] = value;
    }

    return newDict;
}

// Parse the CFF header.
function parseCFFHeader(data, start) {
    var header = {};
    header.formatMajor = parse.getCard8(data, start);
    header.formatMinor = parse.getCard8(data, start + 1);
    header.size = parse.getCard8(data, start + 2);
    header.offsetSize = parse.getCard8(data, start + 3);
    header.startOffset = start;
    header.endOffset = start + 4;
    return header;
}

var TOP_DICT_META = [
    {name: 'version', op: 0, type: 'SID'},
    {name: 'notice', op: 1, type: 'SID'},
    {name: 'copyright', op: 1200, type: 'SID'},
    {name: 'fullName', op: 2, type: 'SID'},
    {name: 'familyName', op: 3, type: 'SID'},
    {name: 'weight', op: 4, type: 'SID'},
    {name: 'isFixedPitch', op: 1201, type: 'number', value: 0},
    {name: 'italicAngle', op: 1202, type: 'number', value: 0},
    {name: 'underlinePosition', op: 1203, type: 'number', value: -100},
    {name: 'underlineThickness', op: 1204, type: 'number', value: 50},
    {name: 'paintType', op: 1205, type: 'number', value: 0},
    {name: 'charstringType', op: 1206, type: 'number', value: 2},
    {name: 'fontMatrix', op: 1207, type: ['real', 'real', 'real', 'real', 'real', 'real'], value: [0.001, 0, 0, 0.001, 0, 0]},
    {name: 'uniqueId', op: 13, type: 'number'},
    {name: 'fontBBox', op: 5, type: ['number', 'number', 'number', 'number'], value: [0, 0, 0, 0]},
    {name: 'strokeWidth', op: 1208, type: 'number', value: 0},
    {name: 'xuid', op: 14, type: [], value: null},
    {name: 'charset', op: 15, type: 'offset', value: 0},
    {name: 'encoding', op: 16, type: 'offset', value: 0},
    {name: 'charStrings', op: 17, type: 'offset', value: 0},
    {name: 'private', op: 18, type: ['number', 'offset'], value: [0, 0]}
];

var PRIVATE_DICT_META = [
    {name: 'subrs', op: 19, type: 'offset', value: 0},
    {name: 'defaultWidthX', op: 20, type: 'number', value: 0},
    {name: 'nominalWidthX', op: 21, type: 'number', value: 0}
];

// Parse the CFF top dictionary. A CFF table can contain multiple fonts, each with their own top dictionary.
// The top dictionary contains the essential metadata for the font, together with the private dictionary.
function parseCFFTopDict(data, strings) {
    var dict = parseCFFDict(data, 0, data.byteLength);
    return interpretDict(dict, TOP_DICT_META, strings);
}

// Parse the CFF private dictionary. We don't fully parse out all the values, only the ones we need.
function parseCFFPrivateDict(data, start, size, strings) {
    var dict = parseCFFDict(data, start, size);
    return interpretDict(dict, PRIVATE_DICT_META, strings);
}

// Parse the CFF charset table, which contains internal names for all the glyphs.
// This function will return a list of glyph names.
// See Adobe TN #5176 chapter 13, "Charsets".
function parseCFFCharset(data, start, nGlyphs, strings) {
    var i;
    var sid;
    var count;
    var parser = new parse.Parser(data, start);

    // The .notdef glyph is not included, so subtract 1.
    nGlyphs -= 1;
    var charset = ['.notdef'];

    var format = parser.parseCard8();
    if (format === 0) {
        for (i = 0; i < nGlyphs; i += 1) {
            sid = parser.parseSID();
            charset.push(getCFFString(strings, sid));
        }
    } else if (format === 1) {
        while (charset.length <= nGlyphs) {
            sid = parser.parseSID();
            count = parser.parseCard8();
            for (i = 0; i <= count; i += 1) {
                charset.push(getCFFString(strings, sid));
                sid += 1;
            }
        }
    } else if (format === 2) {
        while (charset.length <= nGlyphs) {
            sid = parser.parseSID();
            count = parser.parseCard16();
            for (i = 0; i <= count; i += 1) {
                charset.push(getCFFString(strings, sid));
                sid += 1;
            }
        }
    } else {
        throw new Error('Unknown charset format ' + format);
    }

    return charset;
}

// Parse the CFF encoding data. Only one encoding can be specified per font.
// See Adobe TN #5176 chapter 12, "Encodings".
function parseCFFEncoding(data, start, charset) {
    var i;
    var code;
    var enc = {};
    var parser = new parse.Parser(data, start);
    var format = parser.parseCard8();
    if (format === 0) {
        var nCodes = parser.parseCard8();
        for (i = 0; i < nCodes; i += 1) {
            code = parser.parseCard8();
            enc[code] = i;
        }
    } else if (format === 1) {
        var nRanges = parser.parseCard8();
        code = 1;
        for (i = 0; i < nRanges; i += 1) {
            var first = parser.parseCard8();
            var nLeft = parser.parseCard8();
            for (var j = first; j <= first + nLeft; j += 1) {
                enc[j] = code;
                code += 1;
            }
        }
    } else {
        throw new Error('Unknown encoding format ' + format);
    }

    return new encoding.CffEncoding(enc, charset);
}

// Take in charstring code and return a Glyph object.
// The encoding is described in the Type 2 Charstring Format
// https://www.microsoft.com/typography/OTSPEC/charstr2.htm
function parseCFFCharstring(font, glyph, code) {
    var c1x;
    var c1y;
    var c2x;
    var c2y;
    var p = new path.Path();
    var stack = [];
    var nStems = 0;
    var haveWidth = false;
    var width = font.defaultWidthX;
    var open = false;
    var x = 0;
    var y = 0;

    function newContour(x, y) {
        if (open) {
            p.closePath();
        }

        p.moveTo(x, y);
        open = true;
    }

    function parseStems() {
        var hasWidthArg;

        // The number of stem operators on the stack is always even.
        // If the value is uneven, that means a width is specified.
        hasWidthArg = stack.length % 2 !== 0;
        if (hasWidthArg && !haveWidth) {
            width = stack.shift() + font.nominalWidthX;
        }

        nStems += stack.length >> 1;
        stack.length = 0;
        haveWidth = true;
    }

    function parse(code) {
        var b1;
        var b2;
        var b3;
        var b4;
        var codeIndex;
        var subrCode;
        var jpx;
        var jpy;
        var c3x;
        var c3y;
        var c4x;
        var c4y;

        var i = 0;
        while (i < code.length) {
            var v = code[i];
            i += 1;
            switch (v) {
            case 1: // hstem
                parseStems();
                break;
            case 3: // vstem
                parseStems();
                break;
            case 4: // vmoveto
                if (stack.length > 1 && !haveWidth) {
                    width = stack.shift() + font.nominalWidthX;
                    haveWidth = true;
                }

                y += stack.pop();
                newContour(x, y);
                break;
            case 5: // rlineto
                while (stack.length > 0) {
                    x += stack.shift();
                    y += stack.shift();
                    p.lineTo(x, y);
                }

                break;
            case 6: // hlineto
                while (stack.length > 0) {
                    x += stack.shift();
                    p.lineTo(x, y);
                    if (stack.length === 0) {
                        break;
                    }

                    y += stack.shift();
                    p.lineTo(x, y);
                }

                break;
            case 7: // vlineto
                while (stack.length > 0) {
                    y += stack.shift();
                    p.lineTo(x, y);
                    if (stack.length === 0) {
                        break;
                    }

                    x += stack.shift();
                    p.lineTo(x, y);
                }

                break;
            case 8: // rrcurveto
                while (stack.length > 0) {
                    c1x = x + stack.shift();
                    c1y = y + stack.shift();
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    x = c2x + stack.shift();
                    y = c2y + stack.shift();
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                }

                break;
            case 10: // callsubr
                codeIndex = stack.pop() + font.subrsBias;
                subrCode = font.subrs[codeIndex];
                if (subrCode) {
                    parse(subrCode);
                }

                break;
            case 11: // return
                return;
            case 12: // flex operators
                v = code[i];
                i += 1;
                switch (v) {
                case 35: // flex
                    // |- dx1 dy1 dx2 dy2 dx3 dy3 dx4 dy4 dx5 dy5 dx6 dy6 fd flex (12 35) |-
                    c1x = x   + stack.shift();    // dx1
                    c1y = y   + stack.shift();    // dy1
                    c2x = c1x + stack.shift();    // dx2
                    c2y = c1y + stack.shift();    // dy2
                    jpx = c2x + stack.shift();    // dx3
                    jpy = c2y + stack.shift();    // dy3
                    c3x = jpx + stack.shift();    // dx4
                    c3y = jpy + stack.shift();    // dy4
                    c4x = c3x + stack.shift();    // dx5
                    c4y = c3y + stack.shift();    // dy5
                    x = c4x + stack.shift();      // dx6
                    y = c4y + stack.shift();      // dy6
                    stack.shift();                // flex depth
                    p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);
                    p.curveTo(c3x, c3y, c4x, c4y, x, y);
                    break;
                case 34: // hflex
                    // |- dx1 dx2 dy2 dx3 dx4 dx5 dx6 hflex (12 34) |-
                    c1x = x   + stack.shift();    // dx1
                    c1y = y;                      // dy1
                    c2x = c1x + stack.shift();    // dx2
                    c2y = c1y + stack.shift();    // dy2
                    jpx = c2x + stack.shift();    // dx3
                    jpy = c2y;                    // dy3
                    c3x = jpx + stack.shift();    // dx4
                    c3y = c2y;                    // dy4
                    c4x = c3x + stack.shift();    // dx5
                    c4y = y;                      // dy5
                    x = c4x + stack.shift();      // dx6
                    p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);
                    p.curveTo(c3x, c3y, c4x, c4y, x, y);
                    break;
                case 36: // hflex1
                    // |- dx1 dy1 dx2 dy2 dx3 dx4 dx5 dy5 dx6 hflex1 (12 36) |-
                    c1x = x   + stack.shift();    // dx1
                    c1y = y   + stack.shift();    // dy1
                    c2x = c1x + stack.shift();    // dx2
                    c2y = c1y + stack.shift();    // dy2
                    jpx = c2x + stack.shift();    // dx3
                    jpy = c2y;                    // dy3
                    c3x = jpx + stack.shift();    // dx4
                    c3y = c2y;                    // dy4
                    c4x = c3x + stack.shift();    // dx5
                    c4y = c3y + stack.shift();    // dy5
                    x = c4x + stack.shift();      // dx6
                    p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);
                    p.curveTo(c3x, c3y, c4x, c4y, x, y);
                    break;
                case 37: // flex1
                    // |- dx1 dy1 dx2 dy2 dx3 dy3 dx4 dy4 dx5 dy5 d6 flex1 (12 37) |-
                    c1x = x   + stack.shift();    // dx1
                    c1y = y   + stack.shift();    // dy1
                    c2x = c1x + stack.shift();    // dx2
                    c2y = c1y + stack.shift();    // dy2
                    jpx = c2x + stack.shift();    // dx3
                    jpy = c2y + stack.shift();    // dy3
                    c3x = jpx + stack.shift();    // dx4
                    c3y = jpy + stack.shift();    // dy4
                    c4x = c3x + stack.shift();    // dx5
                    c4y = c3y + stack.shift();    // dy5
                    if (Math.abs(c4x - x) > Math.abs(c4y - y)) {
                        x = c4x + stack.shift();
                    } else {
                        y = c4y + stack.shift();
                    }

                    p.curveTo(c1x, c1y, c2x, c2y, jpx, jpy);
                    p.curveTo(c3x, c3y, c4x, c4y, x, y);
                    break;
                default:
                    console.log('Glyph ' + glyph.index + ': unknown operator ' + 1200 + v);
                    stack.length = 0;
                }
                break;
            case 14: // endchar
                if (stack.length > 0 && !haveWidth) {
                    width = stack.shift() + font.nominalWidthX;
                    haveWidth = true;
                }

                if (open) {
                    p.closePath();
                    open = false;
                }

                break;
            case 18: // hstemhm
                parseStems();
                break;
            case 19: // hintmask
            case 20: // cntrmask
                parseStems();
                i += (nStems + 7) >> 3;
                break;
            case 21: // rmoveto
                if (stack.length > 2 && !haveWidth) {
                    width = stack.shift() + font.nominalWidthX;
                    haveWidth = true;
                }

                y += stack.pop();
                x += stack.pop();
                newContour(x, y);
                break;
            case 22: // hmoveto
                if (stack.length > 1 && !haveWidth) {
                    width = stack.shift() + font.nominalWidthX;
                    haveWidth = true;
                }

                x += stack.pop();
                newContour(x, y);
                break;
            case 23: // vstemhm
                parseStems();
                break;
            case 24: // rcurveline
                while (stack.length > 2) {
                    c1x = x + stack.shift();
                    c1y = y + stack.shift();
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    x = c2x + stack.shift();
                    y = c2y + stack.shift();
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                }

                x += stack.shift();
                y += stack.shift();
                p.lineTo(x, y);
                break;
            case 25: // rlinecurve
                while (stack.length > 6) {
                    x += stack.shift();
                    y += stack.shift();
                    p.lineTo(x, y);
                }

                c1x = x + stack.shift();
                c1y = y + stack.shift();
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                x = c2x + stack.shift();
                y = c2y + stack.shift();
                p.curveTo(c1x, c1y, c2x, c2y, x, y);
                break;
            case 26: // vvcurveto
                if (stack.length % 2) {
                    x += stack.shift();
                }

                while (stack.length > 0) {
                    c1x = x;
                    c1y = y + stack.shift();
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    x = c2x;
                    y = c2y + stack.shift();
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                }

                break;
            case 27: // hhcurveto
                if (stack.length % 2) {
                    y += stack.shift();
                }

                while (stack.length > 0) {
                    c1x = x + stack.shift();
                    c1y = y;
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    x = c2x + stack.shift();
                    y = c2y;
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                }

                break;
            case 28: // shortint
                b1 = code[i];
                b2 = code[i + 1];
                stack.push(((b1 << 24) | (b2 << 16)) >> 16);
                i += 2;
                break;
            case 29: // callgsubr
                codeIndex = stack.pop() + font.gsubrsBias;
                subrCode = font.gsubrs[codeIndex];
                if (subrCode) {
                    parse(subrCode);
                }

                break;
            case 30: // vhcurveto
                while (stack.length > 0) {
                    c1x = x;
                    c1y = y + stack.shift();
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    x = c2x + stack.shift();
                    y = c2y + (stack.length === 1 ? stack.shift() : 0);
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                    if (stack.length === 0) {
                        break;
                    }

                    c1x = x + stack.shift();
                    c1y = y;
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    y = c2y + stack.shift();
                    x = c2x + (stack.length === 1 ? stack.shift() : 0);
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                }

                break;
            case 31: // hvcurveto
                while (stack.length > 0) {
                    c1x = x + stack.shift();
                    c1y = y;
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    y = c2y + stack.shift();
                    x = c2x + (stack.length === 1 ? stack.shift() : 0);
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                    if (stack.length === 0) {
                        break;
                    }

                    c1x = x;
                    c1y = y + stack.shift();
                    c2x = c1x + stack.shift();
                    c2y = c1y + stack.shift();
                    x = c2x + stack.shift();
                    y = c2y + (stack.length === 1 ? stack.shift() : 0);
                    p.curveTo(c1x, c1y, c2x, c2y, x, y);
                }

                break;
            default:
                if (v < 32) {
                    console.log('Glyph ' + glyph.index + ': unknown operator ' + v);
                } else if (v < 247) {
                    stack.push(v - 139);
                } else if (v < 251) {
                    b1 = code[i];
                    i += 1;
                    stack.push((v - 247) * 256 + b1 + 108);
                } else if (v < 255) {
                    b1 = code[i];
                    i += 1;
                    stack.push(-(v - 251) * 256 - b1 - 108);
                } else {
                    b1 = code[i];
                    b2 = code[i + 1];
                    b3 = code[i + 2];
                    b4 = code[i + 3];
                    i += 4;
                    stack.push(((b1 << 24) | (b2 << 16) | (b3 << 8) | b4) / 65536);
                }
            }
        }
    }

    parse(code);

    glyph.advanceWidth = width;
    return p;
}

// Subroutines are encoded using the negative half of the number space.
// See type 2 chapter 4.7 "Subroutine operators".
function calcCFFSubroutineBias(subrs) {
    var bias;
    if (subrs.length < 1240) {
        bias = 107;
    } else if (subrs.length < 33900) {
        bias = 1131;
    } else {
        bias = 32768;
    }

    return bias;
}

// Parse the `CFF` table, which contains the glyph outlines in PostScript format.
function parseCFFTable(data, start, font) {
    font.tables.cff = {};
    var header = parseCFFHeader(data, start);
    var nameIndex = parseCFFIndex(data, header.endOffset, parse.bytesToString);
    var topDictIndex = parseCFFIndex(data, nameIndex.endOffset);
    var stringIndex = parseCFFIndex(data, topDictIndex.endOffset, parse.bytesToString);
    var globalSubrIndex = parseCFFIndex(data, stringIndex.endOffset);
    font.gsubrs = globalSubrIndex.objects;
    font.gsubrsBias = calcCFFSubroutineBias(font.gsubrs);

    var topDictData = new DataView(new Uint8Array(topDictIndex.objects[0]).buffer);
    var topDict = parseCFFTopDict(topDictData, stringIndex.objects);
    font.tables.cff.topDict = topDict;

    var privateDictOffset = start + topDict['private'][1];
    var privateDict = parseCFFPrivateDict(data, privateDictOffset, topDict['private'][0], stringIndex.objects);
    font.defaultWidthX = privateDict.defaultWidthX;
    font.nominalWidthX = privateDict.nominalWidthX;

    if (privateDict.subrs !== 0) {
        var subrOffset = privateDictOffset + privateDict.subrs;
        var subrIndex = parseCFFIndex(data, subrOffset);
        font.subrs = subrIndex.objects;
        font.subrsBias = calcCFFSubroutineBias(font.subrs);
    } else {
        font.subrs = [];
        font.subrsBias = 0;
    }

    // Offsets in the top dict are relative to the beginning of the CFF data, so add the CFF start offset.
    var charStringsIndex = parseCFFIndex(data, start + topDict.charStrings);
    font.nGlyphs = charStringsIndex.objects.length;

    var charset = parseCFFCharset(data, start + topDict.charset, font.nGlyphs, stringIndex.objects);
    if (topDict.encoding === 0) { // Standard encoding
        font.cffEncoding = new encoding.CffEncoding(encoding.cffStandardEncoding, charset);
    } else if (topDict.encoding === 1) { // Expert encoding
        font.cffEncoding = new encoding.CffEncoding(encoding.cffExpertEncoding, charset);
    } else {
        font.cffEncoding = parseCFFEncoding(data, start + topDict.encoding, charset);
    }

    // Prefer the CMAP encoding to the CFF encoding.
    font.encoding = font.encoding || font.cffEncoding;

    font.glyphs = new glyphset.GlyphSet(font);
    for (var i = 0; i < font.nGlyphs; i += 1) {
        var charString = charStringsIndex.objects[i];
        font.glyphs.push(i, glyphset.cffGlyphLoader(font, i, parseCFFCharstring, charString));
    }
}

// Convert a string to a String ID (SID).
// The list of strings is modified in place.
function encodeString(s, strings) {
    var sid;

    // Is the string in the CFF standard strings?
    var i = encoding.cffStandardStrings.indexOf(s);
    if (i >= 0) {
        sid = i;
    }

    // Is the string already in the string index?
    i = strings.indexOf(s);
    if (i >= 0) {
        sid = i + encoding.cffStandardStrings.length;
    } else {
        sid = encoding.cffStandardStrings.length + strings.length;
        strings.push(s);
    }

    return sid;
}

function makeHeader() {
    return new table.Table('Header', [
        {name: 'major', type: 'Card8', value: 1},
        {name: 'minor', type: 'Card8', value: 0},
        {name: 'hdrSize', type: 'Card8', value: 4},
        {name: 'major', type: 'Card8', value: 1}
    ]);
}

function makeNameIndex(fontNames) {
    var t = new table.Table('Name INDEX', [
        {name: 'names', type: 'INDEX', value: []}
    ]);
    t.names = [];
    for (var i = 0; i < fontNames.length; i += 1) {
        t.names.push({name: 'name_' + i, type: 'NAME', value: fontNames[i]});
    }

    return t;
}

// Given a dictionary's metadata, create a DICT structure.
function makeDict(meta, attrs, strings) {
    var m = {};
    for (var i = 0; i < meta.length; i += 1) {
        var entry = meta[i];
        var value = attrs[entry.name];
        if (value !== undefined && !equals(value, entry.value)) {
            if (entry.type === 'SID') {
                value = encodeString(value, strings);
            }

            m[entry.op] = {name: entry.name, type: entry.type, value: value};
        }
    }

    return m;
}

// The Top DICT houses the global font attributes.
function makeTopDict(attrs, strings) {
    var t = new table.Table('Top DICT', [
        {name: 'dict', type: 'DICT', value: {}}
    ]);
    t.dict = makeDict(TOP_DICT_META, attrs, strings);
    return t;
}

function makeTopDictIndex(topDict) {
    var t = new table.Table('Top DICT INDEX', [
        {name: 'topDicts', type: 'INDEX', value: []}
    ]);
    t.topDicts = [{name: 'topDict_0', type: 'TABLE', value: topDict}];
    return t;
}

function makeStringIndex(strings) {
    var t = new table.Table('String INDEX', [
        {name: 'strings', type: 'INDEX', value: []}
    ]);
    t.strings = [];
    for (var i = 0; i < strings.length; i += 1) {
        t.strings.push({name: 'string_' + i, type: 'STRING', value: strings[i]});
    }

    return t;
}

function makeGlobalSubrIndex() {
    // Currently we don't use subroutines.
    return new table.Table('Global Subr INDEX', [
        {name: 'subrs', type: 'INDEX', value: []}
    ]);
}

function makeCharsets(glyphNames, strings) {
    var t = new table.Table('Charsets', [
        {name: 'format', type: 'Card8', value: 0}
    ]);
    for (var i = 0; i < glyphNames.length; i += 1) {
        var glyphName = glyphNames[i];
        var glyphSID = encodeString(glyphName, strings);
        t.fields.push({name: 'glyph_' + i, type: 'SID', value: glyphSID});
    }

    return t;
}

function glyphToOps(glyph) {
    var ops = [];
    var path = glyph.path;
    ops.push({name: 'width', type: 'NUMBER', value: glyph.advanceWidth});
    var x = 0;
    var y = 0;
    for (var i = 0; i < path.commands.length; i += 1) {
        var dx;
        var dy;
        var cmd = path.commands[i];
        if (cmd.type === 'Q') {
            // CFF only supports bézier curves, so convert the quad to a bézier.
            var _13 = 1 / 3;
            var _23 = 2 / 3;

            // We're going to create a new command so we don't change the original path.
            cmd = {
                type: 'C',
                x: cmd.x,
                y: cmd.y,
                x1: _13 * x + _23 * cmd.x1,
                y1: _13 * y + _23 * cmd.y1,
                x2: _13 * cmd.x + _23 * cmd.x1,
                y2: _13 * cmd.y + _23 * cmd.y1
            };
        }

        if (cmd.type === 'M') {
            dx = Math.round(cmd.x - x);
            dy = Math.round(cmd.y - y);
            ops.push({name: 'dx', type: 'NUMBER', value: dx});
            ops.push({name: 'dy', type: 'NUMBER', value: dy});
            ops.push({name: 'rmoveto', type: 'OP', value: 21});
            x = Math.round(cmd.x);
            y = Math.round(cmd.y);
        } else if (cmd.type === 'L') {
            dx = Math.round(cmd.x - x);
            dy = Math.round(cmd.y - y);
            ops.push({name: 'dx', type: 'NUMBER', value: dx});
            ops.push({name: 'dy', type: 'NUMBER', value: dy});
            ops.push({name: 'rlineto', type: 'OP', value: 5});
            x = Math.round(cmd.x);
            y = Math.round(cmd.y);
        } else if (cmd.type === 'C') {
            var dx1 = Math.round(cmd.x1 - x);
            var dy1 = Math.round(cmd.y1 - y);
            var dx2 = Math.round(cmd.x2 - cmd.x1);
            var dy2 = Math.round(cmd.y2 - cmd.y1);
            dx = Math.round(cmd.x - cmd.x2);
            dy = Math.round(cmd.y - cmd.y2);
            ops.push({name: 'dx1', type: 'NUMBER', value: dx1});
            ops.push({name: 'dy1', type: 'NUMBER', value: dy1});
            ops.push({name: 'dx2', type: 'NUMBER', value: dx2});
            ops.push({name: 'dy2', type: 'NUMBER', value: dy2});
            ops.push({name: 'dx', type: 'NUMBER', value: dx});
            ops.push({name: 'dy', type: 'NUMBER', value: dy});
            ops.push({name: 'rrcurveto', type: 'OP', value: 8});
            x = Math.round(cmd.x);
            y = Math.round(cmd.y);
        }

        // Contours are closed automatically.

    }

    ops.push({name: 'endchar', type: 'OP', value: 14});
    return ops;
}

function makeCharStringsIndex(glyphs) {
    var t = new table.Table('CharStrings INDEX', [
        {name: 'charStrings', type: 'INDEX', value: []}
    ]);

    for (var i = 0; i < glyphs.length; i += 1) {
        var glyph = glyphs.get(i);
        var ops = glyphToOps(glyph);
        t.charStrings.push({name: glyph.name, type: 'CHARSTRING', value: ops});
    }

    return t;
}

function makePrivateDict(attrs, strings) {
    var t = new table.Table('Private DICT', [
        {name: 'dict', type: 'DICT', value: {}}
    ]);
    t.dict = makeDict(PRIVATE_DICT_META, attrs, strings);
    return t;
}

function makePrivateDictIndex(privateDict) {
    var t = new table.Table('Private DICT INDEX', [
        {name: 'privateDicts', type: 'INDEX', value: []}
    ]);
    t.privateDicts = [{name: 'privateDict_0', type: 'TABLE', value: privateDict}];
    return t;
}

function makeCFFTable(glyphs, options) {
    var t = new table.Table('CFF ', [
        {name: 'header', type: 'TABLE'},
        {name: 'nameIndex', type: 'TABLE'},
        {name: 'topDictIndex', type: 'TABLE'},
        {name: 'stringIndex', type: 'TABLE'},
        {name: 'globalSubrIndex', type: 'TABLE'},
        {name: 'charsets', type: 'TABLE'},
        {name: 'charStringsIndex', type: 'TABLE'},
        {name: 'privateDictIndex', type: 'TABLE'}
    ]);

    var fontScale = 1 / options.unitsPerEm;
    // We use non-zero values for the offsets so that the DICT encodes them.
    // This is important because the size of the Top DICT plays a role in offset calculation,
    // and the size shouldn't change after we've written correct offsets.
    var attrs = {
        version: options.version,
        fullName: options.fullName,
        familyName: options.familyName,
        weight: options.weightName,
        fontMatrix: [fontScale, 0, 0, fontScale, 0, 0],
        charset: 999,
        encoding: 0,
        charStrings: 999,
        private: [0, 999]
    };

    var privateAttrs = {};

    var glyphNames = [];
    var glyph;

    // Skip first glyph (.notdef)
    for (var i = 1; i < glyphs.length; i += 1) {
        glyph = glyphs.get(i);
        glyphNames.push(glyph.name);
    }

    var strings = [];

    t.header = makeHeader();
    t.nameIndex = makeNameIndex([options.postScriptName]);
    var topDict = makeTopDict(attrs, strings);
    t.topDictIndex = makeTopDictIndex(topDict);
    t.globalSubrIndex = makeGlobalSubrIndex();
    t.charsets = makeCharsets(glyphNames, strings);
    t.charStringsIndex = makeCharStringsIndex(glyphs);
    var privateDict = makePrivateDict(privateAttrs, strings);
    t.privateDictIndex = makePrivateDictIndex(privateDict);

    // Needs to come at the end, to encode all custom strings used in the font.
    t.stringIndex = makeStringIndex(strings);

    var startOffset = t.header.sizeOf() +
        t.nameIndex.sizeOf() +
        t.topDictIndex.sizeOf() +
        t.stringIndex.sizeOf() +
        t.globalSubrIndex.sizeOf();
    attrs.charset = startOffset;

    // We use the CFF standard encoding; proper encoding will be handled in cmap.
    attrs.encoding = 0;
    attrs.charStrings = attrs.charset + t.charsets.sizeOf();
    attrs.private[1] = attrs.charStrings + t.charStringsIndex.sizeOf();

    // Recreate the Top DICT INDEX with the correct offsets.
    topDict = makeTopDict(attrs, strings);
    t.topDictIndex = makeTopDictIndex(topDict);

    return t;
}

exports.parse = parseCFFTable;
exports.make = makeCFFTable;

},{"../encoding":4,"../glyphset":7,"../parse":9,"../path":10,"../table":11}],13:[function(_dereq_,module,exports){
// The `cmap` table stores the mappings from characters to glyphs.
// https://www.microsoft.com/typography/OTSPEC/cmap.htm

'use strict';

var check = _dereq_('../check');
var parse = _dereq_('../parse');
var table = _dereq_('../table');

// Parse the `cmap` table. This table stores the mappings from characters to glyphs.
// There are many available formats, but we only support the Windows format 4.
// This function returns a `CmapEncoding` object or null if no supported format could be found.
function parseCmapTable(data, start) {
    var i;
    var cmap = {};
    cmap.version = parse.getUShort(data, start);
    check.argument(cmap.version === 0, 'cmap table version should be 0.');

    // The cmap table can contain many sub-tables, each with their own format.
    // We're only interested in a "platform 3" table. This is a Windows format.
    cmap.numTables = parse.getUShort(data, start + 2);
    var offset = -1;
    for (i = 0; i < cmap.numTables; i += 1) {
        var platformId = parse.getUShort(data, start + 4 + (i * 8));
        var encodingId = parse.getUShort(data, start + 4 + (i * 8) + 2);
        if (platformId === 3 && (encodingId === 1 || encodingId === 0)) {
            offset = parse.getULong(data, start + 4 + (i * 8) + 4);
            break;
        }
    }

    if (offset === -1) {
        // There is no cmap table in the font that we support, so return null.
        // This font will be marked as unsupported.
        return null;
    }

    var p = new parse.Parser(data, start + offset);
    cmap.format = p.parseUShort();
    check.argument(cmap.format === 4, 'Only format 4 cmap tables are supported.');

    // Length in bytes of the sub-tables.
    cmap.length = p.parseUShort();
    cmap.language = p.parseUShort();

    // segCount is stored x 2.
    var segCount;
    cmap.segCount = segCount = p.parseUShort() >> 1;

    // Skip searchRange, entrySelector, rangeShift.
    p.skip('uShort', 3);

    // The "unrolled" mapping from character codes to glyph indices.
    cmap.glyphIndexMap = {};

    var endCountParser = new parse.Parser(data, start + offset + 14);
    var startCountParser = new parse.Parser(data, start + offset + 16 + segCount * 2);
    var idDeltaParser = new parse.Parser(data, start + offset + 16 + segCount * 4);
    var idRangeOffsetParser = new parse.Parser(data, start + offset + 16 + segCount * 6);
    var glyphIndexOffset = start + offset + 16 + segCount * 8;
    for (i = 0; i < segCount - 1; i += 1) {
        var glyphIndex;
        var endCount = endCountParser.parseUShort();
        var startCount = startCountParser.parseUShort();
        var idDelta = idDeltaParser.parseShort();
        var idRangeOffset = idRangeOffsetParser.parseUShort();
        for (var c = startCount; c <= endCount; c += 1) {
            if (idRangeOffset !== 0) {
                // The idRangeOffset is relative to the current position in the idRangeOffset array.
                // Take the current offset in the idRangeOffset array.
                glyphIndexOffset = (idRangeOffsetParser.offset + idRangeOffsetParser.relativeOffset - 2);

                // Add the value of the idRangeOffset, which will move us into the glyphIndex array.
                glyphIndexOffset += idRangeOffset;

                // Then add the character index of the current segment, multiplied by 2 for USHORTs.
                glyphIndexOffset += (c - startCount) * 2;
                glyphIndex = parse.getUShort(data, glyphIndexOffset);
                if (glyphIndex !== 0) {
                    glyphIndex = (glyphIndex + idDelta) & 0xFFFF;
                }
            } else {
                glyphIndex = (c + idDelta) & 0xFFFF;
            }

            cmap.glyphIndexMap[c] = glyphIndex;
        }
    }

    return cmap;
}

function addSegment(t, code, glyphIndex) {
    t.segments.push({
        end: code,
        start: code,
        delta: -(code - glyphIndex),
        offset: 0
    });
}

function addTerminatorSegment(t) {
    t.segments.push({
        end: 0xFFFF,
        start: 0xFFFF,
        delta: 1,
        offset: 0
    });
}

function makeCmapTable(glyphs) {
    var i;
    var t = new table.Table('cmap', [
        {name: 'version', type: 'USHORT', value: 0},
        {name: 'numTables', type: 'USHORT', value: 1},
        {name: 'platformID', type: 'USHORT', value: 3},
        {name: 'encodingID', type: 'USHORT', value: 1},
        {name: 'offset', type: 'ULONG', value: 12},
        {name: 'format', type: 'USHORT', value: 4},
        {name: 'length', type: 'USHORT', value: 0},
        {name: 'language', type: 'USHORT', value: 0},
        {name: 'segCountX2', type: 'USHORT', value: 0},
        {name: 'searchRange', type: 'USHORT', value: 0},
        {name: 'entrySelector', type: 'USHORT', value: 0},
        {name: 'rangeShift', type: 'USHORT', value: 0}
    ]);

    t.segments = [];
    for (i = 0; i < glyphs.length; i += 1) {
        var glyph = glyphs.get(i);
        for (var j = 0; j < glyph.unicodes.length; j += 1) {
            addSegment(t, glyph.unicodes[j], i);
        }

        t.segments = t.segments.sort(function(a, b) {
            return a.start - b.start;
        });
    }

    addTerminatorSegment(t);

    var segCount;
    segCount = t.segments.length;
    t.segCountX2 = segCount * 2;
    t.searchRange = Math.pow(2, Math.floor(Math.log(segCount) / Math.log(2))) * 2;
    t.entrySelector = Math.log(t.searchRange / 2) / Math.log(2);
    t.rangeShift = t.segCountX2 - t.searchRange;

    // Set up parallel segment arrays.
    var endCounts = [];
    var startCounts = [];
    var idDeltas = [];
    var idRangeOffsets = [];
    var glyphIds = [];

    for (i = 0; i < segCount; i += 1) {
        var segment = t.segments[i];
        endCounts = endCounts.concat({name: 'end_' + i, type: 'USHORT', value: segment.end});
        startCounts = startCounts.concat({name: 'start_' + i, type: 'USHORT', value: segment.start});
        idDeltas = idDeltas.concat({name: 'idDelta_' + i, type: 'SHORT', value: segment.delta});
        idRangeOffsets = idRangeOffsets.concat({name: 'idRangeOffset_' + i, type: 'USHORT', value: segment.offset});
        if (segment.glyphId !== undefined) {
            glyphIds = glyphIds.concat({name: 'glyph_' + i, type: 'USHORT', value: segment.glyphId});
        }
    }

    t.fields = t.fields.concat(endCounts);
    t.fields.push({name: 'reservedPad', type: 'USHORT', value: 0});
    t.fields = t.fields.concat(startCounts);
    t.fields = t.fields.concat(idDeltas);
    t.fields = t.fields.concat(idRangeOffsets);
    t.fields = t.fields.concat(glyphIds);

    t.length = 14 + // Subtable header
        endCounts.length * 2 +
        2 + // reservedPad
        startCounts.length * 2 +
        idDeltas.length * 2 +
        idRangeOffsets.length * 2 +
        glyphIds.length * 2;

    return t;
}

exports.parse = parseCmapTable;
exports.make = makeCmapTable;

},{"../check":2,"../parse":9,"../table":11}],14:[function(_dereq_,module,exports){
// The `glyf` table describes the glyphs in TrueType outline format.
// http://www.microsoft.com/typography/otspec/glyf.htm

'use strict';

var check = _dereq_('../check');
var glyphset = _dereq_('../glyphset');
var parse = _dereq_('../parse');
var path = _dereq_('../path');

// Parse the coordinate data for a glyph.
function parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask, sameBitMask) {
    var v;
    if ((flag & shortVectorBitMask) > 0) {
        // The coordinate is 1 byte long.
        v = p.parseByte();
        // The `same` bit is re-used for short values to signify the sign of the value.
        if ((flag & sameBitMask) === 0) {
            v = -v;
        }

        v = previousValue + v;
    } else {
        //  The coordinate is 2 bytes long.
        // If the `same` bit is set, the coordinate is the same as the previous coordinate.
        if ((flag & sameBitMask) > 0) {
            v = previousValue;
        } else {
            // Parse the coordinate as a signed 16-bit delta value.
            v = previousValue + p.parseShort();
        }
    }

    return v;
}

// Parse a TrueType glyph.
function parseGlyph(glyph, data, start) {
    var p = new parse.Parser(data, start);
    glyph.numberOfContours = p.parseShort();
    glyph.xMin = p.parseShort();
    glyph.yMin = p.parseShort();
    glyph.xMax = p.parseShort();
    glyph.yMax = p.parseShort();
    var flags;
    var flag;
    if (glyph.numberOfContours > 0) {
        var i;
        // This glyph is not a composite.
        var endPointIndices = glyph.endPointIndices = [];
        for (i = 0; i < glyph.numberOfContours; i += 1) {
            endPointIndices.push(p.parseUShort());
        }

        glyph.instructionLength = p.parseUShort();
        glyph.instructions = [];
        for (i = 0; i < glyph.instructionLength; i += 1) {
            glyph.instructions.push(p.parseByte());
        }

        var numberOfCoordinates = endPointIndices[endPointIndices.length - 1] + 1;
        flags = [];
        for (i = 0; i < numberOfCoordinates; i += 1) {
            flag = p.parseByte();
            flags.push(flag);
            // If bit 3 is set, we repeat this flag n times, where n is the next byte.
            if ((flag & 8) > 0) {
                var repeatCount = p.parseByte();
                for (var j = 0; j < repeatCount; j += 1) {
                    flags.push(flag);
                    i += 1;
                }
            }
        }

        check.argument(flags.length === numberOfCoordinates, 'Bad flags.');

        if (endPointIndices.length > 0) {
            var points = [];
            var point;
            // X/Y coordinates are relative to the previous point, except for the first point which is relative to 0,0.
            if (numberOfCoordinates > 0) {
                for (i = 0; i < numberOfCoordinates; i += 1) {
                    flag = flags[i];
                    point = {};
                    point.onCurve = !!(flag & 1);
                    point.lastPointOfContour = endPointIndices.indexOf(i) >= 0;
                    points.push(point);
                }

                var px = 0;
                for (i = 0; i < numberOfCoordinates; i += 1) {
                    flag = flags[i];
                    point = points[i];
                    point.x = parseGlyphCoordinate(p, flag, px, 2, 16);
                    px = point.x;
                }

                var py = 0;
                for (i = 0; i < numberOfCoordinates; i += 1) {
                    flag = flags[i];
                    point = points[i];
                    point.y = parseGlyphCoordinate(p, flag, py, 4, 32);
                    py = point.y;
                }
            }

            glyph.points = points;
        } else {
            glyph.points = [];
        }
    } else if (glyph.numberOfContours === 0) {
        glyph.points = [];
    } else {
        glyph.isComposite = true;
        glyph.points = [];
        glyph.components = [];
        var moreComponents = true;
        while (moreComponents) {
            flags = p.parseUShort();
            var component = {
                glyphIndex: p.parseUShort(),
                xScale: 1,
                scale01: 0,
                scale10: 0,
                yScale: 1,
                dx: 0,
                dy: 0
            };
            if ((flags & 1) > 0) {
                // The arguments are words
                component.dx = p.parseShort();
                component.dy = p.parseShort();
            } else {
                // The arguments are bytes
                component.dx = p.parseChar();
                component.dy = p.parseChar();
            }

            if ((flags & 8) > 0) {
                // We have a scale
                component.xScale = component.yScale = p.parseF2Dot14();
            } else if ((flags & 64) > 0) {
                // We have an X / Y scale
                component.xScale = p.parseF2Dot14();
                component.yScale = p.parseF2Dot14();
            } else if ((flags & 128) > 0) {
                // We have a 2x2 transformation
                component.xScale = p.parseF2Dot14();
                component.scale01 = p.parseF2Dot14();
                component.scale10 = p.parseF2Dot14();
                component.yScale = p.parseF2Dot14();
            }

            glyph.components.push(component);
            moreComponents = !!(flags & 32);
        }
    }
}

// Transform an array of points and return a new array.
function transformPoints(points, transform) {
    var newPoints = [];
    for (var i = 0; i < points.length; i += 1) {
        var pt = points[i];
        var newPt = {
            x: transform.xScale * pt.x + transform.scale01 * pt.y + transform.dx,
            y: transform.scale10 * pt.x + transform.yScale * pt.y + transform.dy,
            onCurve: pt.onCurve,
            lastPointOfContour: pt.lastPointOfContour
        };
        newPoints.push(newPt);
    }

    return newPoints;
}

function getContours(points) {
    var contours = [];
    var currentContour = [];
    for (var i = 0; i < points.length; i += 1) {
        var pt = points[i];
        currentContour.push(pt);
        if (pt.lastPointOfContour) {
            contours.push(currentContour);
            currentContour = [];
        }
    }

    check.argument(currentContour.length === 0, 'There are still points left in the current contour.');
    return contours;
}

// Convert the TrueType glyph outline to a Path.
function getPath(points) {
    var p = new path.Path();
    if (!points) {
        return p;
    }

    var contours = getContours(points);
    for (var i = 0; i < contours.length; i += 1) {
        var contour = contours[i];
        var firstPt = contour[0];
        var lastPt = contour[contour.length - 1];
        var curvePt;
        var realFirstPoint;
        if (firstPt.onCurve) {
            curvePt = null;
            // The first point will be consumed by the moveTo command,
            // so skip it in the loop.
            realFirstPoint = true;
        } else {
            if (lastPt.onCurve) {
                // If the first point is off-curve and the last point is on-curve,
                // start at the last point.
                firstPt = lastPt;
            } else {
                // If both first and last points are off-curve, start at their middle.
                firstPt = { x: (firstPt.x + lastPt.x) / 2, y: (firstPt.y + lastPt.y) / 2 };
            }

            curvePt = firstPt;
            // The first point is synthesized, so don't skip the real first point.
            realFirstPoint = false;
        }

        p.moveTo(firstPt.x, firstPt.y);

        for (var j = realFirstPoint ? 1 : 0; j < contour.length; j += 1) {
            var pt = contour[j];
            var prevPt = j === 0 ? firstPt : contour[j - 1];
            if (prevPt.onCurve && pt.onCurve) {
                // This is a straight line.
                p.lineTo(pt.x, pt.y);
            } else if (prevPt.onCurve && !pt.onCurve) {
                curvePt = pt;
            } else if (!prevPt.onCurve && !pt.onCurve) {
                var midPt = { x: (prevPt.x + pt.x) / 2, y: (prevPt.y + pt.y) / 2 };
                p.quadraticCurveTo(prevPt.x, prevPt.y, midPt.x, midPt.y);
                curvePt = pt;
            } else if (!prevPt.onCurve && pt.onCurve) {
                // Previous point off-curve, this point on-curve.
                p.quadraticCurveTo(curvePt.x, curvePt.y, pt.x, pt.y);
                curvePt = null;
            } else {
                throw new Error('Invalid state.');
            }
        }

        if (firstPt !== lastPt) {
            // Connect the last and first points
            if (curvePt) {
                p.quadraticCurveTo(curvePt.x, curvePt.y, firstPt.x, firstPt.y);
            } else {
                p.lineTo(firstPt.x, firstPt.y);
            }
        }
    }

    p.closePath();
    return p;
}

function buildPath(glyphs, glyph) {
    if (glyph.isComposite) {
        for (var j = 0; j < glyph.components.length; j += 1) {
            var component = glyph.components[j];
            var componentGlyph = glyphs.get(component.glyphIndex);
            if (componentGlyph.points) {
                var transformedPoints = transformPoints(componentGlyph.points, component);
                glyph.points = glyph.points.concat(transformedPoints);
            }
        }
    }

    return getPath(glyph.points);
}

// Parse all the glyphs according to the offsets from the `loca` table.
function parseGlyfTable(data, start, loca, font) {
    var glyphs = new glyphset.GlyphSet(font);
    var i;

    // The last element of the loca table is invalid.
    for (i = 0; i < loca.length - 1; i += 1) {
        var offset = loca[i];
        var nextOffset = loca[i + 1];
        if (offset !== nextOffset) {
            glyphs.push(i, glyphset.ttfGlyphLoader(font, i, parseGlyph, data, start + offset, buildPath));
        } else {
            glyphs.push(i, glyphset.glyphLoader(font, i));
        }
    }

    return glyphs;
}

exports.parse = parseGlyfTable;

},{"../check":2,"../glyphset":7,"../parse":9,"../path":10}],15:[function(_dereq_,module,exports){
// The `GPOS` table contains kerning pairs, among other things.
// https://www.microsoft.com/typography/OTSPEC/gpos.htm

'use strict';

var check = _dereq_('../check');
var parse = _dereq_('../parse');

// Parse ScriptList and FeatureList tables of GPOS, GSUB, GDEF, BASE, JSTF tables.
// These lists are unused by now, this function is just the basis for a real parsing.
function parseTaggedListTable(data, start) {
    var p = new parse.Parser(data, start);
    var n = p.parseUShort();
    var list = [];
    for (var i = 0; i < n; i++) {
        list[p.parseTag()] = { offset: p.parseUShort() };
    }

    return list;
}

// Parse a coverage table in a GSUB, GPOS or GDEF table.
// Format 1 is a simple list of glyph ids,
// Format 2 is a list of ranges. It is expanded in a list of glyphs, maybe not the best idea.
function parseCoverageTable(data, start) {
    var p = new parse.Parser(data, start);
    var format = p.parseUShort();
    var count =  p.parseUShort();
    if (format === 1) {
        return p.parseUShortList(count);
    }
    else if (format === 2) {
        var coverage = [];
        for (; count--;) {
            var begin = p.parseUShort();
            var end = p.parseUShort();
            var index = p.parseUShort();
            for (var i = begin; i <= end; i++) {
                coverage[index++] = i;
            }
        }

        return coverage;
    }
}

// Parse a Class Definition Table in a GSUB, GPOS or GDEF table.
// Returns a function that gets a class value from a glyph ID.
function parseClassDefTable(data, start) {
    var p = new parse.Parser(data, start);
    var format = p.parseUShort();
    if (format === 1) {
        // Format 1 specifies a range of consecutive glyph indices, one class per glyph ID.
        var startGlyph = p.parseUShort();
        var glyphCount = p.parseUShort();
        var classes = p.parseUShortList(glyphCount);
        return function(glyphID) {
            return classes[glyphID - startGlyph] || 0;
        };
    }
    else if (format === 2) {
        // Format 2 defines multiple groups of glyph indices that belong to the same class.
        var rangeCount = p.parseUShort();
        var startGlyphs = [];
        var endGlyphs = [];
        var classValues = [];
        for (var i = 0; i < rangeCount; i++) {
            startGlyphs[i] = p.parseUShort();
            endGlyphs[i] = p.parseUShort();
            classValues[i] = p.parseUShort();
        }

        return function(glyphID) {
            var l = 0;
            var r = startGlyphs.length - 1;
            while (l < r) {
                var c = (l + r + 1) >> 1;
                if (glyphID < startGlyphs[c]) {
                    r = c - 1;
                } else {
                    l = c;
                }
            }

            if (startGlyphs[l] <= glyphID && glyphID <= endGlyphs[l]) {
                return classValues[l] || 0;
            }

            return 0;
        };
    }
}

// Parse a pair adjustment positioning subtable, format 1 or format 2
// The subtable is returned in the form of a lookup function.
function parsePairPosSubTable(data, start) {
    var p = new parse.Parser(data, start);
    // This part is common to format 1 and format 2 subtables
    var format = p.parseUShort();
    var coverageOffset = p.parseUShort();
    var coverage = parseCoverageTable(data, start + coverageOffset);
    // valueFormat 4: XAdvance only, 1: XPlacement only, 0: no ValueRecord for second glyph
    // Only valueFormat1=4 and valueFormat2=0 is supported.
    var valueFormat1 = p.parseUShort();
    var valueFormat2 = p.parseUShort();
    var value1;
    var value2;
    if (valueFormat1 !== 4 || valueFormat2 !== 0) return;
    var sharedPairSets = {};
    if (format === 1) {
        // Pair Positioning Adjustment: Format 1
        var pairSetCount = p.parseUShort();
        var pairSet = [];
        // Array of offsets to PairSet tables-from beginning of PairPos subtable-ordered by Coverage Index
        var pairSetOffsets = p.parseOffset16List(pairSetCount);
        for (var firstGlyph = 0; firstGlyph < pairSetCount; firstGlyph++) {
            var pairSetOffset = pairSetOffsets[firstGlyph];
            var sharedPairSet = sharedPairSets[pairSetOffset];
            if (!sharedPairSet) {
                // Parse a pairset table in a pair adjustment subtable format 1
                sharedPairSet = {};
                p.relativeOffset = pairSetOffset;
                var pairValueCount = p.parseUShort();
                for (; pairValueCount--;) {
                    var secondGlyph = p.parseUShort();
                    if (valueFormat1) value1 = p.parseShort();
                    if (valueFormat2) value2 = p.parseShort();
                    // We only support valueFormat1 = 4 and valueFormat2 = 0,
                    // so value1 is the XAdvance and value2 is empty.
                    sharedPairSet[secondGlyph] = value1;
                }
            }

            pairSet[coverage[firstGlyph]] = sharedPairSet;
        }

        return function(leftGlyph, rightGlyph) {
            var pairs = pairSet[leftGlyph];
            if (pairs) return pairs[rightGlyph];
        };
    }
    else if (format === 2) {
        // Pair Positioning Adjustment: Format 2
        var classDef1Offset = p.parseUShort();
        var classDef2Offset = p.parseUShort();
        var class1Count = p.parseUShort();
        var class2Count = p.parseUShort();
        var getClass1 = parseClassDefTable(data, start + classDef1Offset);
        var getClass2 = parseClassDefTable(data, start + classDef2Offset);

        // Parse kerning values by class pair.
        var kerningMatrix = [];
        for (var i = 0; i < class1Count; i++) {
            var kerningRow = kerningMatrix[i] = [];
            for (var j = 0; j < class2Count; j++) {
                if (valueFormat1) value1 = p.parseShort();
                if (valueFormat2) value2 = p.parseShort();
                // We only support valueFormat1 = 4 and valueFormat2 = 0,
                // so value1 is the XAdvance and value2 is empty.
                kerningRow[j] = value1;
            }
        }

        // Convert coverage list to a hash
        var covered = {};
        for (i = 0; i < coverage.length; i++) covered[coverage[i]] = 1;

        // Get the kerning value for a specific glyph pair.
        return function(leftGlyph, rightGlyph) {
            if (!covered[leftGlyph]) return;
            var class1 = getClass1(leftGlyph);
            var class2 = getClass2(rightGlyph);
            var kerningRow = kerningMatrix[class1];

            if (kerningRow) {
                return kerningRow[class2];
            }
        };
    }
}

// Parse a LookupTable (present in of GPOS, GSUB, GDEF, BASE, JSTF tables).
function parseLookupTable(data, start) {
    var p = new parse.Parser(data, start);
    var lookupType = p.parseUShort();
    var lookupFlag = p.parseUShort();
    var useMarkFilteringSet = lookupFlag & 0x10;
    var subTableCount = p.parseUShort();
    var subTableOffsets = p.parseOffset16List(subTableCount);
    var table = {
        lookupType: lookupType,
        lookupFlag: lookupFlag,
        markFilteringSet: useMarkFilteringSet ? p.parseUShort() : -1
    };
    // LookupType 2, Pair adjustment
    if (lookupType === 2) {
        var subtables = [];
        for (var i = 0; i < subTableCount; i++) {
            subtables.push(parsePairPosSubTable(data, start + subTableOffsets[i]));
        }
        // Return a function which finds the kerning values in the subtables.
        table.getKerningValue = function(leftGlyph, rightGlyph) {
            for (var i = subtables.length; i--;) {
                var value = subtables[i](leftGlyph, rightGlyph);
                if (value !== undefined) return value;
            }

            return 0;
        };
    }

    return table;
}

// Parse the `GPOS` table which contains, among other things, kerning pairs.
// https://www.microsoft.com/typography/OTSPEC/gpos.htm
function parseGposTable(data, start, font) {
    var p = new parse.Parser(data, start);
    var tableVersion = p.parseFixed();
    check.argument(tableVersion === 1, 'Unsupported GPOS table version.');

    // ScriptList and FeatureList - ignored for now
    parseTaggedListTable(data, start + p.parseUShort());
    // 'kern' is the feature we are looking for.
    parseTaggedListTable(data, start + p.parseUShort());

    // LookupList
    var lookupListOffset = p.parseUShort();
    p.relativeOffset = lookupListOffset;
    var lookupCount = p.parseUShort();
    var lookupTableOffsets = p.parseOffset16List(lookupCount);
    var lookupListAbsoluteOffset = start + lookupListOffset;
    for (var i = 0; i < lookupCount; i++) {
        var table = parseLookupTable(data, lookupListAbsoluteOffset + lookupTableOffsets[i]);
        if (table.lookupType === 2 && !font.getGposKerningValue) font.getGposKerningValue = table.getKerningValue;
    }
}

exports.parse = parseGposTable;

},{"../check":2,"../parse":9}],16:[function(_dereq_,module,exports){
// The `head` table contains global information about the font.
// https://www.microsoft.com/typography/OTSPEC/head.htm

'use strict';

var check = _dereq_('../check');
var parse = _dereq_('../parse');
var table = _dereq_('../table');

// Parse the header `head` table
function parseHeadTable(data, start) {
    var head = {};
    var p = new parse.Parser(data, start);
    head.version = p.parseVersion();
    head.fontRevision = Math.round(p.parseFixed() * 1000) / 1000;
    head.checkSumAdjustment = p.parseULong();
    head.magicNumber = p.parseULong();
    check.argument(head.magicNumber === 0x5F0F3CF5, 'Font header has wrong magic number.');
    head.flags = p.parseUShort();
    head.unitsPerEm = p.parseUShort();
    head.created = p.parseLongDateTime();
    head.modified = p.parseLongDateTime();
    head.xMin = p.parseShort();
    head.yMin = p.parseShort();
    head.xMax = p.parseShort();
    head.yMax = p.parseShort();
    head.macStyle = p.parseUShort();
    head.lowestRecPPEM = p.parseUShort();
    head.fontDirectionHint = p.parseShort();
    head.indexToLocFormat = p.parseShort();     // 50
    head.glyphDataFormat = p.parseShort();
    return head;
}

function makeHeadTable(options) {
    return new table.Table('head', [
        {name: 'version', type: 'FIXED', value: 0x00010000},
        {name: 'fontRevision', type: 'FIXED', value: 0x00010000},
        {name: 'checkSumAdjustment', type: 'ULONG', value: 0},
        {name: 'magicNumber', type: 'ULONG', value: 0x5F0F3CF5},
        {name: 'flags', type: 'USHORT', value: 0},
        {name: 'unitsPerEm', type: 'USHORT', value: 1000},
        {name: 'created', type: 'LONGDATETIME', value: 0},
        {name: 'modified', type: 'LONGDATETIME', value: 0},
        {name: 'xMin', type: 'SHORT', value: 0},
        {name: 'yMin', type: 'SHORT', value: 0},
        {name: 'xMax', type: 'SHORT', value: 0},
        {name: 'yMax', type: 'SHORT', value: 0},
        {name: 'macStyle', type: 'USHORT', value: 0},
        {name: 'lowestRecPPEM', type: 'USHORT', value: 0},
        {name: 'fontDirectionHint', type: 'SHORT', value: 2},
        {name: 'indexToLocFormat', type: 'SHORT', value: 0},
        {name: 'glyphDataFormat', type: 'SHORT', value: 0}
    ], options);
}

exports.parse = parseHeadTable;
exports.make = makeHeadTable;

},{"../check":2,"../parse":9,"../table":11}],17:[function(_dereq_,module,exports){
// The `hhea` table contains information for horizontal layout.
// https://www.microsoft.com/typography/OTSPEC/hhea.htm

'use strict';

var parse = _dereq_('../parse');
var table = _dereq_('../table');

// Parse the horizontal header `hhea` table
function parseHheaTable(data, start) {
    var hhea = {};
    var p = new parse.Parser(data, start);
    hhea.version = p.parseVersion();
    hhea.ascender = p.parseShort();
    hhea.descender = p.parseShort();
    hhea.lineGap = p.parseShort();
    hhea.advanceWidthMax = p.parseUShort();
    hhea.minLeftSideBearing = p.parseShort();
    hhea.minRightSideBearing = p.parseShort();
    hhea.xMaxExtent = p.parseShort();
    hhea.caretSlopeRise = p.parseShort();
    hhea.caretSlopeRun = p.parseShort();
    hhea.caretOffset = p.parseShort();
    p.relativeOffset += 8;
    hhea.metricDataFormat = p.parseShort();
    hhea.numberOfHMetrics = p.parseUShort();
    return hhea;
}

function makeHheaTable(options) {
    return new table.Table('hhea', [
        {name: 'version', type: 'FIXED', value: 0x00010000},
        {name: 'ascender', type: 'FWORD', value: 0},
        {name: 'descender', type: 'FWORD', value: 0},
        {name: 'lineGap', type: 'FWORD', value: 0},
        {name: 'advanceWidthMax', type: 'UFWORD', value: 0},
        {name: 'minLeftSideBearing', type: 'FWORD', value: 0},
        {name: 'minRightSideBearing', type: 'FWORD', value: 0},
        {name: 'xMaxExtent', type: 'FWORD', value: 0},
        {name: 'caretSlopeRise', type: 'SHORT', value: 1},
        {name: 'caretSlopeRun', type: 'SHORT', value: 0},
        {name: 'caretOffset', type: 'SHORT', value: 0},
        {name: 'reserved1', type: 'SHORT', value: 0},
        {name: 'reserved2', type: 'SHORT', value: 0},
        {name: 'reserved3', type: 'SHORT', value: 0},
        {name: 'reserved4', type: 'SHORT', value: 0},
        {name: 'metricDataFormat', type: 'SHORT', value: 0},
        {name: 'numberOfHMetrics', type: 'USHORT', value: 0}
    ], options);
}

exports.parse = parseHheaTable;
exports.make = makeHheaTable;

},{"../parse":9,"../table":11}],18:[function(_dereq_,module,exports){
// The `hmtx` table contains the horizontal metrics for all glyphs.
// https://www.microsoft.com/typography/OTSPEC/hmtx.htm

'use strict';

var parse = _dereq_('../parse');
var table = _dereq_('../table');

// Parse the `hmtx` table, which contains the horizontal metrics for all glyphs.
// This function augments the glyph array, adding the advanceWidth and leftSideBearing to each glyph.
function parseHmtxTable(data, start, numMetrics, numGlyphs, glyphs) {
    var advanceWidth;
    var leftSideBearing;
    var p = new parse.Parser(data, start);
    for (var i = 0; i < numGlyphs; i += 1) {
        // If the font is monospaced, only one entry is needed. This last entry applies to all subsequent glyphs.
        if (i < numMet
Download .txt
gitextract_2xwy4ck2/

├── 01_graphic_elements/
│   ├── 01_one_with_everything/
│   │   └── one_with_everything_java/
│   │       └── one_with_everything_java.pde
│   ├── 02_quadrilateral_zoo/
│   │   └── quadrilateral_zoo_java/
│   │       └── quadrilateral_zoo_java.pde
│   ├── 03_initials/
│   │   ├── initials_java/
│   │   │   └── initials_java.pde
│   │   ├── initials_javascript/
│   │   │   ├── index.html
│   │   │   ├── libraries/
│   │   │   │   ├── p5.dom.js
│   │   │   │   ├── p5.js
│   │   │   │   └── p5.sound.js
│   │   │   └── sketch.js
│   │   └── initials_python/
│   │       ├── initials_python.pyde
│   │       └── sketch.properties
│   ├── 04_braille_tool/
│   │   └── braille_tool_java/
│   │       └── braille_tool_java.pde
│   ├── 05_mondrian/
│   │   └── mondrian_java/
│   │       └── mondrian_java.pde
│   └── 08_kaleidoscope/
│       └── kaleidoscope_java/
│           └── kaleidoscope_java.pde
├── 02_iteration/
│   ├── 01_simple_iteration_seven_circles/
│   │   ├── simple_iteration_java/
│   │   │   └── simple_iteration_java.pde
│   │   ├── simple_iteration_js/
│   │   │   ├── index.html
│   │   │   ├── simple_iteration_js.js
│   │   │   └── sketch.properties
│   │   └── simple_iteration_python/
│   │       ├── simple_iteration_python.pyde
│   │       └── sketch.properties
│   ├── 02_transitioning_rectangles/
│   │   ├── transitioning_rectangles_java/
│   │   │   └── transitioning_rectangles_java.pde
│   │   ├── transitioning_rectangles_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── transitioning_rectangles_js.js
│   │   └── transitioning_rectangles_python/
│   │       ├── sketch.properties
│   │       └── transitioning_rectangles_python.pyde
│   ├── 03_string_art_challenge/
│   │   ├── string_art_challenge_java/
│   │   │   ├── simple/
│   │   │   │   └── string_art_simple_java.pde
│   │   │   └── string_art_challenge_java.pde
│   │   ├── string_art_challenge_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── string_art_challenge_js.js
│   │   └── string_art_challenge_python/
│   │       ├── sketch.properties
│   │       └── string_art_challenge_python.pyde
│   ├── 04_mini_calendar/
│   │   ├── mini_calendar_java/
│   │   │   ├── mini_calendar_java.pde
│   │   │   └── sketch.properties
│   │   ├── mini_calendar_js/
│   │   │   ├── index.html
│   │   │   ├── mini_calendar_js.js
│   │   │   └── sketch.properties
│   │   └── mini_calendar_python/
│   │       ├── mini_calendar_python.pyde
│   │       └── sketch.properties
│   ├── 05_receding_landscape/
│   │   ├── receding_landscape_java/
│   │   │   ├── receding_landscape_java.pde
│   │   │   └── sketch.properties
│   │   ├── receding_landscape_js/
│   │   │   ├── index.html
│   │   │   ├── receding_landscape_js.js
│   │   │   └── sketch.properties
│   │   └── receding_landscape_python/
│   │       ├── receding_landscape_python.pyde
│   │       └── sketch.properties
│   ├── 06_lines_to_the_cursor/
│   │   ├── lines_to_the_cursor_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── lines_to_the_cursor_java.pde
│   │   ├── lines_to_the_cursor_js/
│   │   │   ├── index.html
│   │   │   ├── lines_to_the_cursor_js.js
│   │   │   └── sketch.properties
│   │   └── lines_to_the_cursor_python/
│   │       ├── lines_to_the_cursor_python.pyde
│   │       └── sketch.properties
│   ├── 07_color_bar_gradient/
│   │   ├── color_bar_gradient_java/
│   │   │   └── color_bar_gradient_java.pde
│   │   ├── color_bar_gradient_js/
│   │   │   ├── color_bar_gradient_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_bar_gradient_python/
│   │       ├── color_bar_gradient_python.pyde
│   │       └── sketch.properties
│   ├── 08_dashed_line/
│   │   ├── dashed_line_java/
│   │   │   ├── dashed_line_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── dashed_line_js/
│   │   │   ├── dashed_line_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── dashed_line_python/
│   │       ├── dashed_line_python.pyde
│   │       └── sketch.properties
│   ├── 09_nested_iteration_checkers/
│   │   ├── checkers_java/
│   │   │   ├── checkers_java.pde
│   │   │   └── sketch.properties
│   │   ├── checkers_js/
│   │   │   ├── checkers_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── checkers_python/
│   │       ├── checkers_python.pyde
│   │       └── sketch.properties
│   ├── 10_iteration_with_functions/
│   │   ├── interaction_with_functions_js/
│   │   │   ├── index.html
│   │   │   ├── interaction_with_functions_js.js
│   │   │   └── sketch.properties
│   │   ├── iteration_with_functions_java/
│   │   │   └── iteration_with_functions_java.pde
│   │   └── iteration_with_functions_python/
│   │       ├── iteration_with_functions_python.pyde
│   │       └── sketch.properties
│   ├── 11_stochastic_elements/
│   │   ├── stochastic_elements_java/
│   │   │   └── stochastic_elements_java.pde
│   │   ├── stochastic_elements_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── stochastic_elements_js.js
│   │   └── stochastic_elements_python/
│   │       ├── sketch.properties
│   │       └── stochastic_elements_python.pyde
│   ├── 12_interrupted_grid/
│   │   ├── interrupted_grid_java/
│   │   │   └── interrupted_grid_java.pde
│   │   ├── interrupted_grid_js/
│   │   │   ├── index.html
│   │   │   ├── interrupted_grid_js.js
│   │   │   └── sketch.properties
│   │   └── interrupted_grid_python/
│   │       ├── grid_with_randomness_python.pyde
│   │       └── sketch.properties
│   ├── 13_geometric_progression/
│   │   ├── geometric_progression_java/
│   │   │   ├── geometric_progression_java.pde
│   │   │   └── sketch.properties
│   │   ├── geometric_progression_js/
│   │   │   ├── geometric_progression_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── geometric_progression_python/
│   │       ├── geometric_progression_python.pyde
│   │       └── sketch.properties
│   ├── 14_moire_patterns/
│   │   ├── moire_java/
│   │   │   └── moire_java.pde
│   │   ├── moire_js/
│   │   │   ├── index.html
│   │   │   ├── moire_js.js
│   │   │   └── sketch.properties
│   │   └── moire_python/
│   │       ├── moire_python.pyde
│   │       └── sketch.properties
│   ├── 15_recoding_schotter/
│   │   ├── schotter_java/
│   │   │   └── schotter_java.pde
│   │   ├── schotter_js/
│   │   │   ├── index.html
│   │   │   ├── schotter_js.js
│   │   │   └── sketch.properties
│   │   └── schotter_python/
│   │       ├── schotter_python.pyde
│   │       └── sketch.properties
│   └── 16_hexagonal_grid/
│       ├── hexagonal_grid_java/
│       │   └── hexagonal_grid_java.pde
│       ├── hexagonal_grid_js/
│       │   ├── hexagonal_grid_js.js
│       │   ├── index.html
│       │   └── sketch.properties
│       └── hexagonal_grid_python/
│           └── hexagonal_grid_python.pyde
├── 03_color/
│   ├── 02_overlapping_color/
│   │   ├── overlapping_color_java/
│   │   │   └── overlapping_color_java.pde
│   │   ├── overlapping_color_js/
│   │   │   ├── index.html
│   │   │   ├── overlapping_color_js.js
│   │   │   └── sketch.properties
│   │   └── overlapping_python/
│   │       ├── overlapping_python.pyde
│   │       └── sketch.properties
│   ├── 03_constructing_a_gradient/
│   │   ├── constructing_a_gradient_java/
│   │   │   ├── constructing_a_gradient_java.pde
│   │   │   └── sketch.properties
│   │   ├── constructing_a_gradient_js/
│   │   │   ├── constructing_a_gradient_js.js
│   │   │   └── index.html
│   │   └── constructing_a_gradient_python/
│   │       ├── constructing_a_gradient_python.pyde
│   │       └── sketch.properties
│   ├── 04_color_wheel/
│   │   ├── color_wheel_java/
│   │   │   └── color_wheel_java.pde
│   │   ├── color_wheel_js/
│   │   │   ├── color_wheel_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_wheel_python/
│   │       ├── color_wheel_python.pyde
│   │       └── sketch.properties
│   ├── 05_threshold_of_perception/
│   │   ├── threshold_of_perception_java/
│   │   │   ├── sketch.properties
│   │   │   └── threshold_of_perception_java.pde
│   │   ├── threshold_of_perception_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── threshold_of_perception_js.js
│   │   └── threshold_of_perception_python/
│   │       ├── sketch.properties
│   │       └── threshold_of_perception_python.pyde
│   ├── 06_interactive_complement/
│   │   ├── interactive_complement_java/
│   │   │   ├── interactive_complement_java.pde
│   │   │   └── sketch.properties
│   │   ├── interactive_complement_js/
│   │   │   ├── index.html
│   │   │   ├── interactive_complement_js.js
│   │   │   └── sketch.properties
│   │   └── interactive_complement_python/
│   │       ├── interactive_complement.pyde
│   │       └── sketch.properties
│   ├── 07_accented_palette/
│   │   ├── accented_palette_java/
│   │   │   └── accented_palette_java.pde
│   │   ├── accented_palette_js/
│   │   │   ├── accented_palette_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── accented_palette_python/
│   │       ├── accented_palette_python.pyde
│   │       └── sketch.properties
│   ├── 08_split_complements/
│   │   ├── split_complementary_java/
│   │   │   └── split_complementary_java.pde
│   │   ├── split_complementary_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── split_complementary_js.js
│   │   └── split_complementary_python/
│   │       ├── sketch.properties
│   │       └── split_complementary_python.pyde
│   ├── 09_albers_color_relativity_1/
│   │   ├── color_relativity_1_java/
│   │   │   └── color_relativity_1_java.pde
│   │   ├── color_relativity_1_js/
│   │   │   ├── color_relativity_1_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_relativity_1_python/
│   │       ├── color_relativity_1_python.pyde
│   │       └── sketch.properties
│   ├── 10_albers_color_relativity_2/
│   │   ├── color_relativity_2_java/
│   │   │   └── color_relativity_2_java.pde
│   │   ├── color_relativity_2_js/
│   │   │   ├── color_relativity_2_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_relativity_2_python/
│   │       ├── color_relativity_2_python.pyde
│   │       └── sketch.properties
│   ├── 11_color_inspector/
│   │   ├── color_inspector_java/
│   │   │   └── color_inspector_java.pde
│   │   ├── color_inspector_js/
│   │   │   ├── color_inspector_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_inspector_python/
│   │       ├── color_inspector_python.pyde
│   │       └── sketch.properties
│   ├── 12_color_survey/
│   │   ├── color_survey_alternate/
│   │   │   ├── color_mixer_java/
│   │   │   │   ├── color_mixer_java.pde
│   │   │   │   └── data/
│   │   │   │       └── CenturySchoolbook-60.vlw
│   │   │   └── color_mixer_python/
│   │   │       ├── color_mixer_python.pyde
│   │   │       ├── data/
│   │   │       │   └── CenturySchoolbook-60.vlw
│   │   │       └── sketch.properties
│   │   ├── color_survey_app_js/
│   │   │   ├── package.json
│   │   │   ├── server.js
│   │   │   └── sketches/
│   │   │       ├── index.html
│   │   │       ├── survey/
│   │   │       │   ├── index.html
│   │   │       │   └── sketch.js
│   │   │       └── viewer/
│   │   │           ├── index.html
│   │   │           └── sketch.js
│   │   ├── color_survey_java/
│   │   │   ├── color_survey_java.pde
│   │   │   └── survey_result.csv
│   │   ├── color_survey_py/
│   │   │   ├── color_survey_py.pyde
│   │   │   ├── sketch.properties
│   │   │   └── survey_result.csv
│   │   ├── color_survey_viewer_java/
│   │   │   └── color_survey_viewer_java.pde
│   │   └── color_survey_viewer_py/
│   │       ├── color_survey_viewer_py.pyde
│   │       └── sketch.properties
│   └── 13_palette_from_photo/
│       ├── palette_from_book_java/
│       │   └── palette_from_book_java.pde
│       ├── palette_from_book_js/
│       │   ├── index.html
│       │   ├── palette_from_book_js.js
│       │   └── sketch.properties
│       ├── palette_from_book_python/
│       │   ├── palette_from_book_python.pyde
│       │   └── sketch.properties
│       ├── palette_v2_java/
│       │   └── palette_v2_java.pde
│       ├── palette_v2_py3/
│       │   └── palette_v2.py
│       └── palette_v2_pyde/
│           ├── palette_v2_pyde.pyde
│           └── sketch.properties
├── 04_conditional_testing/
│   ├── 01_left_or_right/
│   │   └── left_or_right_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── left_or_right_java.pde
│   ├── 02_billiard_ball/
│   │   └── billiard_ball_java/
│   │       └── billiard_ball_java.pde
│   ├── 03_one_person_pong/
│   │   └── one_person_pong_java/
│   │       └── one_person_pong_java.pde
│   ├── 04_choose_your_own_adventure/
│   │   └── 04_choose_your_own_adventure_java/
│   │       ├── choose_your_own_adventure_java.pde
│   │       └── data/
│   │           └── CenturySchoolbook-60.vlw
│   ├── 05_state_machine_1/
│   │   └── state_machine_1_java/
│   │       └── state_machine_1_java.pde
│   ├── 06_state_machine_2/
│   │   └── state_machine_2_java/
│   │       └── state_machine_2_java.pde
│   ├── 07_state_machine_3/
│   │   └── state_machine_3_java/
│   │       └── state_machine_3_java.pde
│   └── 08_state_machine_4/
│       └── state_machine_4_java/
│           └── state_machine_4_java.pde
├── 05_unpredictability/
│   ├── 01_coin_toss/
│   │   ├── coin_toss_book/
│   │   │   └── coin_toss_book.pde
│   │   ├── coin_toss_java/
│   │   │   └── coin_toss_java.pde
│   │   ├── coin_toss_javascript/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── coin_toss_python/
│   │       ├── coin_toss_python.pyde
│   │       └── sketch.properties
│   ├── 02_roll_the_dice/
│   │   ├── dice_roll_book/
│   │   │   └── dice_roll_book.pde
│   │   ├── dice_roll_java/
│   │   │   └── dice_roll_java.pde
│   │   ├── dice_roll_javascript/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── dice_roll_python/
│   │       ├── dice_roll_python.pyde
│   │       └── sketch.properties
│   ├── 03_exquisite_corpse_machine/
│   │   ├── exquisite_corpse_book/
│   │   │   └── exquisite_corpse_book.pde
│   │   ├── exquisite_corpse_java/
│   │   │   └── exquisite_corpse_java.pde
│   │   └── exquisite_corpse_python/
│   │       ├── exquisite_corpse_python.pyde
│   │       └── sketch.properties
│   ├── 04_intermittent_events/
│   │   └── intermittent_events_java/
│   │       └── intermittent_events_java.pde
│   ├── 05_order_to_chaos/
│   │   └── order_to_chaos_java/
│   │       └── order_to_chaos_java.pde
│   ├── 06_drunk_walk_1_brownian_motion/
│   │   └── brownian_motion_java/
│   │       └── brownian_motion_java.pde
│   ├── 07_drunk_walk_2_random_lattice_walk/
│   │   └── lattice_random_walk_javascript/
│   │       ├── index.html
│   │       └── sketch.js
│   ├── 08_drunk_walk_3_smoothed_noise/
│   │   └── smoothed_noise_java/
│   │       └── smoothed_noise_java.pde
│   ├── 09_ten_print/
│   │   └── ten_print_java/
│   │       └── ten_print_java.pde
│   ├── 10_duotone_truchet_tile_java/
│   │   └── duotone_truchet_tile_java/
│   │       └── duotone_truchet_tile_java.pde
│   ├── 11_hitomezashi_sashiko_stitching/
│   │   └── hitomezashi_sashiko_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── hitomezashi_sashiko_java.pde
│   ├── 12_noise_mountains/
│   │   ├── noise_mountains_java/
│   │   │   └── noise_mountains_java.pde
│   │   └── noise_mountains_js/
│   │       ├── index.html
│   │       └── sketch.js
│   └── 13_imaginary_islands/
│       └── imaginary_islands_java/
│           └── imaginary_islands_java.pde
├── 06_arrays/
│   ├── 01_living_line_1/
│   │   ├── living_line_java/
│   │   │   └── living_line_java.pde
│   │   ├── living_line_js/
│   │   │   ├── index.html
│   │   │   ├── living_line_js.js
│   │   │   └── sketch.properties
│   │   └── living_line_python/
│   │       ├── living_line_python.pyde
│   │       └── sketch.properties
│   ├── 02_living_line_2/
│   │   ├── living_line_2_java/
│   │   │   └── living_line_2_java.pde
│   │   ├── living_line_2_js/
│   │   │   ├── index.html
│   │   │   ├── living_line_2_js.js
│   │   │   └── sketch.properties
│   │   └── living_line_2_python/
│   │       ├── living_line_2_python.pyde
│   │       └── sketch.properties
│   ├── 03_living_line_3/
│   │   ├── living_line_3_java/
│   │   │   └── living_line_3_java.pde
│   │   ├── living_line_3_js/
│   │   │   ├── index.html
│   │   │   ├── living_line_3_js.js
│   │   │   └── sketch.properties
│   │   └── living_line_3_python/
│   │       ├── living_line_3_python.pyde
│   │       └── sketch.properties
│   ├── 04_calligraphic_polyline/
│   │   ├── calligraphic_polyline_java/
│   │   │   └── calligraphic_polyline_java.pde
│   │   ├── calligraphic_polyline_js/
│   │   │   ├── calligraphic_polyline_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── calligraphic_polyline_python/
│   │       ├── calligraphic_polyline_python.pyde
│   │       └── sketch.properties
│   ├── 05_animated_walk_cycle/
│   │   ├── animated_walk_cycle_java/
│   │   │   └── animated_walk_cycle_java.pde
│   │   ├── animated_walk_cycle_js/
│   │   │   ├── animated_walk_cycle_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── animated_walk_cycle_python/
│   │       ├── animated_walk_cycle_python.pyde
│   │       └── sketch.properties
│   ├── 06_plant_the_flag/
│   │   ├── plant_the_flag_java/
│   │   │   └── plant_the_flag_java.pde
│   │   ├── plant_the_flag_js/
│   │   │   ├── index.html
│   │   │   ├── plant_the_flag_js.js
│   │   │   └── sketch.properties
│   │   └── plant_the_flag_python/
│   │       └── plant_the_flag_python.pyde
│   ├── 07_longest_line/
│   │   ├── longest_line_java/
│   │   │   └── longest_line_java.pde
│   │   ├── longest_line_js/
│   │   │   ├── index.html
│   │   │   ├── longest_line_js.js
│   │   │   └── sketch.properties
│   │   └── longest_line_python/
│   │       ├── longest_line_python.pyde
│   │       └── sketch.properties
│   └── 08_reordering_rectangles/
│       ├── reordering_rectangles_java/
│       │   ├── Rectangle.pde
│       │   └── reordering_rectangles_java.pde
│       ├── reordering_rectangles_js/
│       │   ├── index.html
│       │   ├── reordering_rectangles_js.js
│       │   └── sketch.properties
│       └── reordering_rectangles_python/
│           ├── reordering_rectangles_python.pyde
│           └── sketch.properties
├── 07_time_and_interactivity/
│   ├── 01_eyes_following_cursor/
│   │   ├── eyes_following_cursor_java/
│   │   │   └── eyes_following_cursor_java.pde
│   │   ├── eyes_following_cursor_js/
│   │   │   ├── eyes_following_cursor_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── eyes_following_cursor_python/
│   │       ├── eyes_following_cursor_python.pyde
│   │       └── sketch.properties
│   ├── 02_fuse_or_progress_bar/
│   │   └── fuse_or_progress_bar_java/
│   │       └── fuse_or_progress_bar_java.pde
│   ├── 03_ripples_in_a_pond/
│   │   ├── ripples_in_a_pond_java/
│   │   │   └── ripples_in_a_pond_java.pde
│   │   ├── ripples_in_a_pond_js/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── ripples_in_a_pond_js.js
│   │   │   └── style.css
│   │   └── ripples_in_a_pond_python/
│   │       ├── ripples_in_a_pond_python.pyde
│   │       └── sketch.properties
│   ├── 04_rain_catcher/
│   │   └── rain_catcher_java/
│   │       ├── Catcher.pde
│   │       ├── Drop.pde
│   │       ├── Timer.pde
│   │       └── rain_catcher_java.pde
│   ├── 05_abstract_typewriter/
│   │   └── abstract_typewriter_java/
│   │       └── abstract_typewriter_java.pde
│   ├── 06_easing_filtering_a_variable/
│   │   ├── easing_java/
│   │   │   └── easing_java.pde
│   │   ├── easing_javascript/
│   │   │   ├── index.html
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── easing_python/
│   │       ├── easing_python.pyde
│   │       └── sketch.properties
│   ├── 07_smoothing/
│   │   ├── smoothing_java/
│   │   │   └── smoothing_java.pde
│   │   ├── smoothing_javascript/
│   │   │   ├── index.html
│   │   │   ├── p5.js
│   │   │   ├── sketch.js
│   │   │   └── style.css
│   │   └── smoothing_python/
│   │       ├── sketch.properties
│   │       └── smoothing_python.pyde
│   └── 08_audio_sensitive/
│       └── audio_sensitive_java/
│           └── audio_sensitive_java.pde
├── 08_typography/
│   ├── 01_ransom_letter/
│   │   ├── ransom_letter_java/
│   │   │   └── ransom_letter_java.pde
│   │   ├── ransom_letter_js/
│   │   │   ├── index.html
│   │   │   ├── ransom_letter_js.js
│   │   │   └── sketch.properties
│   │   └── ransom_letter_python/
│   │       ├── ransom_letter_python.pyde
│   │       └── sketch.properties
│   ├── 02_one_line_typewriter/
│   │   ├── one_line_typewriter_java/
│   │   │   └── one_line_typewriter_java.pde
│   │   ├── one_line_typewriter_js/
│   │   │   ├── index.html
│   │   │   ├── one_line_typewriter_js.js
│   │   │   └── sketch.properties
│   │   └── one_line_typewriter_python/
│   │       ├── one_line_typewriter_python.pyde
│   │       └── sketch.properties
│   ├── 03_dynamic_text/
│   │   ├── dynamic_text_java/
│   │   │   └── dynamic_text_java.pde
│   │   ├── dynamic_text_js/
│   │   │   ├── dynamic_text_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── dynamic_text_python/
│   │       ├── dynamic_text_python.pyde
│   │       └── sketch.properties
│   ├── 04_responsive_text/
│   │   ├── responsive_text_java/
│   │   │   └── responsive_text_java.pde
│   │   ├── responsive_text_js/
│   │   │   ├── index.html
│   │   │   ├── responsive_text_js.js
│   │   │   └── sketch.properties
│   │   └── responsive_text_python/
│   │       ├── responsive_text_python.pyde
│   │       └── sketch.properties
│   ├── 05_scrolling_headlines/
│   │   ├── scrolling_headlines_java/
│   │   │   └── scrolling_headlines_java.pde
│   │   ├── scrolling_headlines_js/
│   │   │   ├── index.html
│   │   │   ├── scrolling_headlines_js.js
│   │   │   └── sketch.properties
│   │   └── scrolling_headlines_python/
│   │       ├── scrolling_headlines_python.pyde
│   │       └── sketch.properties
│   ├── 06_split_flap_type/
│   │   ├── split_flap_type_java/
│   │   │   └── split_flap_type_java.pde
│   │   ├── split_flap_type_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── split_flap_type_js.js
│   │   └── split_flap_type_python/
│   │       ├── sketch.properties
│   │       └── split_flap_type_python.pyde
│   ├── 07_word_finder/
│   │   ├── word_finder_java/
│   │   │   └── word_finder_java.pde
│   │   ├── word_finder_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── word_finder_js.js
│   │   └── word_finder_python/
│   │       ├── sketch.properties
│   │       └── word_finder_python.pyde
│   ├── 08_letterform_collage_tool/
│   │   ├── letterform_collage_tool_java/
│   │   │   └── letterform_collage_tool_java.pde
│   │   ├── letterform_collage_tool_js/
│   │   │   ├── index.html
│   │   │   ├── letterform_collage_tool_js.js
│   │   │   └── sketch.properties
│   │   └── letterform_collage_tool_python/
│   │       ├── letterform_collage_tool_python.pyde
│   │       └── sketch.properties
│   ├── 09_procrustean_typography/
│   │   ├── procrustean_typography_java/
│   │   │   └── procrustean_typography_java.pde
│   │   ├── procrustean_typography_js/
│   │   │   ├── index.html
│   │   │   ├── procrustean_typography_js.js
│   │   │   └── sketch.properties
│   │   └── procrustean_typography_python/
│   │       ├── procrustean_typography_python.pyde
│   │       └── sketch.properties
│   ├── 10_text_along_a_curve/
│   │   ├── text_along_a_curve_java/
│   │   │   └── text_along_a_curve_java.pde
│   │   ├── text_along_a_curve_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── text_along_a_curve_js.js
│   │   └── text_along_a_curve_python/
│   │       ├── sketch.properties
│   │       └── text_along_a_curve_python.pyde
│   ├── 11_glyph_hacking/
│   │   ├── glyph_hacking_java/
│   │   │   └── glyph_hacking_java.pde
│   │   ├── glyph_hacking_js/
│   │   │   ├── glyph_hacking_js.js
│   │   │   ├── index.html
│   │   │   ├── libraries/
│   │   │   │   ├── rune.js
│   │   │   │   └── rune.js-1.1.8/
│   │   │   │       ├── src/
│   │   │   │       │   ├── anchor.js
│   │   │   │       │   ├── bezier.js
│   │   │   │       │   ├── color.js
│   │   │   │       │   ├── events.js
│   │   │   │       │   ├── grid.js
│   │   │   │       │   ├── group.js
│   │   │   │       │   ├── mixins/
│   │   │   │       │   │   ├── box.js
│   │   │   │       │   │   ├── parent.js
│   │   │   │       │   │   ├── shape.js
│   │   │   │       │   │   └── styles.js
│   │   │   │       │   ├── node.js
│   │   │   │       │   ├── rune.js
│   │   │   │       │   ├── shapes/
│   │   │   │       │   │   ├── circle.js
│   │   │   │       │   │   ├── ellipse.js
│   │   │   │       │   │   ├── image.js
│   │   │   │       │   │   ├── line.js
│   │   │   │       │   │   ├── path.js
│   │   │   │       │   │   ├── polygon.js
│   │   │   │       │   │   ├── rectangle.js
│   │   │   │       │   │   ├── text.js
│   │   │   │       │   │   └── triangle.js
│   │   │   │       │   ├── utils.js
│   │   │   │       │   └── vector.js
│   │   │   │       └── test/
│   │   │   │           ├── both/
│   │   │   │           │   ├── anchor.js
│   │   │   │           │   ├── color.js
│   │   │   │           │   ├── grid.js
│   │   │   │           │   ├── group.js
│   │   │   │           │   ├── mixins/
│   │   │   │           │   │   ├── box.js
│   │   │   │           │   │   ├── shape.js
│   │   │   │           │   │   └── styles.js
│   │   │   │           │   ├── rendering.js
│   │   │   │           │   ├── rune.js
│   │   │   │           │   ├── shapes/
│   │   │   │           │   │   ├── circle.js
│   │   │   │           │   │   ├── ellipse.js
│   │   │   │           │   │   ├── image.js
│   │   │   │           │   │   ├── line.js
│   │   │   │           │   │   ├── path.js
│   │   │   │           │   │   ├── polygon.js
│   │   │   │           │   │   ├── rect.js
│   │   │   │           │   │   ├── text.js
│   │   │   │           │   │   └── triangle.js
│   │   │   │           │   ├── utils.js
│   │   │   │           │   └── vector.js
│   │   │   │           ├── browser/
│   │   │   │           │   └── rune.js
│   │   │   │           ├── helpers.js
│   │   │   │           ├── matchers.js
│   │   │   │           └── node/
│   │   │   │               └── rune.js
│   │   │   └── sketch.properties
│   │   └── glyph_hacking_python/
│   │       ├── glyph_hacking_python.pyde
│   │       └── sketch.properties
│   ├── 12_tiny_word_processor/
│   │   ├── tiny_word_processor_java/
│   │   │   └── tiny_word_processor_java.pde
│   │   ├── tiny_word_processor_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── tiny_word_processor_js.js
│   │   └── tiny_word_processor_python/
│   │       ├── sketch.properties
│   │       └── tiny_word_processor_python.pyde
│   └── 13_ascii_vision/
│       ├── ascii_vision_java/
│       │   └── ascii_vision_java.pde
│       ├── ascii_vision_js/
│       │   ├── ascii_vision_js.js
│       │   ├── index.html
│       │   └── sketch.properties
│       └── ascii_vision_python/
│           ├── ascii_vision_python.pyde
│           └── sketch.properties
├── 09_curves/
│   ├── 01_butt_generator/
│   │   ├── butt_generator_java/
│   │   │   ├── butt.tif
│   │   │   └── butt_generator_java.pde
│   │   ├── butt_generator_js/
│   │   │   ├── butt_generator_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── buttgenerator_python/
│   │       ├── buttgenerator_python.pyde
│   │       └── sketch.properties
│   ├── 02_parabola/
│   │   ├── parabola_java/
│   │   │   └── parabola_java.pde
│   │   ├── parabola_js/
│   │   │   ├── index.html
│   │   │   ├── parabola_js.js
│   │   │   └── sketch.properties
│   │   └── parabola_python/
│   │       ├── parabola_python.pyde
│   │       └── sketch.properties
│   ├── 03_one_circle_three_ways/
│   │   ├── circle_java/
│   │   │   └── circle_java.pde
│   │   ├── circle_js/
│   │   │   ├── circle_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── circle_python/
│   │       ├── circle_python.pyde
│   │       └── sketch.properties
│   ├── 04_continuity_of_bezier_curves/
│   │   ├── bezier_java/
│   │   │   └── bezier_java.pde
│   │   ├── bezier_js/
│   │   │   ├── bezier_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── bezier_python/
│   │       ├── bezier_python.pyde
│   │       └── sketch.properties
│   ├── 05_phyllotaxis/
│   │   ├── phyllotaxis_java/
│   │   │   └── phyllotaxis_java.pde
│   │   ├── phyllotaxis_js/
│   │   │   ├── index.html
│   │   │   ├── phyllotaxis_js.js
│   │   │   └── sketch.properties
│   │   └── phyllotaxis_python/
│   │       ├── phyllotaxis_python.pyde
│   │       └── sketch.properties
│   ├── 06_lissajous/
│   │   ├── lissajous_java/
│   │   │   └── lissajous_java.pde
│   │   ├── lissajous_js/
│   │   │   ├── index.html
│   │   │   ├── lissajous_js.js
│   │   │   └── sketch.properties
│   │   └── lissajous_python/
│   │       ├── lissajous_python.pyde
│   │       └── sketch.properties
│   ├── 07_spiral/
│   │   ├── spiral_java/
│   │   │   ├── screen-0042.tif
│   │   │   ├── spiral.tif
│   │   │   └── spiral_java.pde
│   │   ├── spiral_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── spiral_js.js
│   │   └── spiral_python/
│   │       ├── sketch.properties
│   │       └── spiral_python.pyde
│   ├── 08_polar_curve/
│   │   ├── polar_curve.tif
│   │   ├── polar_curve_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   └── polar_curve_java.pde
│   │   ├── polar_curve_js/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── index.html
│   │   │   ├── polar_curve_js.js
│   │   │   └── sketch.properties
│   │   └── polar_curve_python/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       ├── polar_curve_python.pyde
│   │       └── sketch.properties
│   ├── 09_fourier_synthesis/
│   │   ├── fourier_synthesis_java/
│   │   │   └── fourier_synthesis_java.pde
│   │   ├── fourier_synthesis_js/
│   │   │   ├── fourier_synthesis_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── fourier_synthesis_python/
│   │       ├── fourier_synthesis_python.pyde
│   │       └── sketch.properties
│   ├── 10_osculating_circle/
│   │   ├── osculating_circle_java/
│   │   │   └── osculating_circle_java.pde
│   │   ├── osculating_circle_python/
│   │   │   ├── osculating_circle_python.pyde
│   │   │   └── sketch.properties
│   │   └── osculating_js/
│   │       ├── index.html
│   │       ├── osculating_js.js
│   │       └── sketch.properties
│   ├── 11_circle_morphing/
│   │   ├── circle_to_triangle_java/
│   │   │   └── circle_to_triangle_java.pde
│   │   ├── circle_to_triangle_js/
│   │   │   ├── circle_to_triangle_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── circle_to_triangle_python/
│   │       ├── circle_to_triangle_python.pyde
│   │       └── sketch.properties
│   └── 12_shaping_functions/
│       ├── shaping_functions_java/
│       │   └── shaping_functions_java.pde
│       ├── shaping_functions_js/
│       │   ├── index.html
│       │   ├── shaping_functions_js.js
│       │   └── sketch.properties
│       └── shaping_functions_python/
│           ├── shaping_functions_python.pyde
│           └── sketch.properties
├── 10_shapes/
│   ├── 01_make_a_star/
│   │   ├── make_a_star_java/
│   │   │   └── make_a_star_java.pde
│   │   ├── make_a_star_js/
│   │   │   ├── index.html
│   │   │   ├── make_a_star_js.js
│   │   │   └── sketch.properties
│   │   └── make_a_star_python/
│   │       ├── make_a_star_python.pyde
│   │       └── sketch.properties
│   ├── 02_random_splat/
│   │   ├── random_splat_java/
│   │   │   └── random_splat_java.pde
│   │   ├── random_splat_js/
│   │   │   ├── index.html
│   │   │   ├── random_splat_js.js
│   │   │   └── sketch.properties
│   │   └── random_splat_python/
│   │       ├── random_splat_python.pyde
│   │       └── sketch.properties
│   ├── 03_connect_the_dots/
│   │   ├── connect_the_dots_java/
│   │   │   └── connect_the_dots_java.pde
│   │   ├── connect_the_dots_js/
│   │   │   ├── connect_the_dots_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── connect_the_dots_python/
│   │       ├── connect_the_dots_python.pyde
│   │       └── sketch.properties
│   ├── 04_axis_aligned_bounding_box/
│   │   ├── bounding_box_java/
│   │   │   └── bounding_box_java.pde
│   │   ├── bounding_box_js/
│   │   │   ├── bounding_box_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── bounding_box_python/
│   │       ├── bounding_box_python.pyde
│   │       └── sketch.properties
│   ├── 05_computing_the_centroid/
│   │   ├── centroid_java/
│   │   │   └── centroid_java.pde
│   │   ├── centroid_js/
│   │   │   ├── centroid_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── centroid_python/
│   │       ├── centroid_python.pyde
│   │       └── sketch.properties
│   ├── 06_computing_the_perimeter/
│   │   ├── perimeter_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── perimeter_java.pde
│   │   ├── perimeter_js/
│   │   │   ├── index.html
│   │   │   ├── perimeter_js.js
│   │   │   └── sketch.properties
│   │   └── perimeter_python/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── perimeter_python.pyde
│   │       └── sketch.properties
│   ├── 07_computing_the_area/
│   │   ├── area_java/
│   │   │   ├── area_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── area_js/
│   │   │   ├── area_js.js
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── area_python/
│   │       ├── area_python.pyde
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 08_shape_metrics_compactness/
│   │   ├── compactness_java/
│   │   │   ├── compactness_java.pde
│   │   │   └── data/
│   │   │       ├── CenturySchoolbook-106.vlw
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── compactness_js/
│   │   │   ├── compactness_js.js
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-106.vlw
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── compactness_python/
│   │       ├── compactness_python.pyde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-106.vlw
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 09_detecting_high_curvature/
│   │   ├── high_curvature_java/
│   │   │   └── high_curvature_java.pde
│   │   ├── high_curvature_js/
│   │   │   ├── high_curvature_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── high_curvature_python/
│   │       ├── high_curvature_python.pyde
│   │       └── sketch.properties
│   ├── 10_hand_drawn_graphics_library/
│   │   ├── hand_drawn_java/
│   │   │   ├── EllipseHand.pde
│   │   │   ├── LineHand.pde
│   │   │   ├── RectHand.pde
│   │   │   └── hand_drawn_java.pde
│   │   ├── hand_drawn_js/
│   │   │   ├── hand_drawn_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── hand_drawn_python/
│   │       ├── hand_drawn_python.pyde
│   │       └── sketch.properties
│   └── 11_blob/
│       ├── blob_java/
│       │   ├── Blob.pde
│       │   └── blob_java.pde
│       ├── blob_js/
│       │   ├── blob_js.js
│       │   ├── index.html
│       │   └── sketch.properties
│       └── blob_python/
│           ├── blob_python.pyde
│           └── sketch.properties
├── 11_geometry/
│   ├── 01_midpoint_of_a_line_segment/
│   │   ├── midpoint_of_a_line_segment_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   └── midpoint_of_a_line_segment_java.pde
│   │   ├── midpoint_of_a_line_segment_js/
│   │   │   ├── index.html
│   │   │   ├── midpoint_of_a_line_segment_js.js
│   │   │   └── sketch.properties
│   │   └── midpoint_of_a_line_segment_python/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       ├── midpoint_of_a_line_segment_python.pyde
│   │       └── sketch.properties
│   ├── 02_intersection_of_two_rectangles/
│   │   ├── intersection_of_two_rectangles_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── intersection_of_two_rectangles_java.pde
│   │   ├── intersection_of_two_rectangles_js/
│   │   │   ├── index.html
│   │   │   ├── intersection_of_two_rectangles_js.js
│   │   │   └── sketch.properties
│   │   └── intersection_of_two_rectangles_python/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── intersection_of_two_rectangles_python.pyde
│   │       └── sketch.properties
│   ├── 03_construction_of_a_perpendicular/
│   │   ├── construction_of_a_perpendicular_java/
│   │   │   ├── construction_of_a_perpendicular_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── construction_of_a_perpendicular_js/
│   │   │   ├── construction_of_a_perpendicular_js.js
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── construction_of_a_perpendicular_python/
│   │       ├── construction_of_a_perpendicular_python.pyde
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 04_parallel_polyline/
│   │   ├── parallel_polyline_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── parallel_polyline_java.pde
│   │   ├── parallel_polyline_js/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   ├── parallel_polyline_js.js
│   │   │   └── sketch.properties
│   │   └── parallel_polyline_python/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── parallel_polyline_python.pyde
│   │       └── sketch.properties
│   ├── 05_compass_orientation/
│   │   ├── compass_orientation_java/
│   │   │   ├── compass_orientation_java.pde
│   │   │   └── data/
│   │   │       ├── CenturySchoolbook-60.vlw
│   │   │       ├── CenturySchoolbook-64.vlw
│   │   │       └── CenturySchoolbook-72.vlw
│   │   ├── compass_orientation_js/
│   │   │   ├── compass_orientation_js.js
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── compass_orientation_python/
│   │       ├── compass_orientation_python.pyde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── CenturySchoolbook-64.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       └── sketch.properties
│   ├── 06_angle_between_three_points/
│   │   ├── angle_between_three_points_java/
│   │   │   ├── angle_between_three_points_java.pde
│   │   │   └── data/
│   │   │       ├── CenturySchoolbook-60.vlw
│   │   │       ├── CenturySchoolbook-64.vlw
│   │   │       └── CenturySchoolbook-72.vlw
│   │   ├── angle_between_three_points_js/
│   │   │   ├── angle_between_three_points_js.js
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── angle_between_three_points_python/
│   │       ├── angle_between_three_points_python.pyde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── CenturySchoolbook-64.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       └── sketch.properties
│   ├── 07_distance_from_a_point_to_a_line/
│   │   ├── distance_from_a_point_to_a_line_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   └── distance_from_a_point_to_a_line_java.pde
│   │   ├── distance_from_a_point_to_a_line_js/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   ├── CenturySchoolbook-64.vlw
│   │   │   │   └── CenturySchoolbook-72.vlw
│   │   │   ├── distance_from_a_point_to_a_line_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── distance_from_a_point_to_a_line_python/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── CenturySchoolbook-64.vlw
│   │       │   └── CenturySchoolbook-72.vlw
│   │       ├── distance_from_a_point_to_a_line_python.pyde
│   │       └── sketch.properties
│   ├── 08_intersection_of_two_line_segments/
│   │   ├── intersection_of_two_line_segments_java/
│   │   │   └── intersection_of_two_line_segments_java.pde
│   │   ├── intersection_of_two_line_segments_js/
│   │   │   ├── index.html
│   │   │   ├── intersection_of_two_line_segments_js.js
│   │   │   └── sketch.properties
│   │   └── intersection_of_two_line_segments_python/
│   │       ├── intersection_of_two_line_segments_python.pyde
│   │       └── sketch.properties
│   ├── 09_centroid_of_a_triangle/
│   │   ├── centroid_of_a_triangle_java/
│   │   │   ├── centroid_of_a_triangle_java.pde
│   │   │   └── data/
│   │   │       └── CenturySchoolbook-60.vlw
│   │   ├── centroid_of_a_triangle_js/
│   │   │   ├── centroid_of_a_triangle_js.js
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── centroid_of_a_triangle_python/
│   │       ├── centroid_of_a_triangle_python.pyde
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── sketch.properties
│   ├── 10_triangle_circumcenter/
│   │   ├── triangle_circumcenter_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── triangle_circumcenter_java.pde
│   │   ├── triangle_circumcenter_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── triangle_circumcenter_js.js
│   │   └── triangle_circumcenter_python/
│   │       ├── sketch.properties
│   │       └── triangle_circumcenter_python.pyde
│   ├── 11_triangle_orthocenter/
│   │   ├── triangle_orthocenter_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── triangle_orthocenter_java.pde
│   │   ├── triangle_orthocenter_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── triangle_orthocenter_js.js
│   │   └── triangle_orthocenter_python/
│   │       ├── sketch.properties
│   │       └── triangle_orthocenter_python.pyde
│   └── 12_triangle_incenter/
│       ├── triangle_incenter_java/
│       │   ├── data/
│       │   │   └── CenturySchoolbook-60.vlw
│       │   └── triangle_incenter_java.pde
│       ├── triangle_incenter_js/
│       │   ├── index.html
│       │   ├── sketch.properties
│       │   └── triangle_incenter_js.js
│       └── triangle_incenter_python/
│           ├── sketch.properties
│           └── triangle_incenter_python.pyde
├── 12_image/
│   ├── 01_collage_machine/
│   │   ├── collage_machine_java/
│   │   │   └── collage_machine_java.pde
│   │   ├── collage_machine_js/
│   │   │   ├── collage_machine_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── collage_machine_py/
│   │       ├── collage_machine_py.pyde
│   │       └── sketch.properties
│   ├── 02_color_of_a_pixel/
│   │   ├── color_of_a_pixel_java/
│   │   │   └── color_of_a_pixel_java.pde
│   │   ├── color_of_a_pixel_js/
│   │   │   ├── color_of_a_pixel_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── color_of_a_pixel_py/
│   │       ├── color_of_a_pixel_py.pyde
│   │       └── sketch.properties
│   ├── 03_subsample_and_downsample/
│   │   ├── subsample_downsample_java/
│   │   │   └── subsample_downsample_java.pde
│   │   ├── subsample_downsample_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── subsample_downsample_js.js
│   │   └── subsample_downsample_py/
│   │       ├── sketch.properties
│   │       └── subsample_downsample_py.pyde
│   ├── 04_random_dot_dithering/
│   │   ├── random_dot_dithering_java/
│   │   │   └── random_dot_dithering_java.pde
│   │   ├── random_dot_dithering_js/
│   │   │   ├── index.html
│   │   │   ├── random_dot_dithering_js.js
│   │   │   └── sketch.properties
│   │   └── random_dot_dithering_py/
│   │       ├── random_dot_dithering_py.pyde
│   │       └── sketch.properties
│   ├── 05_searching_for_the_brightest_point/
│   │   ├── brightest_point_java/
│   │   │   ├── brightest_point_java.pde
│   │   │   └── data/
│   │   │       └── Helvetica-Bold-72.vlw
│   │   ├── brightest_point_js/
│   │   │   ├── brightest_point_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── brightest_point_py/
│   │       ├── brightest_point_py.pyde
│   │       ├── data/
│   │       │   └── Helvetica-Bold-72.vlw
│   │       └── sketch.properties
│   ├── 06_image_averaging/
│   │   ├── image_averaging_java/
│   │   │   └── image_averaging_java.pde
│   │   ├── image_averaging_js/
│   │   │   ├── image_averaging_js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── image_averaging_py/
│   │       ├── image_averaging_py.pyde
│   │       └── sketch.properties
│   ├── 07_edge_detector_sobel_filter/
│   │   ├── sobel_java/
│   │   │   └── sobel_java.pde
│   │   ├── sobel_java_2/
│   │   │   └── sobel_java_2.pde
│   │   ├── sobel_js/
│   │   │   ├── index.html
│   │   │   ├── sketch.properties
│   │   │   └── sobel_js.js
│   │   └── sobel_py/
│   │       ├── sketch.properties
│   │       └── sobel_py.pyde
│   └── 08_pixel_sort/
│       ├── pixel_sorting_java/
│       │   └── pixel_sorting_java.pde
│       ├── pixel_sorting_js/
│       │   ├── index.html
│       │   ├── pixel_sorting_js.js
│       │   └── sketch.properties
│       └── pixel_sorting_py/
│           ├── pixel_sorting_py.pyde
│           └── sketch.properties
├── 13_visualization/
│   ├── 01_text_message_isotype/
│   │   └── text_message_isotype_java/
│   │       └── text_message_isotype_java.pde
│   ├── 02_temperature_timeline/
│   │   └── temperature_timeline_java/
│   │       ├── data/
│   │       │   ├── Helvetica-Bold-56.vlw
│   │       │   └── global-temp/
│   │       │       ├── README.md
│   │       │       ├── datapackage.json
│   │       │       ├── monthly_csv.csv
│   │       │       └── monthly_json.json
│   │       └── temperature_timeline_java.pde
│   ├── 03_pie_chart/
│   │   └── pie_chart_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── pie_chart_java.pde
│   ├── 04_radar_charts/
│   │   └── radar_charts_java/
│   │       └── radar_charts_java.pde
│   ├── 05_path_plotting_1/
│   │   └── path_plotting_1_java/
│   │       ├── data/
│   │       │   └── run.csv
│   │       └── path_plotting_1_java.pde
│   ├── 06_path_plotting_2/
│   │   └── path_plotting_2_java/
│   │       ├── data/
│   │       │   ├── Helvetica-Bold-72.vlw
│   │       │   └── run.csv
│   │       └── path_plotting_2_java.pde
│   ├── 07_dot_map/
│   │   └── dot_map_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── rat_sightings_lite.tsv
│   │       └── dot_map_java.pde
│   ├── 08_heat_map/
│   │   └── heat_map_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── rat_sightings_lite.tsv
│   │       └── heat_map_java.pde
│   ├── 09_social_network_graph/
│   │   └── social_network_graph_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── dolphin_relations.xml
│   │       └── social_network_graph_java.pde
│   ├── 10_social_network_matrix/
│   │   └── social_network_matrix_java/
│   │       ├── data/
│   │       │   └── monkey_relations.xml
│   │       └── social_network_matrix_java.pde
│   ├── 11_real_time_iss/
│   │   ├── iss_js/
│   │   │   ├── index.html
│   │   │   ├── libraries/
│   │   │   │   ├── p5.dom.js
│   │   │   │   ├── p5.js
│   │   │   │   └── p5.sound.js
│   │   │   └── sketch.js
│   │   └── real_time_iss_java/
│   │       └── real_time_iss_java.pde
│   ├── 12_web_scraping/
│   │   └── web_scraping_java/
│   │       └── web_scraping_java.pde
│   └── 13_one_dataset_four_ways/
│       └── one_dataset_four_ways_java/
│           ├── data/
│           │   └── SlateGunDeaths.tsv
│           └── one_dataset_four_ways_java.pde
├── 14_text_and_language/
│   ├── 01_string_search/
│   │   └── string_search_java/
│   │       └── string_search_java.pde
│   ├── 02_nonsense_words/
│   │   └── nonsense_words_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── clean.py
│   │       │   ├── prefixes.txt
│   │       │   ├── prefixes_dict.txt
│   │       │   ├── roots.txt
│   │       │   ├── roots_dict.txt
│   │       │   ├── suffixes.txt
│   │       │   └── suffixes_dict.txt
│   │       └── nonsense_words_java.pde
│   ├── 03_letter_frequency/
│   │   └── letter_frequency_java/
│   │       ├── data/
│   │       │   └── frankenstein.txt
│   │       └── letter_frequency_java.pde
│   ├── 04_letter_pair_frequency/
│   │   └── letter_pairs_java/
│   │       ├── data/
│   │       │   └── dubois.txt
│   │       └── letter_pairs_java.pde
│   ├── 05_average_word_length/
│   │   └── average_word_length_java/
│   │       └── average_word_length_java.pde
│   ├── 06_sorting_words/
│   │   ├── sorting_words_java/
│   │   │   └── sorting_words_java.pde
│   │   └── sorting_words_python/
│   │       └── sorting_words.py
│   ├── 07_cut-up_machine/
│   │   └── cut-up_machine_java/
│   │       ├── cut-up_machine_java.pde
│   │       └── data/
│   │           ├── CenturySchoolbook-60.vlw
│   │           └── news.txt
│   ├── 08_bigram_calculator/
│   │   └── bigram_calculator_java/
│   │       ├── bigram_calculator_java.pde
│   │       └── data/
│   │           └── green_eggs_and_ham.txt
│   ├── 09_dammit_jim/
│   │   └── dammit_jim_java/
│   │       ├── dammit_jim_java.pde
│   │       └── data/
│   │           ├── CenturySchoolbook-60.vlw
│   │           ├── clean.py
│   │           ├── jobs.txt
│   │           └── jobs_raw.txt
│   ├── 10_knock_knock_joke_generator/
│   │   ├── _archived/
│   │   │   ├── knock.py
│   │   │   └── output.txt
│   │   ├── knock_knock_java/
│   │   │   ├── data/
│   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   └── noun-definition.txt
│   │   │   └── knock_knock_java.pde
│   │   ├── knock_knock_joke_python/
│   │   │   ├── knock_knock_joke_python.pyde
│   │   │   └── sketch.properties
│   │   └── prep/
│   │       ├── noun-definition.txt
│   │       └── prepDict.py
│   ├── 11_translator_pig_latin/
│   │   ├── translator_pig_latin_java/
│   │   │   ├── data/
│   │   │   │   └── CenturySchoolbook-60.vlw
│   │   │   └── translator_pig_latin_java.pde
│   │   └── translator_pig_latin_python/
│   │       ├── output.txt
│   │       └── pig_latin.py
│   ├── 12_argots_and_language_games/
│   │   └── translator_argots_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── translator_argots_java.pde
│   ├── 14_rhyming_couplets/
│   │   └── rhyming_couplets_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── little_women.txt
│   │       ├── debug.txt
│   │       ├── rhymes.txt
│   │       └── rhyming_couplets_java.pde
│   ├── 15_haiku_finder/
│   │   └── haiku_finder_java/
│   │       ├── Pair.pde
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── cmudict.0.6d.txt
│   │       │   └── little_women.txt
│   │       └── haiku_finder_java.pde
│   ├── 16_markov_text_generator/
│   │   ├── markov_python/
│   │   │   ├── markov.py
│   │   │   ├── markov_lines.txt
│   │   │   └── transcript.txt
│   │   └── markov_text_generator_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   └── transcript.txt
│   │       └── markov_text_generator_java.pde
│   ├── 17_limerick/
│   │   ├── archive/
│   │   │   ├── limerick_java/
│   │   │   │   ├── data/
│   │   │   │   │   ├── CenturySchoolbook-60.vlw
│   │   │   │   │   ├── kafka.txt
│   │   │   │   │   └── wittgenstein.txt
│   │   │   │   └── limerick_java.pde
│   │   │   └── limerick_java_2/
│   │   │       ├── data/
│   │   │       │   ├── CenturySchoolbook-60.vlw
│   │   │       │   └── lime.yaml
│   │   │       └── limerick_java_2.pde
│   │   ├── data/
│   │   │   └── scotland_places.txt
│   │   └── limerick_java/
│   │       ├── data/
│   │       │   ├── CenturySchoolbook-60.vlw
│   │       │   ├── adjectives.txt
│   │       │   └── scotland_places.txt
│   │       └── limerick_java.pde
│   └── other/
│       ├── _IMPORTANT_text_code/
│       │   ├── Cut iii/
│       │   │   ├── make_recipe.py
│       │   │   └── recipe.txt
│       │   ├── Grammar/
│       │   │   ├── grammer.py
│       │   │   ├── occupations.txt
│       │   │   └── output.txt
│       │   ├── Joke/
│       │   │   ├── knock.py
│       │   │   └── output.txt
│       │   ├── Markov/
│       │   │   ├── markov.py
│       │   │   ├── markov_lines.txt
│       │   │   └── transcript.txt
│       │   ├── People, Places, Things/
│       │   │   ├── output.txt
│       │   │   └── replace_nouns.py
│       │   ├── Rhyme/
│       │   │   ├── output.txt
│       │   │   ├── rhyme.py
│       │   │   └── sentences.txt
│       │   ├── Sort/
│       │   │   ├── alphabet/
│       │   │   │   ├── alphabetic.py
│       │   │   │   └── output.txt
│       │   │   ├── frequency/
│       │   │   │   ├── freq.py
│       │   │   │   └── output.txt
│       │   │   └── length/
│       │   │       ├── length.py
│       │   │       └── output.txt
│       │   ├── Syllable/
│       │   │   ├── haiku1.txt
│       │   │   ├── haiku2.txt
│       │   │   ├── haiku3.txt
│       │   │   ├── haiku4.txt
│       │   │   ├── haiku5.txt
│       │   │   ├── haiku6.txt
│       │   │   ├── haiku7.txt
│       │   │   ├── syllables.py
│       │   │   └── word.txt
│       │   ├── Translation/
│       │   │   ├── output.txt
│       │   │   └── pig_latin.py
│       │   └── n-gram/
│       │       ├── huckfinn.txt
│       │       ├── ngram.py
│       │       ├── similarity.txt
│       │       └── tomsawyer.txt
│       ├── cutup_1/
│       │   ├── cutup_1.pyde
│       │   ├── data/
│       │   │   ├── Times-Roman-14.vlw
│       │   │   └── frost.txt
│       │   ├── screen-0153.tif
│       │   ├── screen-0177.tif
│       │   ├── screen-0185.tif
│       │   ├── screen-0207.tif
│       │   ├── screen-0246.tif
│       │   └── sketch.properties
│       ├── cutup_2/
│       │   ├── cutup_2.pyde
│       │   ├── data/
│       │   │   ├── macbeth.txt
│       │   │   └── trump.txt
│       │   ├── screen-0041.tif
│       │   ├── screen-0059.tif
│       │   ├── screen-0060.tif
│       │   ├── screen-0083.tif
│       │   ├── screen-0095.tif
│       │   ├── screen-0100.tif
│       │   ├── screen-0139.tif
│       │   ├── screen-0523.tif
│       │   ├── screen-0810.tif
│       │   ├── screen-1084.tif
│       │   ├── screen-1779.tif
│       │   ├── screen-2009.tif
│       │   ├── screen-3087.tif
│       │   └── sketch.properties
│       └── tfidf/
│           └── tfidf_java/
│               ├── data/
│               │   ├── CenturySchoolbook-60.vlw
│               │   ├── frankenstein.txt
│               │   └── little_women.txt
│               └── tfidf_java.pde
├── 15_simulation/
│   ├── 01_recursive_tree/
│   │   └── recursive_tree_java/
│   │       └── recursive_tree_java.pde
│   ├── 02_fireworks_particle_shower/
│   │   └── fireworks_java/
│   │       ├── Particle.pde
│   │       ├── ParticleSystem.pde
│   │       └── fireworks_java.pde
│   ├── 05_cursor_particles/
│   │   └── cursor_particles_java/
│   │       ├── cursor_particles_java.pde
│   │       └── data/
│   │           └── CenturySchoolbook-60.vlw
│   ├── 06_flow_field/
│   │   └── flow_field_java/
│   │       └── flow_field_java.pde
│   ├── 07_spring/
│   │   └── spring.pde
│   ├── 08_circle_packing/
│   │   ├── circle_packing_montecarlo_java/
│   │   │   └── circle_packing_montecarlo_java.pde
│   │   ├── circle_packing_montecarlo_p5js/
│   │   │   ├── circle_packing_montecarlo_p5js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   ├── circle_packing_montecarlo_pyde/
│   │   │   └── circle_packing_montecarlo_pyde.pyde
│   │   └── circle_packing_simple_java/
│   │       └── circle_packing_simple_java.pde
│   ├── 09_conways_life/
│   │   └── conways_life_java/
│   │       └── conways_life_java.pde
│   ├── 10_diffusion_limited_aggregation/
│   │   ├── dla_java/
│   │   │   └── dla_java.pde
│   │   ├── dla_p5js/
│   │   │   ├── dla_p5js.js
│   │   │   ├── index.html
│   │   │   └── sketch.properties
│   │   └── dla_pyde/
│   │       ├── dla_pyde.pyde
│   │       └── sketch.properties
│   ├── 11_snowflake/
│   │   └── snowflake_java/
│   │       └── snowflake_java.pde
│   └── 13_differential_growth/
│       └── differential_growth_java/
│           └── differential_growth_java.pde
├── 16_machine_learning/
│   ├── 04_what_do_you_see/
│   │   └── what_do_you_see_js/
│   │       ├── index.html
│   │       └── what_do_you_see_js.js
│   ├── 05_dont_touch_your_face/
│   │   └── dont_touch_your_face_js/
│   │       ├── dont_touch_your_face_js.js
│   │       └── index.html
│   ├── 06_emoji_translator/
│   │   └── emoji_translator_js/
│   │       ├── emoji_translator_js.js
│   │       └── index.html
│   └── 10_environmental_sound_clock/
│       └── environmental_sound_clock_js/
│           ├── environmental_sound_clock_js.js
│           ├── index.html
│           └── style.css
├── 17_sound/
│   ├── 01_theremin/
│   │   └── theremin_js/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       ├── sketch.properties
│   │       └── theremin_js.js
│   ├── 02_sequencer_I/
│   │   └── sequencer_I_js/
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       ├── sequencer_js.js
│   │       └── sketch.properties
│   ├── 03_sequencer_II/
│   │   └── sequencer_II_js/
│   │       ├── index.html
│   │       └── sketch.js
│   ├── 08_visualizer/
│   │   └── visualizer_java/
│   │       ├── data/
│   │       │   └── beat_8bitsigned.raw
│   │       └── visualizer_java.pde
│   ├── 09_data_sonification/
│   │   └── data_sonification_js/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       ├── data_sonification_js.js
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       └── sketch.properties
│   ├── 10_delay_line_effect/
│   │   └── delay_line_effect_js/
│   │       ├── delay_line_effect_js.js
│   │       ├── index.html
│   │       ├── libraries/
│   │       │   └── tone.js
│   │       └── sketch.properties
│   ├── libraries/
│   │   ├── Tone.js
│   │   ├── p5.dom.js
│   │   ├── p5.js
│   │   └── p5.sound.js
│   └── work_in_progress/
│       ├── fft/
│       │   ├── index.html
│       │   └── sketch.js
│       ├── guitar.maxpat
│       ├── polyphony/
│       │   └── polyphony.pde
│       ├── sequencer_2/
│       │   └── sequencer_2_js/
│       │       ├── data/
│       │       │   └── CenturySchoolbook-60.vlw
│       │       ├── index.html
│       │       ├── libraries/
│       │       │   └── tone.js
│       │       ├── sequencer_2_js.js
│       │       └── sketch.properties
│       ├── voice_synthesizer/
│       │   ├── data/
│       │   │   ├── OCRAStd-96.vlw
│       │   │   └── voice_raw_8bit_signed.raw
│       │   └── voice_synthesizer.pde
│       └── whistle_cursor/
│           └── whistle_cursor.pde
├── 18_games/
│   ├── 02_collision_detection/
│   │   └── collision_detection_java/
│   │       └── collision_detection_java.pde
│   ├── 03_whack_a_mole/
│   │   └── whack_a_mole_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── whack_a_mole_java.pde
│   ├── 04_WASD_navigation/
│   │   └── WASD_navigation_java/
│   │       └── WASD_navigation_java.pde
│   ├── 05_recoding_a_classic/
│   │   └── snake_java/
│   │       └── snake_java.pde
│   ├── 06_physics_fun/
│   │   └── physics_fun_java/
│   │       ├── data/
│   │       │   └── CenturySchoolbook-60.vlw
│   │       └── physics_fun_java.pde
│   └── 07_level_designer/
│       └── level_designer_java/
│           ├── data/
│           │   └── CenturySchoolbook-60.vlw
│           └── level_designer_java.pde
├── README.md
└── checklist.md
Download .txt
Showing preview only (1,231K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (13763 symbols across 156 files)

FILE: 01_graphic_elements/03_initials/initials_javascript/libraries/p5.dom.js
  function getContainer (line 158) | function getContainer(p) {
  function wrapElement (line 174) | function wrapElement(elt) {
  function addElement (line 224) | function addElement(elt, pInst, media) {
  function handleFileSelect (line 772) | function handleFileSelect(evt) {
  function createMedia (line 810) | function createMedia(pInst, type, src, callback) {

FILE: 01_graphic_elements/03_initials/initials_javascript/libraries/p5.js
  function s (line 2) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function line (line 27) | function line(ctx, x1, y1, x2, y2) {
  function DefaultEncoding (line 163) | function DefaultEncoding(font) {
  function CmapEncoding (line 184) | function CmapEncoding(cmap) {
  function CffEncoding (line 192) | function CffEncoding(encoding, charset) {
  function GlyphNames (line 203) | function GlyphNames(post) {
  function addGlyphNames (line 241) | function addGlyphNames(font) {
  function Font (line 286) | function Font(options) {
  function assert (line 486) | function assert(predicate, message) {
  function assertStringAttribute (line 492) | function assertStringAttribute(attrName) {
  function getPathDefinition (line 562) | function getPathDefinition(glyph, path) {
  function Glyph (line 586) | function Glyph(options) {
  function drawCircles (line 745) | function drawCircles(l, x, y, scale) {
  function GlyphSet (line 840) | function GlyphSet(font, glyphs) {
  function glyphLoader (line 865) | function glyphLoader(font, index) {
  function ttfGlyphLoader (line 875) | function ttfGlyphLoader(font, index, parseGlyph, data, position, buildPa...
  function cffGlyphLoader (line 890) | function cffGlyphLoader(font, index, parseCFFCharstring, charstring) {
  function toArrayBuffer (line 942) | function toArrayBuffer(buffer) {
  function loadFromFile (line 952) | function loadFromFile(path, callback) {
  function loadFromUrl (line 963) | function loadFromUrl(url, callback) {
  function parseBuffer (line 983) | function parseBuffer(buffer) {
  function load (line 1110) | function load(url, callback) {
  function Parser (line 1229) | function Parser(data, offset) {
  function Path (line 1355) | function Path() {
  function floatToString (line 1452) | function floatToString(v) {
  function packValues (line 1460) | function packValues() {
  function Table (line 1527) | function Table(tableName, fields, options) {
  function equals (line 1590) | function equals(a, b) {
  function parseCFFIndex (line 1612) | function parseCFFIndex(data, start, conversionFn) {
  function parseFloatOperand (line 1648) | function parseFloatOperand(parser) {
  function parseOperand (line 1674) | function parseOperand(parser, b0) {
  function entriesToObject (line 1716) | function entriesToObject(entries) {
  function parseCFFDict (line 1740) | function parseCFFDict(data, start, size) {
  function getCFFString (line 1772) | function getCFFString(strings, index) {
  function interpretDict (line 1784) | function interpretDict(dict, meta, strings) {
  function parseCFFHeader (line 1807) | function parseCFFHeader(data, start) {
  function parseCFFTopDict (line 1850) | function parseCFFTopDict(data, strings) {
  function parseCFFPrivateDict (line 1856) | function parseCFFPrivateDict(data, start, size, strings) {
  function parseCFFCharset (line 1864) | function parseCFFCharset(data, start, nGlyphs, strings) {
  function parseCFFEncoding (line 1907) | function parseCFFEncoding(data, start, charset) {
  function parseCFFCharstring (line 1940) | function parseCFFCharstring(font, glyph, code) {
  function calcCFFSubroutineBias (line 2345) | function calcCFFSubroutineBias(subrs) {
  function parseCFFTable (line 2359) | function parseCFFTable(data, start, font) {
  function encodeString (line 2413) | function encodeString(s, strings) {
  function makeHeader (line 2434) | function makeHeader() {
  function makeNameIndex (line 2443) | function makeNameIndex(fontNames) {
  function makeDict (line 2456) | function makeDict(meta, attrs, strings) {
  function makeTopDict (line 2474) | function makeTopDict(attrs, strings) {
  function makeTopDictIndex (line 2482) | function makeTopDictIndex(topDict) {
  function makeStringIndex (line 2490) | function makeStringIndex(strings) {
  function makeGlobalSubrIndex (line 2502) | function makeGlobalSubrIndex() {
  function makeCharsets (line 2509) | function makeCharsets(glyphNames, strings) {
  function glyphToOps (line 2522) | function glyphToOps(glyph) {
  function makeCharStringsIndex (line 2591) | function makeCharStringsIndex(glyphs) {
  function makePrivateDict (line 2605) | function makePrivateDict(attrs, strings) {
  function makePrivateDictIndex (line 2613) | function makePrivateDictIndex(privateDict) {
  function makeCFFTable (line 2621) | function makeCFFTable(glyphs, options) {
  function parseCmapTable (line 2710) | function parseCmapTable(data, start) {
  function addSegment (line 2790) | function addSegment(t, code, glyphIndex) {
  function addTerminatorSegment (line 2799) | function addTerminatorSegment(t) {
  function makeCmapTable (line 2808) | function makeCmapTable(glyphs) {
  function parseGlyphCoordinate (line 2897) | function parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask...
  function parseGlyph (line 2923) | function parseGlyph(glyph, data, start) {
  function transformPoints (line 3047) | function transformPoints(points, transform) {
  function getContours (line 3063) | function getContours(points) {
  function getPath (line 3080) | function getPath(points) {
  function buildPath (line 3150) | function buildPath(glyphs, glyph) {
  function parseGlyfTable (line 3166) | function parseGlyfTable(data, start, loca, font) {
  function parseTaggedListTable (line 3197) | function parseTaggedListTable(data, start) {
  function parseCoverageTable (line 3211) | function parseCoverageTable(data, start) {
  function parseClassDefTable (line 3235) | function parseClassDefTable(data, start) {
  function parsePairPosSubTable (line 3282) | function parsePairPosSubTable(data, start) {
  function parseLookupTable (line 3369) | function parseLookupTable(data, start) {
  function parseGposTable (line 3403) | function parseGposTable(data, start, font) {
  function parseHeadTable (line 3438) | function parseHeadTable(data, start) {
  function makeHeadTable (line 3462) | function makeHeadTable(options) {
  function parseHheaTable (line 3497) | function parseHheaTable(data, start) {
  function makeHheaTable (line 3517) | function makeHheaTable(options) {
  function parseHmtxTable (line 3553) | function parseHmtxTable(data, start, numMetrics, numGlyphs, glyphs) {
  function makeHmtxTable (line 3570) | function makeHmtxTable(glyphs) {
  function parseKernTable (line 3597) | function parseKernTable(data, start) {
  function parseLocaTable (line 3637) | function parseLocaTable(data, start, numGlyphs, shortVersion) {
  function parseMaxpTable (line 3669) | function parseMaxpTable(data, start) {
  function makeMaxpTable (line 3693) | function makeMaxpTable(numGlyphs) {
  function parseNameTable (line 3743) | function parseNameTable(data, start) {
  function makeNameRecord (line 3787) | function makeNameRecord(platformID, encodingID, languageID, nameID, leng...
  function addMacintoshNameRecord (line 3798) | function addMacintoshNameRecord(t, recordID, s, offset) {
  function addWindowsNameRecord (line 3807) | function addWindowsNameRecord(t, recordID, s, offset) {
  function makeNameTable (line 3816) | function makeNameTable(options) {
  function getUnicodeRange (line 3993) | function getUnicodeRange(unicode) {
  function parseOS2Table (line 4005) | function parseOS2Table(data, start) {
  function makeOS2Table (line 4058) | function makeOS2Table(options) {
  function parsePostTable (line 4125) | function parsePostTable(data, start) {
  function makePostTable (line 4170) | function makePostTable() {
  function log2 (line 4209) | function log2(v) {
  function computeCheckSum (line 4213) | function computeCheckSum(bytes) {
  function makeTableRecord (line 4230) | function makeTableRecord(tag, checkSum, offset, length) {
  function makeSfntTable (line 4239) | function makeSfntTable(tables) {
  function metricsForChar (line 4295) | function metricsForChar(font, chars, notFoundMetrics) {
  function average (line 4307) | function average(vs) {
  function fontToSfntTable (line 4318) | function fontToSfntTable(font) {
  function constant (line 4506) | function constant(v) {
  function succeed (line 4977) | function succeed(r) {
  function handleReadyState (line 4983) | function handleReadyState(r, success, error) {
  function setHeaders (line 4998) | function setHeaders(http, o) {
  function setCredentials (line 5014) | function setCredentials(http, o) {
  function generalCallback (line 5020) | function generalCallback(data) {
  function urlappend (line 5024) | function urlappend (url, s) {
  function handleJsonp (line 5028) | function handleJsonp(o, fn, err, url) {
  function getRequest (line 5088) | function getRequest(fn, err) {
  function Reqwest (line 5136) | function Reqwest(o, fn) {
  function setType (line 5143) | function setType(header) {
  function init (line 5151) | function init(o, fn) {
  function reqwest (line 5333) | function reqwest(o, fn) {
  function normalize (line 5338) | function normalize(s) {
  function serial (line 5342) | function serial(el, cb) {
  function eachFormElement (line 5384) | function eachFormElement() {
  function serializeQueryString (line 5403) | function serializeQueryString() {
  function serializeHash (line 5408) | function serializeHash() {
  function buildParams (line 5469) | function buildParams(prefix, obj, traditional, add) {
  function getWindowWidth (line 10381) | function getWindowWidth() {
  function getWindowHeight (line 10388) | function getWindowHeight() {
  function launchFullscreen (line 10534) | function launchFullscreen(element) {
  function exitFullscreen (line 10553) | function exitFullscreen() {
  function typeMatches (line 10703) | function typeMatches(defType, argType, arg) {
  function report (line 10730) | function report(message, func, color) {
  function friendlyWelcome (line 10883) | function friendlyWelcome() {
  function defineMisusedAtTopLevelCode (line 10939) | function defineMisusedAtTopLevelCode() {
  function helpForMisusedAtTopLevelCode (line 10985) | function helpForMisusedAtTopLevelCode(e, log) {
  function makeLoader (line 11844) | function makeLoader(theFile) {
  function attachListener (line 11909) | function attachListener(ev, fxn, ctx) {
  function calculateOffset (line 12201) | function calculateOffset(object) {
  function getMousePos (line 16714) | function getMousePos(canvas, evt) {
  function getTouchInfo (line 17292) | function getTouchInfo(canvas, e, i) {
  function buildBlurKernel (line 17967) | function buildBlurKernel(r) {
  function blurARGB (line 18003) | function blurARGB(canvas, radius) {
  function _sAssign (line 18557) | function _sAssign(sVal, iVal) {
  function makeObject (line 20878) | function makeObject(row, headers) {
  function escapeHelper (line 21467) | function escapeHelper(content) {
  function _checkFileExtension (line 21663) | function _checkFileExtension(filename, extension) {
  function destroyClickedElement (line 21705) | function destroyClickedElement(event) {
  function pathToPoints (line 27458) | function pathToPoints(cmds, options) {
  function simplify (line 27481) | function simplify(pts, angle) {
  function splitPaths (line 27498) | function splitPaths(cmds) {
  function cmdToArr (line 27515) | function cmdToArr(cmd) {
  function parseOpts (line 27529) | function parseOpts(options, defaults) {
  function at (line 27546) | function at(v, i) {
  function collinear (line 27551) | function collinear(a, b, c, thresholdAngle) {
  function areaTriangle (line 27576) | function areaTriangle(a, b, c) {
  function findDotsAtSegment (line 27582) | function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
  function getPointAtSegmentLength (line 27602) | function getPointAtSegmentLength(p1x,p1y,c1x,c1y,c2x,c2y,p2x,p2y,length) {
  function pointAtLength (line 27608) | function pointAtLength(path, length, istotal) {
  function pathToAbsolute (line 27643) | function pathToAbsolute(pathArray) {
  function path2curve (line 27730) | function path2curve(path, path2) {
  function a2c (line 27861) | function a2c(x1, y1, rx, ry, angle, lac, sweep_flag, x2, y2, recursive) {
  function catmullRom2bezier (line 27949) | function catmullRom2bezier(crp, z) {
  function l2c (line 28004) | function l2c(x1, y1, x2, y2) { return [x1, y1, x2, y2, x2, y2]; }
  function q2c (line 28006) | function q2c(x1, y1, ax, ay, x2, y2) {
  function bezlen (line 28014) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
  function getTatLen (line 28032) | function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {
  function base3 (line 28046) | function base3(t, p1, p2, p3, p4) {
  function cacheKey (line 28052) | function cacheKey() {
  function doNf (line 28879) | function doNf() {
  function doNfc (line 28963) | function doNfc() {
  function addNfp (line 29037) | function addNfp() {
  function addNfs (line 29094) | function addNfs() {
  function parseObj (line 30002) | function parseObj( model, lines ) {
  function flatten (line 31691) | function flatten(arr){
  function vToNArray (line 31708) | function vToNArray(arr){

FILE: 01_graphic_elements/03_initials/initials_javascript/libraries/p5.sound.js
  function fixSetTarget (line 86) | function fixSetTarget(param) {
  function getPeaksAtThreshold (line 1912) | function getPeaksAtThreshold(data, threshold) {
  function countIntervalsBetweenNearbyPeaks (line 1928) | function countIntervalsBetweenNearbyPeaks(peaksObj) {
  function groupNeighborsByTempo (line 1964) | function groupNeighborsByTempo(intervalCounts, sampleRate) {
  function getPeaksAtTopTempo (line 1991) | function getPeaksAtTopTempo(peaksObj, tempo, sampleRate, bpmVariance) {
  function mapTempo (line 2018) | function mapTempo(theoreticalTempo) {
  function isUndef (line 2918) | function isUndef(val) {
  function isFunction (line 2921) | function isFunction(val) {
  function TempConstructor (line 3279) | function TempConstructor() {
  function getTransportBpm (line 3456) | function getTransportBpm() {
  function getTransportTimeSignature (line 3463) | function getTransportTimeSignature() {
  function toNotationHelper (line 3689) | function toNotationHelper(time, bpm, timeSignature, testNotations) {
  function createDCOffset (line 6127) | function createDCOffset() {
  function playNextPart (line 8438) | function playNextPart(aScore) {
  function interleave (line 8723) | function interleave(leftChannel, rightChannel) {
  function writeUTFBytes (line 8734) | function writeUTFBytes(view, offset, string) {
  function makeDistortionCurve (line 9105) | function makeDistortionCurve(amount) {

FILE: 01_graphic_elements/03_initials/initials_javascript/sketch.js
  function setup (line 3) | function setup(){

FILE: 02_iteration/01_simple_iteration_seven_circles/simple_iteration_js/simple_iteration_js.js
  function setup (line 2) | function setup(){

FILE: 02_iteration/02_transitioning_rectangles/transitioning_rectangles_js/transitioning_rectangles_js.js
  function setup (line 1) | function setup() {
  function draw (line 6) | function draw() {

FILE: 02_iteration/03_string_art_challenge/string_art_challenge_js/string_art_challenge_js.js
  function setup (line 1) | function setup() {
  function draw (line 6) | function draw() {

FILE: 02_iteration/04_mini_calendar/mini_calendar_js/mini_calendar_js.js
  function setup (line 1) | function setup() {
  function draw (line 7) | function draw() {
  function lengthOfMonth (line 50) | function lengthOfMonth(){

FILE: 02_iteration/05_receding_landscape/receding_landscape_js/receding_landscape_js.js
  function setup (line 1) | function setup() {

FILE: 02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_js/lines_to_the_cursor_js.js
  function setup (line 1) | function setup() {
  function draw (line 6) | function draw() {

FILE: 02_iteration/07_color_bar_gradient/color_bar_gradient_js/color_bar_gradient_js.js
  function setup (line 5) | function setup() {
  function draw (line 16) | function draw() {
  function mousePressed (line 30) | function mousePressed() {

FILE: 02_iteration/08_dashed_line/dashed_line_js/dashed_line_js.js
  function setup (line 1) | function setup() {
  function draw (line 6) | function draw() {

FILE: 02_iteration/09_nested_iteration_checkers/checkers_js/checkers_js.js
  function setup (line 1) | function setup() {
  function draw (line 5) | function draw() {

FILE: 02_iteration/10_iteration_with_functions/interaction_with_functions_js/interaction_with_functions_js.js
  function setup (line 5) | function setup() {
  function draw (line 9) | function draw() {
  function drawFace (line 28) | function drawFace(x, y, side) {

FILE: 02_iteration/11_stochastic_elements/stochastic_elements_js/stochastic_elements_js.js
  function setup (line 3) | function setup() {
  function draw (line 8) | function draw() {
  function drawCrater (line 19) | function drawCrater(rx, ry, rd) {

FILE: 02_iteration/12_interrupted_grid/interrupted_grid_js/interrupted_grid_js.js
  function setup (line 3) | function setup() {
  function draw (line 9) | function draw() {

FILE: 02_iteration/13_geometric_progression/geometric_progression_js/geometric_progression_js.js
  function setup (line 3) | function setup() {
  function draw (line 8) | function draw() {

FILE: 02_iteration/14_moire_patterns/moire_js/moire_js.js
  function setup (line 3) | function setup() {
  function draw (line 9) | function draw() {

FILE: 02_iteration/15_recoding_schotter/schotter_js/schotter_js.js
  function setup (line 5) | function setup() {
  function draw (line 11) | function draw() {

FILE: 02_iteration/16_hexagonal_grid/hexagonal_grid_js/hexagonal_grid_js.js
  function setup (line 5) | function setup() {
  function draw (line 12) | function draw() {
  function hexagon (line 37) | function hexagon(x, y, side) {

FILE: 03_color/02_overlapping_color/overlapping_color_js/overlapping_color_js.js
  function setup (line 4) | function setup() {
  function draw (line 10) | function draw() {

FILE: 03_color/03_constructing_a_gradient/constructing_a_gradient_js/constructing_a_gradient_js.js
  function setup (line 7) | function setup() {
  function draw (line 13) | function draw() {
  function mousePressed (line 23) | function mousePressed() {

FILE: 03_color/04_color_wheel/color_wheel_js/color_wheel_js.js
  function setup (line 1) | function setup() {

FILE: 03_color/05_threshold_of_perception/threshold_of_perception_js/threshold_of_perception_js.js
  function setup (line 1) | function setup() {
  function draw (line 5) | function draw() {

FILE: 03_color/06_interactive_complement/interactive_complement_js/interactive_complement_js.js
  function setup (line 4) | function setup() {
  function draw (line 11) | function draw() {

FILE: 03_color/07_accented_palette/accented_palette_js/accented_palette_js.js
  function setup (line 1) | function setup() {
  function draw (line 12) | function draw() {
  function mouseMoved (line 68) | function mouseMoved() {

FILE: 03_color/08_split_complements/split_complementary_js/split_complementary_js.js
  function setup (line 4) | function setup() {
  function draw (line 10) | function draw() {
  function drawColorEllipse (line 35) | function drawColorEllipse(radius, ma, mr){

FILE: 03_color/09_albers_color_relativity_1/color_relativity_1_js/color_relativity_1_js.js
  function setup (line 4) | function setup() {
  function draw (line 9) | function draw() {

FILE: 03_color/10_albers_color_relativity_2/color_relativity_2_js/color_relativity_2_js.js
  function setup (line 4) | function setup() {

FILE: 03_color/11_color_inspector/color_inspector_js/color_inspector_js.js
  function setup (line 6) | function setup() {
  function draw (line 14) | function draw() {

FILE: 03_color/12_color_survey/color_survey_app_js/server.js
  function sendRows (line 39) | function sendRows(response){

FILE: 03_color/12_color_survey/color_survey_app_js/sketches/survey/sketch.js
  function setup (line 17) | function setup(){
  function isMouseOver (line 27) | function isMouseOver(x,y,w,h){
  function slider (line 32) | function slider(container,idx,x,y,w,h,col){
  function submitButton (line 50) | function submitButton(x,y,w,h){
  function draw (line 69) | function draw(){
  function mousePressed (line 105) | function mousePressed(){ // or mouseClicked(), which seems to have janky...

FILE: 03_color/12_color_survey/color_survey_app_js/sketches/viewer/sketch.js
  function setup (line 13) | function setup(){

FILE: 03_color/13_palette_from_photo/palette_from_book_js/palette_from_book_js.js
  function preload (line 12) | function preload() {
  function setup (line 16) | function setup() {
  function draw (line 37) | function draw() {
  function KMeans (line 52) | function KMeans() {
  function initializeCentroids (line 80) | function initializeCentroids() {
  function getPixel (line 90) | function getPixel(index) {
  function updateAssignment (line 94) | function updateAssignment(index) {
  function updateCentroids (line 119) | function updateCentroids() {
  function getDistance (line 142) | function getDistance(c1, c2) {

FILE: 05_unpredictability/01_coin_toss/coin_toss_javascript/p5.js
  function r (line 2) | function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==...
  function getLens (line 27837) | function getLens (b64) {
  function byteLength (line 27857) | function byteLength (b64) {
  function _byteLength (line 27864) | function _byteLength (b64, validLen, placeHoldersLen) {
  function toByteArray (line 27868) | function toByteArray (b64) {
  function tripletToBase64 (line 27913) | function tripletToBase64 (num) {
  function encodeChunk (line 27920) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 27933) | function fromByteArray (uint8) {
  function typedArraySupport (line 28015) | function typedArraySupport () {
  function createBuffer (line 28042) | function createBuffer (length) {
  function Buffer (line 28062) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 28088) | function from (value, encodingOrOffset, length) {
  function assertSize (line 28153) | function assertSize (size) {
  function alloc (line 28161) | function alloc (size, fill, encoding) {
  function allocUnsafe (line 28185) | function allocUnsafe (size) {
  function fromString (line 28203) | function fromString (string, encoding) {
  function fromArrayLike (line 28227) | function fromArrayLike (array) {
  function fromArrayBuffer (line 28236) | function fromArrayBuffer (array, byteOffset, length) {
  function fromObject (line 28259) | function fromObject (obj) {
  function checked (line 28284) | function checked (length) {
  function SlowBuffer (line 28294) | function SlowBuffer (length) {
  function byteLength (line 28385) | function byteLength (string, encoding) {
  function slowToString (line 28434) | function slowToString (encoding, start, end) {
  function swap (line 28512) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 28652) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 28708) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 28776) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 28801) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 28805) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 28809) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 28813) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 28817) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 28899) | function base64Slice (buf, start, end) {
  function utf8Slice (line 28907) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 28985) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 29003) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 29013) | function latin1Slice (buf, start, end) {
  function hexSlice (line 29023) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 29036) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 29075) | function checkOffset (offset, ext, length) {
  function checkInt (line 29250) | function checkInt (buf, value, offset, ext, max, min) {
  function checkIEEE754 (line 29438) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 29443) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 29461) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 29600) | function base64clean (str) {
  function toHex (line 29614) | function toHex (n) {
  function utf8ToBytes (line 29619) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 29699) | function asciiToBytes (str) {
  function utf16leToBytes (line 29708) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 29724) | function base64ToBytes (str) {
  function blitBuffer (line 29728) | function blitBuffer (src, dst, offset, length) {
  function isInstance (line 29739) | function isInstance (obj, type) {
  function numberIsNaN (line 29744) | function numberIsNaN (obj) {
  function objectOrFunction (line 29765) | function objectOrFunction(x) {
  function isFunction (line 29770) | function isFunction(x) {
  function setScheduler (line 29807) | function setScheduler(scheduleFn) {
  function setAsap (line 29811) | function setAsap(asapFn) {
  function useNextTick (line 29824) | function useNextTick() {
  function useVertxTimer (line 29833) | function useVertxTimer() {
  function useMutationObserver (line 29843) | function useMutationObserver() {
  function useMessageChannel (line 29855) | function useMessageChannel() {
  function useSetTimeout (line 29863) | function useSetTimeout() {
  function flush (line 29873) | function flush() {
  function attemptVertx (line 29887) | function attemptVertx() {
  function then (line 29911) | function then(onFulfillment, onRejection) {
  function resolve$1 (line 29966) | function resolve$1(object) {
  function noop (line 29981) | function noop() {}
  function selfFulfillment (line 29989) | function selfFulfillment() {
  function cannotReturnOwn (line 29993) | function cannotReturnOwn() {
  function getThen (line 29997) | function getThen(promise) {
  function tryThen (line 30006) | function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
  function handleForeignThenable (line 30014) | function handleForeignThenable(promise, thenable, then$$1) {
  function handleOwnThenable (line 30043) | function handleOwnThenable(promise, thenable) {
  function handleMaybeThenable (line 30057) | function handleMaybeThenable(promise, maybeThenable, then$$1) {
  function resolve (line 30074) | function resolve(promise, value) {
  function publishRejection (line 30084) | function publishRejection(promise) {
  function fulfill (line 30092) | function fulfill(promise, value) {
  function reject (line 30105) | function reject(promise, reason) {
  function subscribe (line 30115) | function subscribe(parent, child, onFulfillment, onRejection) {
  function publish (line 30131) | function publish(promise) {
  function tryCatch (line 30157) | function tryCatch(callback, detail) {
  function invokeCallback (line 30166) | function invokeCallback(settled, promise, callback, detail) {
  function initializePromise (line 30206) | function initializePromise(promise, resolver) {
  function nextId (line 30219) | function nextId() {
  function makePromise (line 30223) | function makePromise(promise) {
  function validationError (line 30230) | function validationError() {
  function Enumerator (line 30235) | function Enumerator(Constructor, input) {
  function all (line 30375) | function all(entries) {
  function race (line 30444) | function race(entries) {
  function reject$1 (line 30496) | function reject$1(reason) {
  function needsResolver (line 30504) | function needsResolver() {
  function needsNew (line 30508) | function needsNew() {
  function Promise (line 30617) | function Promise(resolver) {
  function polyfill (line 30890) | function polyfill() {
  function generateCallbackFunction (line 30958) | function generateCallbackFunction() {
  function clearFunction (line 30962) | function clearFunction(functionName) {
  function removeScript (line 30972) | function removeScript(scriptId) {
  function fetchJsonp (line 30979) | function fetchJsonp(_url) {
  function t (line 31366) | function t(a,b){return a.b===b.b&&a.a===b.a}
  function u (line 31366) | function u(a,b){return a.b<b.b||a.b===b.b&&a.a<=b.a}
  function v (line 31366) | function v(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?d<e?b.a-a.a+d/(d+...
  function x (line 31366) | function x(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?(b.a-c.a)*d+(b.a-...
  function z (line 31366) | function z(a,b){return a.a<b.a||a.a===b.a&&a.b<=b.b}
  function aa (line 31366) | function aa(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?d<e?b.b-a.b+d/(d...
  function ba (line 31367) | function ba(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?(b.b-c.b)*d+(b.b...
  function ca (line 31367) | function ca(a){return u(a.b.a,a.a)}
  function da (line 31367) | function da(a){return u(a.a,a.b.a)}
  function A (line 31367) | function A(a,b,c,d){a=0>a?0:a;c=0>c?0:c;return a<=c?0===c?(b+d)/2:b+a/(a...
  function ea (line 31367) | function ea(a){var b=B(a.b);C(b,a.c);C(b.b,a.c);D(b,a.a);return b}
  function E (line 31367) | function E(a,b){var c=!1,d=!1;a!==b&&(b.a!==a.a&&(d=!0,F(b.a,a.a)),b.d!=...
  function I (line 31367) | function I(a){var b=a.b,c=!1;a.d!==a.b.d&&(c=!0,G(a.d,a.b.d));a.c===a?F(...
  function K (line 31368) | function K(a){var b=B(a),c=b.b;H(b,a.e);b.a=a.b.a;C(c,b.a);b.d=c.d=a.d;b...
  function L (line 31368) | function L(a,b){var c=!1,d=B(a),e=d.b;b.d!==a.d&&(c=!0,G(b.d,a.d));H(d,a...
  function B (line 31368) | function B(a){var b=new M,c=new M,d=a.b.h;c.h=d;d.b.h=b;b.h=a;a.b.h=c;b....
  function H (line 31368) | function H(a,b){var c=a.c,d=b.c;c.b.e=b;d.b.e=a;a.c=d;b.c=c}
  function C (line 31369) | function C(a,b){var c=b.f,d=new N(b,c);c.e=d;b.f=d;c=d.c=a;do c.a=d,c=c....
  function D (line 31369) | function D(a,b){var c=b.d,d=new ga(b,c);c.b=d;b.d=d;d.a=a;d.c=b.c;c=a;do...
  function fa (line 31369) | function fa(a){var b=a.h;a=a.b.h;b.b.h=a;a.b.h=b}
  function F (line 31369) | function F(a,b){var c=a.c,d=c;do d.a=b,d=d.c;while(d!==c);c=a.f;d=a.e;d....
  function G (line 31369) | function G(a,b){var c=a.a,d=c;do d.d=b,d=d.e;while(d!==c);c=a.d;d=a.b;d....
  function ha (line 31369) | function ha(a){var b=0;Math.abs(a[1])>Math.abs(a[0])&&(b=1);Math.abs(a[2...
  function P (line 31369) | function P(a,b){a.f+=b.f;a.b.f+=b.b.f}
  function ia (line 31369) | function ia(a,b,c){a=a.a;b=b.a;c=c.a;if(b.b.a===a)return c.b.a===a?u(b.a...
  function Q (line 31369) | function Q(a){a.a.i=null;var b=a.e;b.a.c=b.c;b.c.a=b.a;a.e=null}
  function ja (line 31369) | function ja(a,b){I(a.a);a.c=!1;a.a=b;b.i=a}
  function ka (line 31369) | function ka(a){var b=a.a.a;do a=R(a);while(a.a.a===b);a.c&&(b=L(S(a).a.b...
  function la (line 31370) | function la(a,b,c){var d=new ma;d.a=c;d.e=na(a.f,b.e,d);return c.i=d}
  function oa (line 31370) | function oa(a,b){switch(a.s){case 100130:return 0!==(b&1);case 100131:re...
  function pa (line 31370) | function pa(a){var b=a.a,c=b.d;c.c=a.d;c.a=b;Q(a)}
  function T (line 31370) | function T(a,b,c){a=b;for(b=b.a;a!==c;){a.c=!1;var d=S(a),e=d.a;if(e.a!=...
  function U (line 31371) | function U(a,b,c,d,e,f){var g=!0;do la(a,b,c.b),c=c.c;while(c!==d);for(n...
  function sa (line 31371) | function sa(a,b,c,d,e){var f=[b.g[0],b.g[1],b.g[2]];b.d=null;b.d=a.o?a.o...
  function ta (line 31372) | function ta(a,b,c){var d=[null,null,null,null];d[0]=b.a.d;d[1]=c.a.d;sa(...
  function ua (line 31372) | function ua(a,b,c,d,e){var f=Math.abs(b.b-a.b)+Math.abs(b.a-a.a),g=Math....
  function qa (line 31373) | function qa(a,b){var c=S(b),d=b.a,e=c.a;if(u(d.a,e.a)){if(0<x(e.b.a,d.a,...
  function wa (line 31374) | function wa(a,b){var c=S(b),d=b.a,e=c.a,f=d.a,g=e.a,h=d.b.a,k=e.b.a,l=ne...
  function ra (line 31377) | function ra(a,b){for(var c=S(b);;){for(;c.b;)b=c,c=S(c);if(!b.b&&(c=b,b=...
  function ya (line 31379) | function ya(a,b){a.a=b;for(var c=b.c;null===c.i;)if(c=c.c,c===b.c){var c...
  function za (line 31380) | function za(a,b){var c=new ma,d=ea(a.b);d.a.b=O;d.a.a=b;d.b.a.b=-O;d.b.a...
  function Aa (line 31380) | function Aa(a){this.a=new Ba;this.b=a;this.c=ia}
  function na (line 31380) | function na(a,b,c){do b=b.c;while(null!==b.b&&!a.c(a.b,b.b,c));a=new Ba(...
  function Ba (line 31380) | function Ba(a,b,c){this.b=a||null;this.a=b||this;this.c=c||this}
  function X (line 31380) | function X(){this.d=Y;this.p=this.b=this.q=null;this.j=[0,0,0];this.s=10...
  function Z (line 31390) | function Z(a,b){if(a.d!==b)for(;a.d!==b;)if(a.d<b)switch(a.d){case Y:V(a...
  function V (line 31390) | function V(a,b){a.p&&a.p(b,a.c)}
  function ga (line 31390) | function ga(a,b){this.b=a||this;this.d=b||this;this.a=null;this.c=!1}
  function M (line 31390) | function M(){this.h=this;this.i=this.d=this.a=this.e=this.c=this.b=null;...
  function J (line 31390) | function J(a){return a.b.e}
  function Ca (line 31390) | function Ca(){this.c=new N;this.a=new ga;this.b=new M;this.d=new M;this....
  function N (line 31390) | function N(a,b){this.e=a||this;this.f=b||this;this.d=this.c=null;this.g=...
  function Da (line 31390) | function Da(){this.c=[];this.d=null;this.a=0;this.e=!1;this.b=new Ha}
  function Ea (line 31390) | function Ea(a){a.d=[];for(var b=0;b<a.a;b++)a.d[b]=b;a.d.sort(function(a...
  function xa (line 31390) | function xa(a,b){if(a.e){var c=a.b,d=++c.a;2*d>c.f&&(c.f*=2,c.c=Ja(c.c,c...
  function Fa (line 31391) | function Fa(a){if(0===a.a)return Ka(a.b);var b=a.c[a.d[a.a-1]];if(0!==a....
  function Ha (line 31391) | function Ha(){this.d=Ja([0],33);this.e=[null,null];this.c=[0,0];this.a=0...
  function Ja (line 31391) | function Ja(a,b){for(var c=Array(b),d=0;d<a.length;d++)c[d]=a[d];for(;d<...
  function Ia (line 31391) | function Ia(a){for(var b=a.a;1<=b;--b)W(a,b);a.h=!0}
  function Ga (line 31391) | function Ga(a){return a.e[a.d[1]]}
  function Ka (line 31391) | function Ka(a){var b=a.d,c=a.e,d=a.c,e=b[1],f=c[e];0<a.a&&(b[1]=b[a.a],d...
  function W (line 31392) | function W(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f<<1;h<a.a...
  function va (line 31392) | function va(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f>>1,k=c[...
  function ma (line 31392) | function ma(){this.e=this.a=null;this.f=0;this.c=this.b=this.h=this.d=!1}
  function S (line 31392) | function S(a){return a.e.c.b}
  function R (line 31392) | function R(a){return a.e.a.b}
  function Tree (line 31465) | function Tree() {
  function Data (line 31470) | function Data(source, dest) {
  function tinf_build_bits_base (line 31514) | function tinf_build_bits_base(bits, base, delta, first) {
  function tinf_build_fixed_trees (line 31529) | function tinf_build_fixed_trees(lt, dt) {
  function tinf_build_tree (line 31555) | function tinf_build_tree(t, lengths, off, num) {
  function tinf_getbit (line 31583) | function tinf_getbit(d) {
  function tinf_read_bits (line 31599) | function tinf_read_bits(d, num, base) {
  function tinf_decode_symbol (line 31615) | function tinf_decode_symbol(d, t) {
  function tinf_decode_trees (line 31641) | function tinf_decode_trees(d, lt, dt) {
  function tinf_inflate_block_data (line 31707) | function tinf_inflate_block_data(d, lt, dt) {
  function tinf_inflate_uncompressed_block (line 31741) | function tinf_inflate_uncompressed_block(d) {
  function tinf_uncompress (line 31776) | function tinf_uncompress(source, dest) {
  function derive (line 31840) | function derive(v0, v1, v2, v3, t) {
  function BoundingBox (line 31856) | function BoundingBox() {
  function Path (line 32006) | function Path() {
  function floatToString (line 32239) | function floatToString(v) {
  function packValues (line 32247) | function packValues() {
  function fail (line 32323) | function fail(message) {
  function argument (line 32329) | function argument(predicate, message) {
  function constant (line 32358) | function constant(v) {
  function isByteEncodable (line 32911) | function isByteEncodable(value) {
  function encodeVarDeltaRunAsZeroes (line 32916) | function encodeVarDeltaRunAsZeroes(deltas, pos, result) {
  function encodeVarDeltaRunAsBytes (line 32928) | function encodeVarDeltaRunAsBytes(deltas, offset, result) {
  function encodeVarDeltaRunAsWords (line 32960) | function encodeVarDeltaRunAsWords(deltas, offset, result) {
  function Table (line 33311) | function Table(tableName, fields, options) {
  function ushortList (line 33352) | function ushortList(itemName, list, count) {
  function tableList (line 33367) | function tableList(itemName, records, itemCallback) {
  function recordList (line 33380) | function recordList(itemName, records, itemCallback) {
  function Coverage (line 33399) | function Coverage(coverageTable) {
  function ScriptList (line 33412) | function ScriptList(scriptListTable) {
  function FeatureList (line 33449) | function FeatureList(featureListTable) {
  function LookupList (line 33472) | function LookupList(lookupListTable, subtableMakers) {
  function getByte (line 33502) | function getByte(dataView, offset) {
  function getUShort (line 33508) | function getUShort(dataView, offset) {
  function getShort (line 33514) | function getShort(dataView, offset) {
  function getULong (line 33520) | function getULong(dataView, offset) {
  function getFixed (line 33526) | function getFixed(dataView, offset) {
  function getTag (line 33534) | function getTag(dataView, offset) {
  function getOffset (line 33545) | function getOffset(dataView, offset, offSize) {
  function getBytes (line 33556) | function getBytes(dataView, startOffset, endOffset) {
  function bytesToString (line 33566) | function bytesToString(bytes) {
  function Parser (line 33587) | function Parser(data, offset) {
  function parseCmapTableFormat12 (line 34142) | function parseCmapTableFormat12(cmap, p) {
  function parseCmapTableFormat4 (line 34166) | function parseCmapTableFormat4(cmap, p, data, start, offset) {
  function parseCmapTable (line 34218) | function parseCmapTable(data, start) {
  function addSegment (line 34256) | function addSegment(t, code, glyphIndex) {
  function addTerminatorSegment (line 34266) | function addTerminatorSegment(t) {
  function makeCmapTable (line 34276) | function makeCmapTable(glyphs) {
  function DefaultEncoding (line 34553) | function DefaultEncoding(font) {
  function CmapEncoding (line 34579) | function CmapEncoding(cmap) {
  function CffEncoding (line 34598) | function CffEncoding(encoding, charset) {
  function GlyphNames (line 34619) | function GlyphNames(post) {
  function addGlyphNames (line 34674) | function addGlyphNames(font) {
  function line (line 34703) | function line(ctx, x1, y1, x2, y2) {
  function getPathDefinition (line 34715) | function getPathDefinition(glyph, path) {
  function Glyph (line 34757) | function Glyph(options) {
  function drawCircles (line 34987) | function drawCircles(l, x, y, scale) {
  function defineDependentProperty (line 35074) | function defineDependentProperty(glyph, externalName, internalName) {
  function GlyphSet (line 35098) | function GlyphSet(font, glyphs) {
  function glyphLoader (line 35139) | function glyphLoader(font, index) {
  function ttfGlyphLoader (line 35156) | function ttfGlyphLoader(font, index, parseGlyph, data, position, buildPa...
  function cffGlyphLoader (line 35183) | function cffGlyphLoader(font, index, parseCFFCharstring, charstring) {
  function equals (line 35202) | function equals(a, b) {
  function calcCFFSubroutineBias (line 35224) | function calcCFFSubroutineBias(subrs) {
  function parseCFFIndex (line 35239) | function parseCFFIndex(data, start, conversionFn) {
  function parseFloatOperand (line 35273) | function parseFloatOperand(parser) {
  function parseOperand (line 35299) | function parseOperand(parser, b0) {
  function entriesToObject (line 35341) | function entriesToObject(entries) {
  function parseCFFDict (line 35365) | function parseCFFDict(data, start, size) {
  function getCFFString (line 35397) | function getCFFString(strings, index) {
  function interpretDict (line 35409) | function interpretDict(dict, meta, strings) {
  function parseCFFHeader (line 35449) | function parseCFFHeader(data, start) {
  function parseCFFTopDict (line 35506) | function parseCFFTopDict(data, strings) {
  function parseCFFPrivateDict (line 35512) | function parseCFFPrivateDict(data, start, size, strings) {
  function gatherCFFTopDicts (line 35532) | function gatherCFFTopDicts(data, start, cffIndex, strings) {
  function parseCFFCharset (line 35561) | function parseCFFCharset(data, start, nGlyphs, strings) {
  function parseCFFEncoding (line 35603) | function parseCFFEncoding(data, start, charset) {
  function parseCFFCharstring (line 35635) | function parseCFFCharstring(font, glyph, code) {
  function parseCFFFDSelect (line 36055) | function parseCFFFDSelect(data, start, nGlyphs, fdArrayCount) {
  function parseCFFTable (line 36101) | function parseCFFTable(data, start, font) {
  function encodeString (line 36184) | function encodeString(s, strings) {
  function makeHeader (line 36205) | function makeHeader() {
  function makeNameIndex (line 36214) | function makeNameIndex(fontNames) {
  function makeDict (line 36227) | function makeDict(meta, attrs, strings) {
  function makeTopDict (line 36245) | function makeTopDict(attrs, strings) {
  function makeTopDictIndex (line 36253) | function makeTopDictIndex(topDict) {
  function makeStringIndex (line 36261) | function makeStringIndex(strings) {
  function makeGlobalSubrIndex (line 36273) | function makeGlobalSubrIndex() {
  function makeCharsets (line 36280) | function makeCharsets(glyphNames, strings) {
  function glyphToOps (line 36293) | function glyphToOps(glyph) {
  function makeCharStringsIndex (line 36361) | function makeCharStringsIndex(glyphs) {
  function makePrivateDict (line 36375) | function makePrivateDict(attrs, strings) {
  function makeCFFTable (line 36383) | function makeCFFTable(glyphs, options) {
  function parseHeadTable (line 36461) | function parseHeadTable(data, start) {
  function makeHeadTable (line 36485) | function makeHeadTable(options) {
  function parseHheaTable (line 36520) | function parseHheaTable(data, start) {
  function makeHheaTable (line 36540) | function makeHheaTable(options) {
  function parseHmtxTable (line 36568) | function parseHmtxTable(data, start, numMetrics, numGlyphs, glyphs) {
  function makeHmtxTable (line 36585) | function makeHmtxTable(glyphs) {
  function makeLtagTable (line 36602) | function makeLtagTable(tags) {
  function parseLtagTable (line 36626) | function parseLtagTable(data, start) {
  function parseMaxpTable (line 36654) | function parseMaxpTable(data, start) {
  function makeMaxpTable (line 36678) | function makeMaxpTable(numGlyphs) {
  function getLanguageCode (line 37207) | function getLanguageCode(platformID, languageID, ltag) {
  function getEncoding (line 37288) | function getEncoding(platformID, encodingID, languageID) {
  function parseNameTable (line 37310) | function parseNameTable(data, start, ltag) {
  function reverseDict (line 37356) | function reverseDict(dict) {
  function makeNameRecord (line 37365) | function makeNameRecord(platformID, encodingID, languageID, nameID, leng...
  function findSubArray (line 37378) | function findSubArray(needle, haystack) {
  function addStringToPool (line 37398) | function addStringToPool(s, pool) {
  function makeNameTable (line 37413) | function makeNameTable(names, ltag) {
  function getUnicodeRange (line 37643) | function getUnicodeRange(unicode) {
  function parseOS2Table (line 37655) | function parseOS2Table(data, start) {
  function makeOS2Table (line 37708) | function makeOS2Table(options) {
  function parsePostTable (line 37764) | function parsePostTable(data, start) {
  function makePostTable (line 37808) | function makePostTable() {
  function parseGsubTable (line 38008) | function parseGsubTable(data, start) {
  function makeGsubTable (line 38076) | function makeGsubTable(gsub) {
  function parseMetaTable (line 38091) | function parseMetaTable(data, start) {
  function makeMetaTable (line 38111) | function makeMetaTable(tags) {
  function log2 (line 38141) | function log2(v) {
  function computeCheckSum (line 38145) | function computeCheckSum(bytes) {
  function makeTableRecord (line 38162) | function makeTableRecord(tag, checkSum, offset, length) {
  function makeSfntTable (line 38171) | function makeSfntTable(tables) {
  function metricsForChar (line 38227) | function metricsForChar(font, chars, notFoundMetrics) {
  function average (line 38239) | function average(vs) {
  function fontToSfntTable (line 38250) | function fontToSfntTable(font) {
  function searchTag (line 38460) | function searchTag(arr, tag) {
  function binSearch (line 38477) | function binSearch(arr, value) {
  function searchRange (line 38495) | function searchRange(ranges, value) {
  function Layout (line 38521) | function Layout(font, tableName) {
  function Position (line 38804) | function Position(font) {
  function Substitution (line 38879) | function Substitution(font) {
  function arraysEqual (line 38884) | function arraysEqual(ar1, ar2) {
  function getSubstFormat (line 38894) | function getSubstFormat(lookupTable, format, defaultSubtable) {
  function isBrowser (line 39175) | function isBrowser() {
  function nodeBufferToArrayBuffer (line 39179) | function nodeBufferToArrayBuffer(buffer) {
  function arrayBufferToNodeBuffer (line 39189) | function arrayBufferToNodeBuffer(ab) {
  function checkArgument (line 39199) | function checkArgument(expression, message) {
  function parseGlyphCoordinate (line 39208) | function parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask...
  function parseGlyph (line 39234) | function parseGlyph(glyph, data, start) {
  function transformPoints (line 39379) | function transformPoints(points, transform) {
  function getContours (line 39395) | function getContours(points) {
  function getPath (line 39412) | function getPath(points) {
  function buildPath (line 39468) | function buildPath(glyphs, glyph) {
  function parseGlyfTable (line 39507) | function parseGlyfTable(data, start, loca, font) {
  function Hinting (line 39565) | function Hinting(font) {
  function roundOff (line 39591) | function roundOff(v) {
  function roundToGrid (line 39598) | function roundToGrid(v) {
  function roundToDoubleGrid (line 39606) | function roundToDoubleGrid(v) {
  function roundToHalfGrid (line 39613) | function roundToHalfGrid(v) {
  function roundUpToGrid (line 39620) | function roundUpToGrid(v) {
  function roundDownToGrid (line 39627) | function roundDownToGrid(v) {
  function UnitVector (line 39883) | function UnitVector(x, y) {
  function getUnitVector (line 39976) | function getUnitVector(x, y) {
  function HPoint (line 39990) | function HPoint(
  function State (line 40063) | function State(env, prog) {
  function initTZone (line 40417) | function initTZone(state)
  function skip (line 40432) | function skip(state, handleElse)
  function SVTCA (line 40466) | function SVTCA(v, state) {
  function SPVTCA (line 40474) | function SPVTCA(v, state) {
  function SFVTCA (line 40482) | function SFVTCA(v, state) {
  function SPVTL (line 40490) | function SPVTL(a, state) {
  function SFVTL (line 40515) | function SFVTL(a, state) {
  function SPVFS (line 40540) | function SPVFS(state) {
  function SFVFS (line 40552) | function SFVFS(state) {
  function GPV (line 40564) | function GPV(state) {
  function GFV (line 40576) | function GFV(state) {
  function SFVTPV (line 40588) | function SFVTPV(state) {
  function ISECT (line 40596) | function ISECT(state)
  function SRP0 (line 40636) | function SRP0(state) {
  function SRP1 (line 40644) | function SRP1(state) {
  function SRP2 (line 40652) | function SRP2(state) {
  function SZP0 (line 40660) | function SZP0(state) {
  function SZP1 (line 40682) | function SZP1(state) {
  function SZP2 (line 40704) | function SZP2(state) {
  function SZPS (line 40726) | function SZPS(state) {
  function SLOOP (line 40748) | function SLOOP(state) {
  function RTG (line 40756) | function RTG(state) {
  function RTHG (line 40764) | function RTHG(state) {
  function SMD (line 40772) | function SMD(state) {
  function ELSE (line 40782) | function ELSE(state) {
  function JMPR (line 40796) | function JMPR(state) {
  function SCVTCI (line 40807) | function SCVTCI(state) {
  function DUP (line 40817) | function DUP(state) {
  function POP (line 40827) | function POP(state) {
  function CLEAR (line 40835) | function CLEAR(state) {
  function SWAP (line 40843) | function SWAP(state) {
  function DEPTH (line 40857) | function DEPTH(state) {
  function LOOPCALL (line 40867) | function LOOPCALL(state) {
  function CALL (line 40898) | function CALL(state) {
  function CINDEX (line 40921) | function CINDEX(state) {
  function MINDEX (line 40934) | function MINDEX(state) {
  function FDEF (line 40945) | function FDEF(state) {
  function MDAP (line 40964) | function MDAP(round, state) {
  function IUP (line 40984) | function IUP(v, state) {
  function SHP (line 41019) | function SHP(a, state) {
  function SHC (line 41054) | function SHC(a, state) {
  function SHZ (line 41076) | function SHZ(a, state) {
  function SHPIX (line 41107) | function SHPIX(state) {
  function IP (line 41135) | function IP(state) {
  function MSIRP (line 41168) | function MSIRP(a, state) {
  function ALIGNRP (line 41189) | function ALIGNRP(state) {
  function RTDG (line 41219) | function RTDG(state) {
  function MIAP (line 41227) | function MIAP(round, state) {
  function NPUSHB (line 41266) | function NPUSHB(state) {
  function NPUSHW (line 41282) | function NPUSHW(state) {
  function WS (line 41301) | function WS(state) {
  function RS (line 41317) | function RS(state) {
  function WCVTP (line 41332) | function WCVTP(state) {
  function RCVT (line 41345) | function RCVT(state) {
  function GC (line 41356) | function GC(a, state) {
  function MD (line 41368) | function MD(a, state) {
  function MPPEM (line 41383) | function MPPEM(state) {
  function FLIPON (line 41390) | function FLIPON(state) {
  function LT (line 41397) | function LT(state) {
  function LTEQ (line 41409) | function LTEQ(state) {
  function GT (line 41421) | function GT(state) {
  function GTEQ (line 41433) | function GTEQ(state) {
  function EQ (line 41445) | function EQ(state) {
  function NEQ (line 41457) | function NEQ(state) {
  function ODD (line 41469) | function ODD(state) {
  function EVEN (line 41480) | function EVEN(state) {
  function IF (line 41491) | function IF(state) {
  function EIF (line 41507) | function EIF(state) {
  function AND (line 41517) | function AND(state) {
  function OR (line 41529) | function OR(state) {
  function NOT (line 41541) | function NOT(state) {
  function DELTAP123 (line 41554) | function DELTAP123(b, state) {
  function SDB (line 41583) | function SDB(state) {
  function SDS (line 41594) | function SDS(state) {
  function ADD (line 41605) | function ADD(state) {
  function SUB (line 41617) | function SUB(state) {
  function DIV (line 41629) | function DIV(state) {
  function MUL (line 41641) | function MUL(state) {
  function ABS (line 41653) | function ABS(state) {
  function NEG (line 41664) | function NEG(state) {
  function FLOOR (line 41675) | function FLOOR(state) {
  function CEILING (line 41686) | function CEILING(state) {
  function ROUND (line 41697) | function ROUND(dt, state) {
  function WCVTF (line 41708) | function WCVTF(state) {
  function DELTAC123 (line 41722) | function DELTAC123(b, state) {
  function SROUND (line 41750) | function SROUND(state) {
  function S45ROUND (line 41799) | function S45ROUND(state) {
  function ROFF (line 41849) | function ROFF(state) {
  function RUTG (line 41857) | function RUTG(state) {
  function RDTG (line 41865) | function RDTG(state) {
  function SCANCTRL (line 41873) | function SCANCTRL(state) {
  function SDPVTL (line 41883) | function SDPVTL(a, state) {
  function GETINFO (line 41908) | function GETINFO(state) {
  function ROLL (line 41929) | function ROLL(state) {
  function MAX (line 41944) | function MAX(state) {
  function MIN (line 41956) | function MIN(state) {
  function SCANTYPE (line 41968) | function SCANTYPE(state) {
  function INSTCTRL (line 41976) | function INSTCTRL(state) {
  function PUSHB (line 41991) | function PUSHB(n, state) {
  function PUSHW (line 42005) | function PUSHW(n, state) {
  function MDRP_MIRP (line 42031) | function MDRP_MIRP(indirect, setRp0, keepD, ro, dt, state) {
  function Font (line 42624) | function Font(options) {
  function assert (line 43017) | function assert(predicate, message) {
  function assertNamePresent (line 43020) | function assertNamePresent(name) {
  function addName (line 43150) | function addName(name, names) {
  function makeFvarAxis (line 43172) | function makeFvarAxis(n, axis, names) {
  function parseFvarAxis (line 43184) | function parseFvarAxis(data, start, names) {
  function makeFvarInstance (line 43196) | function makeFvarInstance(n, inst, axes, names) {
  function parseFvarInstance (line 43215) | function parseFvarInstance(data, start, axes, names) {
  function makeFvarTable (line 43229) | function makeFvarTable(fvar, names) {
  function parseFvarTable (line 43252) | function parseFvarTable(data, start, names) {
  function parseGposTable (line 43362) | function parseGposTable(data, start) {
  function makeGposTable (line 43391) | function makeGposTable(gpos) {
  function parseWindowsKernTable (line 43404) | function parseWindowsKernTable(p) {
  function parseMacKernTable (line 43424) | function parseMacKernTable(p) {
  function parseKernTable (line 43453) | function parseKernTable(data, start) {
  function parseLocaTable (line 43475) | function parseLocaTable(data, start, numGlyphs, shortVersion) {
  function loadFromFile (line 43510) | function loadFromFile(path, callback) {
  function loadFromUrl (line 43526) | function loadFromUrl(url, callback) {
  function parseOpenTypeTableEntries (line 43552) | function parseOpenTypeTableEntries(data, numTables) {
  function parseWOFFTableEntries (line 43573) | function parseWOFFTableEntries(data, numTables) {
  function uncompressTable (line 43608) | function uncompressTable(data, tableEntry) {
  function parseBuffer (line 43632) | function parseBuffer(buffer) {
  function load (line 43834) | function load(url, callback) {
  function loadSync (line 43858) | function loadSync(url) {
  function defaultSetTimout (line 43891) | function defaultSetTimout() {
  function defaultClearTimeout (line 43894) | function defaultClearTimeout () {
  function runTimeout (line 43917) | function runTimeout(fun) {
  function runClearTimeout (line 43942) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 43974) | function cleanUpNextTick() {
  function drainQueue (line 43989) | function drainQueue() {
  function Item (line 44027) | function Item(fun, array) {
  function noop (line 44041) | function noop() {}
  function normalizeName (line 44110) | function normalizeName(name) {
  function normalizeValue (line 44120) | function normalizeValue(value) {
  function iteratorFor (line 44128) | function iteratorFor(items) {
  function Headers (line 44145) | function Headers(headers) {
  function consumed (line 44217) | function consumed(body) {
  function fileReaderReady (line 44224) | function fileReaderReady(reader) {
  function readBlobAsArrayBuffer (line 44235) | function readBlobAsArrayBuffer(blob) {
  function readBlobAsText (line 44242) | function readBlobAsText(blob) {
  function readArrayBufferAsText (line 44249) | function readArrayBufferAsText(buf) {
  function bufferClone (line 44259) | function bufferClone(buf) {
  function Body (line 44269) | function Body() {
  function normalizeMethod (line 44365) | function normalizeMethod(method) {
  function Request (line 44370) | function Request(input, options) {
  function decode (line 44411) | function decode(body) {
  function parseHeaders (line 44424) | function parseHeaders(rawHeaders) {
  function Response (line 44442) | function Response(bodyInit, options) {
  function getWindowWidth (line 48277) | function getWindowWidth() {
  function getWindowHeight (line 48286) | function getWindowHeight() {
  function launchFullscreen (line 48450) | function launchFullscreen(element) {
  function exitFullscreen (line 48470) | function exitFullscreen() {
  function formatType (line 49084) | function formatType() {
  function calculateOffset (line 51656) | function calculateOffset(object) {
  function getMousePos (line 58982) | function getMousePos(canvas, w, h, evt) {
  function getTouchInfo (line 59574) | function getTouchInfo(canvas, w, h, e, i) {
  function buildBlurKernel (line 60303) | function buildBlurKernel(r) {
  function blurARGB (line 60338) | function blurARGB(canvas, radius) {
  function _sAssign (line 60867) | function _sAssign(sVal, iVal) {
  function makeObject (line 63377) | function makeObject(row, headers) {
  function escapeHelper (line 64426) | function escapeHelper(content) {
  function _checkFileExtension (line 64640) | function _checkFileExtension(filename, extension) {
  function destroyClickedElement (line 64682) | function destroyClickedElement(event) {
  function elementsToP5XML (line 66693) | function elementsToP5XML(elements) {
  function hypot (line 68056) | function hypot(x, y, z) {
  function isSpace (line 71672) | function isSpace(i) {
  function pathToPoints (line 71930) | function pathToPoints(cmds, options) {
  function simplify (line 71951) | function simplify(pts, angle) {
  function splitPaths (line 71965) | function splitPaths(cmds) {
  function cmdToArr (line 71982) | function cmdToArr(cmd) {
  function parseOpts (line 71996) | function parseOpts(options, defaults) {
  function at (line 72011) | function at(v, i) {
  function collinear (line 72016) | function collinear(a, b, c, thresholdAngle) {
  function areaTriangle (line 72041) | function areaTriangle(a, b, c) {
  function findDotsAtSegment (line 72047) | function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
  function getPointAtSegmentLength (line 72080) | function getPointAtSegmentLength(
  function pointAtLength (line 72106) | function pointAtLength(path, length, istotal) {
  function pathToAbsolute (line 72158) | function pathToAbsolute(pathArray) {
  function path2curve (line 72257) | function path2curve(path, path2) {
  function a2c (line 72413) | function a2c(x1, y1, rx, ry, angle, lac, sweep_flag, x2, y2, recursive) {
  function catmullRom2bezier (line 72530) | function catmullRom2bezier(crp, z) {
  function l2c (line 72596) | function l2c(x1, y1, x2, y2) {
  function q2c (line 72600) | function q2c(x1, y1, ax, ay, x2, y2) {
  function bezlen (line 72613) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
  function getTatLen (line 72661) | function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {
  function base3 (line 72679) | function base3(t, p1, p2, p3, p4) {
  function cacheKey (line 72685) | function cacheKey() {
  function doNf (line 73591) | function doNf(num, left, right) {
  function doNfc (line 73679) | function doNfc(num, right) {
  function addNfp (line 73759) | function addNfp(num) {
  function addNfs (line 73837) | function addNfs(num) {
  function parseObj (line 76762) | function parseObj(model, lines) {
  function vertexCallback (line 81879) | function vertexCallback(data, polyVertArray) {
  function begincallback (line 81885) | function begincallback(type) {
  function errorcallback (line 81891) | function errorcallback(errno) {
  function combinecallback (line 81896) | function combinecallback(coords, data, weight) {
  function edgeCallback (line 81900) | function edgeCallback(flag) {
  function ImageInfos (line 82816) | function ImageInfos(width, height) {
  function setPixel (line 82894) | function setPixel(imageInfo, r, g, b, a) {
  function push (line 82968) | function push(xs, ys, v) {
  function clamp (line 83010) | function clamp(v, min, max) {
  function byte (line 83022) | function byte(v) {
  function Cubic (line 83036) | function Cubic(p0, c0, c1, p1) {
  function cubicToQuadratics (line 83169) | function cubicToQuadratics(x0, y0, cx0, cy0, cx1, cy1, x1, y1) {
  function pushLine (line 83233) | function pushLine(x0, y0, x1, y1) {
  function samePoint (line 83249) | function samePoint(x0, y0, x1, y1) {
  function layout (line 83325) | function layout(dim, dimImageInfos, cellImageInfos) {

FILE: 05_unpredictability/01_coin_toss/coin_toss_javascript/sketch.js
  function setup (line 4) | function setup() {
  function draw (line 11) | function draw() {

FILE: 05_unpredictability/02_roll_the_dice/dice_roll_javascript/p5.js
  function r (line 2) | function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==...
  function getLens (line 27837) | function getLens (b64) {
  function byteLength (line 27857) | function byteLength (b64) {
  function _byteLength (line 27864) | function _byteLength (b64, validLen, placeHoldersLen) {
  function toByteArray (line 27868) | function toByteArray (b64) {
  function tripletToBase64 (line 27913) | function tripletToBase64 (num) {
  function encodeChunk (line 27920) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 27933) | function fromByteArray (uint8) {
  function typedArraySupport (line 28015) | function typedArraySupport () {
  function createBuffer (line 28042) | function createBuffer (length) {
  function Buffer (line 28062) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 28088) | function from (value, encodingOrOffset, length) {
  function assertSize (line 28153) | function assertSize (size) {
  function alloc (line 28161) | function alloc (size, fill, encoding) {
  function allocUnsafe (line 28185) | function allocUnsafe (size) {
  function fromString (line 28203) | function fromString (string, encoding) {
  function fromArrayLike (line 28227) | function fromArrayLike (array) {
  function fromArrayBuffer (line 28236) | function fromArrayBuffer (array, byteOffset, length) {
  function fromObject (line 28259) | function fromObject (obj) {
  function checked (line 28284) | function checked (length) {
  function SlowBuffer (line 28294) | function SlowBuffer (length) {
  function byteLength (line 28385) | function byteLength (string, encoding) {
  function slowToString (line 28434) | function slowToString (encoding, start, end) {
  function swap (line 28512) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 28652) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 28708) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 28776) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 28801) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 28805) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 28809) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 28813) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 28817) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 28899) | function base64Slice (buf, start, end) {
  function utf8Slice (line 28907) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 28985) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 29003) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 29013) | function latin1Slice (buf, start, end) {
  function hexSlice (line 29023) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 29036) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 29075) | function checkOffset (offset, ext, length) {
  function checkInt (line 29250) | function checkInt (buf, value, offset, ext, max, min) {
  function checkIEEE754 (line 29438) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 29443) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 29461) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 29600) | function base64clean (str) {
  function toHex (line 29614) | function toHex (n) {
  function utf8ToBytes (line 29619) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 29699) | function asciiToBytes (str) {
  function utf16leToBytes (line 29708) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 29724) | function base64ToBytes (str) {
  function blitBuffer (line 29728) | function blitBuffer (src, dst, offset, length) {
  function isInstance (line 29739) | function isInstance (obj, type) {
  function numberIsNaN (line 29744) | function numberIsNaN (obj) {
  function objectOrFunction (line 29765) | function objectOrFunction(x) {
  function isFunction (line 29770) | function isFunction(x) {
  function setScheduler (line 29807) | function setScheduler(scheduleFn) {
  function setAsap (line 29811) | function setAsap(asapFn) {
  function useNextTick (line 29824) | function useNextTick() {
  function useVertxTimer (line 29833) | function useVertxTimer() {
  function useMutationObserver (line 29843) | function useMutationObserver() {
  function useMessageChannel (line 29855) | function useMessageChannel() {
  function useSetTimeout (line 29863) | function useSetTimeout() {
  function flush (line 29873) | function flush() {
  function attemptVertx (line 29887) | function attemptVertx() {
  function then (line 29911) | function then(onFulfillment, onRejection) {
  function resolve$1 (line 29966) | function resolve$1(object) {
  function noop (line 29981) | function noop() {}
  function selfFulfillment (line 29989) | function selfFulfillment() {
  function cannotReturnOwn (line 29993) | function cannotReturnOwn() {
  function getThen (line 29997) | function getThen(promise) {
  function tryThen (line 30006) | function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
  function handleForeignThenable (line 30014) | function handleForeignThenable(promise, thenable, then$$1) {
  function handleOwnThenable (line 30043) | function handleOwnThenable(promise, thenable) {
  function handleMaybeThenable (line 30057) | function handleMaybeThenable(promise, maybeThenable, then$$1) {
  function resolve (line 30074) | function resolve(promise, value) {
  function publishRejection (line 30084) | function publishRejection(promise) {
  function fulfill (line 30092) | function fulfill(promise, value) {
  function reject (line 30105) | function reject(promise, reason) {
  function subscribe (line 30115) | function subscribe(parent, child, onFulfillment, onRejection) {
  function publish (line 30131) | function publish(promise) {
  function tryCatch (line 30157) | function tryCatch(callback, detail) {
  function invokeCallback (line 30166) | function invokeCallback(settled, promise, callback, detail) {
  function initializePromise (line 30206) | function initializePromise(promise, resolver) {
  function nextId (line 30219) | function nextId() {
  function makePromise (line 30223) | function makePromise(promise) {
  function validationError (line 30230) | function validationError() {
  function Enumerator (line 30235) | function Enumerator(Constructor, input) {
  function all (line 30375) | function all(entries) {
  function race (line 30444) | function race(entries) {
  function reject$1 (line 30496) | function reject$1(reason) {
  function needsResolver (line 30504) | function needsResolver() {
  function needsNew (line 30508) | function needsNew() {
  function Promise (line 30617) | function Promise(resolver) {
  function polyfill (line 30890) | function polyfill() {
  function generateCallbackFunction (line 30958) | function generateCallbackFunction() {
  function clearFunction (line 30962) | function clearFunction(functionName) {
  function removeScript (line 30972) | function removeScript(scriptId) {
  function fetchJsonp (line 30979) | function fetchJsonp(_url) {
  function t (line 31366) | function t(a,b){return a.b===b.b&&a.a===b.a}
  function u (line 31366) | function u(a,b){return a.b<b.b||a.b===b.b&&a.a<=b.a}
  function v (line 31366) | function v(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?d<e?b.a-a.a+d/(d+...
  function x (line 31366) | function x(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?(b.a-c.a)*d+(b.a-...
  function z (line 31366) | function z(a,b){return a.a<b.a||a.a===b.a&&a.b<=b.b}
  function aa (line 31366) | function aa(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?d<e?b.b-a.b+d/(d...
  function ba (line 31367) | function ba(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?(b.b-c.b)*d+(b.b...
  function ca (line 31367) | function ca(a){return u(a.b.a,a.a)}
  function da (line 31367) | function da(a){return u(a.a,a.b.a)}
  function A (line 31367) | function A(a,b,c,d){a=0>a?0:a;c=0>c?0:c;return a<=c?0===c?(b+d)/2:b+a/(a...
  function ea (line 31367) | function ea(a){var b=B(a.b);C(b,a.c);C(b.b,a.c);D(b,a.a);return b}
  function E (line 31367) | function E(a,b){var c=!1,d=!1;a!==b&&(b.a!==a.a&&(d=!0,F(b.a,a.a)),b.d!=...
  function I (line 31367) | function I(a){var b=a.b,c=!1;a.d!==a.b.d&&(c=!0,G(a.d,a.b.d));a.c===a?F(...
  function K (line 31368) | function K(a){var b=B(a),c=b.b;H(b,a.e);b.a=a.b.a;C(c,b.a);b.d=c.d=a.d;b...
  function L (line 31368) | function L(a,b){var c=!1,d=B(a),e=d.b;b.d!==a.d&&(c=!0,G(b.d,a.d));H(d,a...
  function B (line 31368) | function B(a){var b=new M,c=new M,d=a.b.h;c.h=d;d.b.h=b;b.h=a;a.b.h=c;b....
  function H (line 31368) | function H(a,b){var c=a.c,d=b.c;c.b.e=b;d.b.e=a;a.c=d;b.c=c}
  function C (line 31369) | function C(a,b){var c=b.f,d=new N(b,c);c.e=d;b.f=d;c=d.c=a;do c.a=d,c=c....
  function D (line 31369) | function D(a,b){var c=b.d,d=new ga(b,c);c.b=d;b.d=d;d.a=a;d.c=b.c;c=a;do...
  function fa (line 31369) | function fa(a){var b=a.h;a=a.b.h;b.b.h=a;a.b.h=b}
  function F (line 31369) | function F(a,b){var c=a.c,d=c;do d.a=b,d=d.c;while(d!==c);c=a.f;d=a.e;d....
  function G (line 31369) | function G(a,b){var c=a.a,d=c;do d.d=b,d=d.e;while(d!==c);c=a.d;d=a.b;d....
  function ha (line 31369) | function ha(a){var b=0;Math.abs(a[1])>Math.abs(a[0])&&(b=1);Math.abs(a[2...
  function P (line 31369) | function P(a,b){a.f+=b.f;a.b.f+=b.b.f}
  function ia (line 31369) | function ia(a,b,c){a=a.a;b=b.a;c=c.a;if(b.b.a===a)return c.b.a===a?u(b.a...
  function Q (line 31369) | function Q(a){a.a.i=null;var b=a.e;b.a.c=b.c;b.c.a=b.a;a.e=null}
  function ja (line 31369) | function ja(a,b){I(a.a);a.c=!1;a.a=b;b.i=a}
  function ka (line 31369) | function ka(a){var b=a.a.a;do a=R(a);while(a.a.a===b);a.c&&(b=L(S(a).a.b...
  function la (line 31370) | function la(a,b,c){var d=new ma;d.a=c;d.e=na(a.f,b.e,d);return c.i=d}
  function oa (line 31370) | function oa(a,b){switch(a.s){case 100130:return 0!==(b&1);case 100131:re...
  function pa (line 31370) | function pa(a){var b=a.a,c=b.d;c.c=a.d;c.a=b;Q(a)}
  function T (line 31370) | function T(a,b,c){a=b;for(b=b.a;a!==c;){a.c=!1;var d=S(a),e=d.a;if(e.a!=...
  function U (line 31371) | function U(a,b,c,d,e,f){var g=!0;do la(a,b,c.b),c=c.c;while(c!==d);for(n...
  function sa (line 31371) | function sa(a,b,c,d,e){var f=[b.g[0],b.g[1],b.g[2]];b.d=null;b.d=a.o?a.o...
  function ta (line 31372) | function ta(a,b,c){var d=[null,null,null,null];d[0]=b.a.d;d[1]=c.a.d;sa(...
  function ua (line 31372) | function ua(a,b,c,d,e){var f=Math.abs(b.b-a.b)+Math.abs(b.a-a.a),g=Math....
  function qa (line 31373) | function qa(a,b){var c=S(b),d=b.a,e=c.a;if(u(d.a,e.a)){if(0<x(e.b.a,d.a,...
  function wa (line 31374) | function wa(a,b){var c=S(b),d=b.a,e=c.a,f=d.a,g=e.a,h=d.b.a,k=e.b.a,l=ne...
  function ra (line 31377) | function ra(a,b){for(var c=S(b);;){for(;c.b;)b=c,c=S(c);if(!b.b&&(c=b,b=...
  function ya (line 31379) | function ya(a,b){a.a=b;for(var c=b.c;null===c.i;)if(c=c.c,c===b.c){var c...
  function za (line 31380) | function za(a,b){var c=new ma,d=ea(a.b);d.a.b=O;d.a.a=b;d.b.a.b=-O;d.b.a...
  function Aa (line 31380) | function Aa(a){this.a=new Ba;this.b=a;this.c=ia}
  function na (line 31380) | function na(a,b,c){do b=b.c;while(null!==b.b&&!a.c(a.b,b.b,c));a=new Ba(...
  function Ba (line 31380) | function Ba(a,b,c){this.b=a||null;this.a=b||this;this.c=c||this}
  function X (line 31380) | function X(){this.d=Y;this.p=this.b=this.q=null;this.j=[0,0,0];this.s=10...
  function Z (line 31390) | function Z(a,b){if(a.d!==b)for(;a.d!==b;)if(a.d<b)switch(a.d){case Y:V(a...
  function V (line 31390) | function V(a,b){a.p&&a.p(b,a.c)}
  function ga (line 31390) | function ga(a,b){this.b=a||this;this.d=b||this;this.a=null;this.c=!1}
  function M (line 31390) | function M(){this.h=this;this.i=this.d=this.a=this.e=this.c=this.b=null;...
  function J (line 31390) | function J(a){return a.b.e}
  function Ca (line 31390) | function Ca(){this.c=new N;this.a=new ga;this.b=new M;this.d=new M;this....
  function N (line 31390) | function N(a,b){this.e=a||this;this.f=b||this;this.d=this.c=null;this.g=...
  function Da (line 31390) | function Da(){this.c=[];this.d=null;this.a=0;this.e=!1;this.b=new Ha}
  function Ea (line 31390) | function Ea(a){a.d=[];for(var b=0;b<a.a;b++)a.d[b]=b;a.d.sort(function(a...
  function xa (line 31390) | function xa(a,b){if(a.e){var c=a.b,d=++c.a;2*d>c.f&&(c.f*=2,c.c=Ja(c.c,c...
  function Fa (line 31391) | function Fa(a){if(0===a.a)return Ka(a.b);var b=a.c[a.d[a.a-1]];if(0!==a....
  function Ha (line 31391) | function Ha(){this.d=Ja([0],33);this.e=[null,null];this.c=[0,0];this.a=0...
  function Ja (line 31391) | function Ja(a,b){for(var c=Array(b),d=0;d<a.length;d++)c[d]=a[d];for(;d<...
  function Ia (line 31391) | function Ia(a){for(var b=a.a;1<=b;--b)W(a,b);a.h=!0}
  function Ga (line 31391) | function Ga(a){return a.e[a.d[1]]}
  function Ka (line 31391) | function Ka(a){var b=a.d,c=a.e,d=a.c,e=b[1],f=c[e];0<a.a&&(b[1]=b[a.a],d...
  function W (line 31392) | function W(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f<<1;h<a.a...
  function va (line 31392) | function va(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f>>1,k=c[...
  function ma (line 31392) | function ma(){this.e=this.a=null;this.f=0;this.c=this.b=this.h=this.d=!1}
  function S (line 31392) | function S(a){return a.e.c.b}
  function R (line 31392) | function R(a){return a.e.a.b}
  function Tree (line 31465) | function Tree() {
  function Data (line 31470) | function Data(source, dest) {
  function tinf_build_bits_base (line 31514) | function tinf_build_bits_base(bits, base, delta, first) {
  function tinf_build_fixed_trees (line 31529) | function tinf_build_fixed_trees(lt, dt) {
  function tinf_build_tree (line 31555) | function tinf_build_tree(t, lengths, off, num) {
  function tinf_getbit (line 31583) | function tinf_getbit(d) {
  function tinf_read_bits (line 31599) | function tinf_read_bits(d, num, base) {
  function tinf_decode_symbol (line 31615) | function tinf_decode_symbol(d, t) {
  function tinf_decode_trees (line 31641) | function tinf_decode_trees(d, lt, dt) {
  function tinf_inflate_block_data (line 31707) | function tinf_inflate_block_data(d, lt, dt) {
  function tinf_inflate_uncompressed_block (line 31741) | function tinf_inflate_uncompressed_block(d) {
  function tinf_uncompress (line 31776) | function tinf_uncompress(source, dest) {
  function derive (line 31840) | function derive(v0, v1, v2, v3, t) {
  function BoundingBox (line 31856) | function BoundingBox() {
  function Path (line 32006) | function Path() {
  function floatToString (line 32239) | function floatToString(v) {
  function packValues (line 32247) | function packValues() {
  function fail (line 32323) | function fail(message) {
  function argument (line 32329) | function argument(predicate, message) {
  function constant (line 32358) | function constant(v) {
  function isByteEncodable (line 32911) | function isByteEncodable(value) {
  function encodeVarDeltaRunAsZeroes (line 32916) | function encodeVarDeltaRunAsZeroes(deltas, pos, result) {
  function encodeVarDeltaRunAsBytes (line 32928) | function encodeVarDeltaRunAsBytes(deltas, offset, result) {
  function encodeVarDeltaRunAsWords (line 32960) | function encodeVarDeltaRunAsWords(deltas, offset, result) {
  function Table (line 33311) | function Table(tableName, fields, options) {
  function ushortList (line 33352) | function ushortList(itemName, list, count) {
  function tableList (line 33367) | function tableList(itemName, records, itemCallback) {
  function recordList (line 33380) | function recordList(itemName, records, itemCallback) {
  function Coverage (line 33399) | function Coverage(coverageTable) {
  function ScriptList (line 33412) | function ScriptList(scriptListTable) {
  function FeatureList (line 33449) | function FeatureList(featureListTable) {
  function LookupList (line 33472) | function LookupList(lookupListTable, subtableMakers) {
  function getByte (line 33502) | function getByte(dataView, offset) {
  function getUShort (line 33508) | function getUShort(dataView, offset) {
  function getShort (line 33514) | function getShort(dataView, offset) {
  function getULong (line 33520) | function getULong(dataView, offset) {
  function getFixed (line 33526) | function getFixed(dataView, offset) {
  function getTag (line 33534) | function getTag(dataView, offset) {
  function getOffset (line 33545) | function getOffset(dataView, offset, offSize) {
  function getBytes (line 33556) | function getBytes(dataView, startOffset, endOffset) {
  function bytesToString (line 33566) | function bytesToString(bytes) {
  function Parser (line 33587) | function Parser(data, offset) {
  function parseCmapTableFormat12 (line 34142) | function parseCmapTableFormat12(cmap, p) {
  function parseCmapTableFormat4 (line 34166) | function parseCmapTableFormat4(cmap, p, data, start, offset) {
  function parseCmapTable (line 34218) | function parseCmapTable(data, start) {
  function addSegment (line 34256) | function addSegment(t, code, glyphIndex) {
  function addTerminatorSegment (line 34266) | function addTerminatorSegment(t) {
  function makeCmapTable (line 34276) | function makeCmapTable(glyphs) {
  function DefaultEncoding (line 34553) | function DefaultEncoding(font) {
  function CmapEncoding (line 34579) | function CmapEncoding(cmap) {
  function CffEncoding (line 34598) | function CffEncoding(encoding, charset) {
  function GlyphNames (line 34619) | function GlyphNames(post) {
  function addGlyphNames (line 34674) | function addGlyphNames(font) {
  function line (line 34703) | function line(ctx, x1, y1, x2, y2) {
  function getPathDefinition (line 34715) | function getPathDefinition(glyph, path) {
  function Glyph (line 34757) | function Glyph(options) {
  function drawCircles (line 34987) | function drawCircles(l, x, y, scale) {
  function defineDependentProperty (line 35074) | function defineDependentProperty(glyph, externalName, internalName) {
  function GlyphSet (line 35098) | function GlyphSet(font, glyphs) {
  function glyphLoader (line 35139) | function glyphLoader(font, index) {
  function ttfGlyphLoader (line 35156) | function ttfGlyphLoader(font, index, parseGlyph, data, position, buildPa...
  function cffGlyphLoader (line 35183) | function cffGlyphLoader(font, index, parseCFFCharstring, charstring) {
  function equals (line 35202) | function equals(a, b) {
  function calcCFFSubroutineBias (line 35224) | function calcCFFSubroutineBias(subrs) {
  function parseCFFIndex (line 35239) | function parseCFFIndex(data, start, conversionFn) {
  function parseFloatOperand (line 35273) | function parseFloatOperand(parser) {
  function parseOperand (line 35299) | function parseOperand(parser, b0) {
  function entriesToObject (line 35341) | function entriesToObject(entries) {
  function parseCFFDict (line 35365) | function parseCFFDict(data, start, size) {
  function getCFFString (line 35397) | function getCFFString(strings, index) {
  function interpretDict (line 35409) | function interpretDict(dict, meta, strings) {
  function parseCFFHeader (line 35449) | function parseCFFHeader(data, start) {
  function parseCFFTopDict (line 35506) | function parseCFFTopDict(data, strings) {
  function parseCFFPrivateDict (line 35512) | function parseCFFPrivateDict(data, start, size, strings) {
  function gatherCFFTopDicts (line 35532) | function gatherCFFTopDicts(data, start, cffIndex, strings) {
  function parseCFFCharset (line 35561) | function parseCFFCharset(data, start, nGlyphs, strings) {
  function parseCFFEncoding (line 35603) | function parseCFFEncoding(data, start, charset) {
  function parseCFFCharstring (line 35635) | function parseCFFCharstring(font, glyph, code) {
  function parseCFFFDSelect (line 36055) | function parseCFFFDSelect(data, start, nGlyphs, fdArrayCount) {
  function parseCFFTable (line 36101) | function parseCFFTable(data, start, font) {
  function encodeString (line 36184) | function encodeString(s, strings) {
  function makeHeader (line 36205) | function makeHeader() {
  function makeNameIndex (line 36214) | function makeNameIndex(fontNames) {
  function makeDict (line 36227) | function makeDict(meta, attrs, strings) {
  function makeTopDict (line 36245) | function makeTopDict(attrs, strings) {
  function makeTopDictIndex (line 36253) | function makeTopDictIndex(topDict) {
  function makeStringIndex (line 36261) | function makeStringIndex(strings) {
  function makeGlobalSubrIndex (line 36273) | function makeGlobalSubrIndex() {
  function makeCharsets (line 36280) | function makeCharsets(glyphNames, strings) {
  function glyphToOps (line 36293) | function glyphToOps(glyph) {
  function makeCharStringsIndex (line 36361) | function makeCharStringsIndex(glyphs) {
  function makePrivateDict (line 36375) | function makePrivateDict(attrs, strings) {
  function makeCFFTable (line 36383) | function makeCFFTable(glyphs, options) {
  function parseHeadTable (line 36461) | function parseHeadTable(data, start) {
  function makeHeadTable (line 36485) | function makeHeadTable(options) {
  function parseHheaTable (line 36520) | function parseHheaTable(data, start) {
  function makeHheaTable (line 36540) | function makeHheaTable(options) {
  function parseHmtxTable (line 36568) | function parseHmtxTable(data, start, numMetrics, numGlyphs, glyphs) {
  function makeHmtxTable (line 36585) | function makeHmtxTable(glyphs) {
  function makeLtagTable (line 36602) | function makeLtagTable(tags) {
  function parseLtagTable (line 36626) | function parseLtagTable(data, start) {
  function parseMaxpTable (line 36654) | function parseMaxpTable(data, start) {
  function makeMaxpTable (line 36678) | function makeMaxpTable(numGlyphs) {
  function getLanguageCode (line 37207) | function getLanguageCode(platformID, languageID, ltag) {
  function getEncoding (line 37288) | function getEncoding(platformID, encodingID, languageID) {
  function parseNameTable (line 37310) | function parseNameTable(data, start, ltag) {
  function reverseDict (line 37356) | function reverseDict(dict) {
  function makeNameRecord (line 37365) | function makeNameRecord(platformID, encodingID, languageID, nameID, leng...
  function findSubArray (line 37378) | function findSubArray(needle, haystack) {
  function addStringToPool (line 37398) | function addStringToPool(s, pool) {
  function makeNameTable (line 37413) | function makeNameTable(names, ltag) {
  function getUnicodeRange (line 37643) | function getUnicodeRange(unicode) {
  function parseOS2Table (line 37655) | function parseOS2Table(data, start) {
  function makeOS2Table (line 37708) | function makeOS2Table(options) {
  function parsePostTable (line 37764) | function parsePostTable(data, start) {
  function makePostTable (line 37808) | function makePostTable() {
  function parseGsubTable (line 38008) | function parseGsubTable(data, start) {
  function makeGsubTable (line 38076) | function makeGsubTable(gsub) {
  function parseMetaTable (line 38091) | function parseMetaTable(data, start) {
  function makeMetaTable (line 38111) | function makeMetaTable(tags) {
  function log2 (line 38141) | function log2(v) {
  function computeCheckSum (line 38145) | function computeCheckSum(bytes) {
  function makeTableRecord (line 38162) | function makeTableRecord(tag, checkSum, offset, length) {
  function makeSfntTable (line 38171) | function makeSfntTable(tables) {
  function metricsForChar (line 38227) | function metricsForChar(font, chars, notFoundMetrics) {
  function average (line 38239) | function average(vs) {
  function fontToSfntTable (line 38250) | function fontToSfntTable(font) {
  function searchTag (line 38460) | function searchTag(arr, tag) {
  function binSearch (line 38477) | function binSearch(arr, value) {
  function searchRange (line 38495) | function searchRange(ranges, value) {
  function Layout (line 38521) | function Layout(font, tableName) {
  function Position (line 38804) | function Position(font) {
  function Substitution (line 38879) | function Substitution(font) {
  function arraysEqual (line 38884) | function arraysEqual(ar1, ar2) {
  function getSubstFormat (line 38894) | function getSubstFormat(lookupTable, format, defaultSubtable) {
  function isBrowser (line 39175) | function isBrowser() {
  function nodeBufferToArrayBuffer (line 39179) | function nodeBufferToArrayBuffer(buffer) {
  function arrayBufferToNodeBuffer (line 39189) | function arrayBufferToNodeBuffer(ab) {
  function checkArgument (line 39199) | function checkArgument(expression, message) {
  function parseGlyphCoordinate (line 39208) | function parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask...
  function parseGlyph (line 39234) | function parseGlyph(glyph, data, start) {
  function transformPoints (line 39379) | function transformPoints(points, transform) {
  function getContours (line 39395) | function getContours(points) {
  function getPath (line 39412) | function getPath(points) {
  function buildPath (line 39468) | function buildPath(glyphs, glyph) {
  function parseGlyfTable (line 39507) | function parseGlyfTable(data, start, loca, font) {
  function Hinting (line 39565) | function Hinting(font) {
  function roundOff (line 39591) | function roundOff(v) {
  function roundToGrid (line 39598) | function roundToGrid(v) {
  function roundToDoubleGrid (line 39606) | function roundToDoubleGrid(v) {
  function roundToHalfGrid (line 39613) | function roundToHalfGrid(v) {
  function roundUpToGrid (line 39620) | function roundUpToGrid(v) {
  function roundDownToGrid (line 39627) | function roundDownToGrid(v) {
  function UnitVector (line 39883) | function UnitVector(x, y) {
  function getUnitVector (line 39976) | function getUnitVector(x, y) {
  function HPoint (line 39990) | function HPoint(
  function State (line 40063) | function State(env, prog) {
  function initTZone (line 40417) | function initTZone(state)
  function skip (line 40432) | function skip(state, handleElse)
  function SVTCA (line 40466) | function SVTCA(v, state) {
  function SPVTCA (line 40474) | function SPVTCA(v, state) {
  function SFVTCA (line 40482) | function SFVTCA(v, state) {
  function SPVTL (line 40490) | function SPVTL(a, state) {
  function SFVTL (line 40515) | function SFVTL(a, state) {
  function SPVFS (line 40540) | function SPVFS(state) {
  function SFVFS (line 40552) | function SFVFS(state) {
  function GPV (line 40564) | function GPV(state) {
  function GFV (line 40576) | function GFV(state) {
  function SFVTPV (line 40588) | function SFVTPV(state) {
  function ISECT (line 40596) | function ISECT(state)
  function SRP0 (line 40636) | function SRP0(state) {
  function SRP1 (line 40644) | function SRP1(state) {
  function SRP2 (line 40652) | function SRP2(state) {
  function SZP0 (line 40660) | function SZP0(state) {
  function SZP1 (line 40682) | function SZP1(state) {
  function SZP2 (line 40704) | function SZP2(state) {
  function SZPS (line 40726) | function SZPS(state) {
  function SLOOP (line 40748) | function SLOOP(state) {
  function RTG (line 40756) | function RTG(state) {
  function RTHG (line 40764) | function RTHG(state) {
  function SMD (line 40772) | function SMD(state) {
  function ELSE (line 40782) | function ELSE(state) {
  function JMPR (line 40796) | function JMPR(state) {
  function SCVTCI (line 40807) | function SCVTCI(state) {
  function DUP (line 40817) | function DUP(state) {
  function POP (line 40827) | function POP(state) {
  function CLEAR (line 40835) | function CLEAR(state) {
  function SWAP (line 40843) | function SWAP(state) {
  function DEPTH (line 40857) | function DEPTH(state) {
  function LOOPCALL (line 40867) | function LOOPCALL(state) {
  function CALL (line 40898) | function CALL(state) {
  function CINDEX (line 40921) | function CINDEX(state) {
  function MINDEX (line 40934) | function MINDEX(state) {
  function FDEF (line 40945) | function FDEF(state) {
  function MDAP (line 40964) | function MDAP(round, state) {
  function IUP (line 40984) | function IUP(v, state) {
  function SHP (line 41019) | function SHP(a, state) {
  function SHC (line 41054) | function SHC(a, state) {
  function SHZ (line 41076) | function SHZ(a, state) {
  function SHPIX (line 41107) | function SHPIX(state) {
  function IP (line 41135) | function IP(state) {
  function MSIRP (line 41168) | function MSIRP(a, state) {
  function ALIGNRP (line 41189) | function ALIGNRP(state) {
  function RTDG (line 41219) | function RTDG(state) {
  function MIAP (line 41227) | function MIAP(round, state) {
  function NPUSHB (line 41266) | function NPUSHB(state) {
  function NPUSHW (line 41282) | function NPUSHW(state) {
  function WS (line 41301) | function WS(state) {
  function RS (line 41317) | function RS(state) {
  function WCVTP (line 41332) | function WCVTP(state) {
  function RCVT (line 41345) | function RCVT(state) {
  function GC (line 41356) | function GC(a, state) {
  function MD (line 41368) | function MD(a, state) {
  function MPPEM (line 41383) | function MPPEM(state) {
  function FLIPON (line 41390) | function FLIPON(state) {
  function LT (line 41397) | function LT(state) {
  function LTEQ (line 41409) | function LTEQ(state) {
  function GT (line 41421) | function GT(state) {
  function GTEQ (line 41433) | function GTEQ(state) {
  function EQ (line 41445) | function EQ(state) {
  function NEQ (line 41457) | function NEQ(state) {
  function ODD (line 41469) | function ODD(state) {
  function EVEN (line 41480) | function EVEN(state) {
  function IF (line 41491) | function IF(state) {
  function EIF (line 41507) | function EIF(state) {
  function AND (line 41517) | function AND(state) {
  function OR (line 41529) | function OR(state) {
  function NOT (line 41541) | function NOT(state) {
  function DELTAP123 (line 41554) | function DELTAP123(b, state) {
  function SDB (line 41583) | function SDB(state) {
  function SDS (line 41594) | function SDS(state) {
  function ADD (line 41605) | function ADD(state) {
  function SUB (line 41617) | function SUB(state) {
  function DIV (line 41629) | function DIV(state) {
  function MUL (line 41641) | function MUL(state) {
  function ABS (line 41653) | function ABS(state) {
  function NEG (line 41664) | function NEG(state) {
  function FLOOR (line 41675) | function FLOOR(state) {
  function CEILING (line 41686) | function CEILING(state) {
  function ROUND (line 41697) | function ROUND(dt, state) {
  function WCVTF (line 41708) | function WCVTF(state) {
  function DELTAC123 (line 41722) | function DELTAC123(b, state) {
  function SROUND (line 41750) | function SROUND(state) {
  function S45ROUND (line 41799) | function S45ROUND(state) {
  function ROFF (line 41849) | function ROFF(state) {
  function RUTG (line 41857) | function RUTG(state) {
  function RDTG (line 41865) | function RDTG(state) {
  function SCANCTRL (line 41873) | function SCANCTRL(state) {
  function SDPVTL (line 41883) | function SDPVTL(a, state) {
  function GETINFO (line 41908) | function GETINFO(state) {
  function ROLL (line 41929) | function ROLL(state) {
  function MAX (line 41944) | function MAX(state) {
  function MIN (line 41956) | function MIN(state) {
  function SCANTYPE (line 41968) | function SCANTYPE(state) {
  function INSTCTRL (line 41976) | function INSTCTRL(state) {
  function PUSHB (line 41991) | function PUSHB(n, state) {
  function PUSHW (line 42005) | function PUSHW(n, state) {
  function MDRP_MIRP (line 42031) | function MDRP_MIRP(indirect, setRp0, keepD, ro, dt, state) {
  function Font (line 42624) | function Font(options) {
  function assert (line 43017) | function assert(predicate, message) {
  function assertNamePresent (line 43020) | function assertNamePresent(name) {
  function addName (line 43150) | function addName(name, names) {
  function makeFvarAxis (line 43172) | function makeFvarAxis(n, axis, names) {
  function parseFvarAxis (line 43184) | function parseFvarAxis(data, start, names) {
  function makeFvarInstance (line 43196) | function makeFvarInstance(n, inst, axes, names) {
  function parseFvarInstance (line 43215) | function parseFvarInstance(data, start, axes, names) {
  function makeFvarTable (line 43229) | function makeFvarTable(fvar, names) {
  function parseFvarTable (line 43252) | function parseFvarTable(data, start, names) {
  function parseGposTable (line 43362) | function parseGposTable(data, start) {
  function makeGposTable (line 43391) | function makeGposTable(gpos) {
  function parseWindowsKernTable (line 43404) | function parseWindowsKernTable(p) {
  function parseMacKernTable (line 43424) | function parseMacKernTable(p) {
  function parseKernTable (line 43453) | function parseKernTable(data, start) {
  function parseLocaTable (line 43475) | function parseLocaTable(data, start, numGlyphs, shortVersion) {
  function loadFromFile (line 43510) | function loadFromFile(path, callback) {
  function loadFromUrl (line 43526) | function loadFromUrl(url, callback) {
  function parseOpenTypeTableEntries (line 43552) | function parseOpenTypeTableEntries(data, numTables) {
  function parseWOFFTableEntries (line 43573) | function parseWOFFTableEntries(data, numTables) {
  function uncompressTable (line 43608) | function uncompressTable(data, tableEntry) {
  function parseBuffer (line 43632) | function parseBuffer(buffer) {
  function load (line 43834) | function load(url, callback) {
  function loadSync (line 43858) | function loadSync(url) {
  function defaultSetTimout (line 43891) | function defaultSetTimout() {
  function defaultClearTimeout (line 43894) | function defaultClearTimeout () {
  function runTimeout (line 43917) | function runTimeout(fun) {
  function runClearTimeout (line 43942) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 43974) | function cleanUpNextTick() {
  function drainQueue (line 43989) | function drainQueue() {
  function Item (line 44027) | function Item(fun, array) {
  function noop (line 44041) | function noop() {}
  function normalizeName (line 44110) | function normalizeName(name) {
  function normalizeValue (line 44120) | function normalizeValue(value) {
  function iteratorFor (line 44128) | function iteratorFor(items) {
  function Headers (line 44145) | function Headers(headers) {
  function consumed (line 44217) | function consumed(body) {
  function fileReaderReady (line 44224) | function fileReaderReady(reader) {
  function readBlobAsArrayBuffer (line 44235) | function readBlobAsArrayBuffer(blob) {
  function readBlobAsText (line 44242) | function readBlobAsText(blob) {
  function readArrayBufferAsText (line 44249) | function readArrayBufferAsText(buf) {
  function bufferClone (line 44259) | function bufferClone(buf) {
  function Body (line 44269) | function Body() {
  function normalizeMethod (line 44365) | function normalizeMethod(method) {
  function Request (line 44370) | function Request(input, options) {
  function decode (line 44411) | function decode(body) {
  function parseHeaders (line 44424) | function parseHeaders(rawHeaders) {
  function Response (line 44442) | function Response(bodyInit, options) {
  function getWindowWidth (line 48277) | function getWindowWidth() {
  function getWindowHeight (line 48286) | function getWindowHeight() {
  function launchFullscreen (line 48450) | function launchFullscreen(element) {
  function exitFullscreen (line 48470) | function exitFullscreen() {
  function formatType (line 49084) | function formatType() {
  function calculateOffset (line 51656) | function calculateOffset(object) {
  function getMousePos (line 58982) | function getMousePos(canvas, w, h, evt) {
  function getTouchInfo (line 59574) | function getTouchInfo(canvas, w, h, e, i) {
  function buildBlurKernel (line 60303) | function buildBlurKernel(r) {
  function blurARGB (line 60338) | function blurARGB(canvas, radius) {
  function _sAssign (line 60867) | function _sAssign(sVal, iVal) {
  function makeObject (line 63377) | function makeObject(row, headers) {
  function escapeHelper (line 64426) | function escapeHelper(content) {
  function _checkFileExtension (line 64640) | function _checkFileExtension(filename, extension) {
  function destroyClickedElement (line 64682) | function destroyClickedElement(event) {
  function elementsToP5XML (line 66693) | function elementsToP5XML(elements) {
  function hypot (line 68056) | function hypot(x, y, z) {
  function isSpace (line 71672) | function isSpace(i) {
  function pathToPoints (line 71930) | function pathToPoints(cmds, options) {
  function simplify (line 71951) | function simplify(pts, angle) {
  function splitPaths (line 71965) | function splitPaths(cmds) {
  function cmdToArr (line 71982) | function cmdToArr(cmd) {
  function parseOpts (line 71996) | function parseOpts(options, defaults) {
  function at (line 72011) | function at(v, i) {
  function collinear (line 72016) | function collinear(a, b, c, thresholdAngle) {
  function areaTriangle (line 72041) | function areaTriangle(a, b, c) {
  function findDotsAtSegment (line 72047) | function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
  function getPointAtSegmentLength (line 72080) | function getPointAtSegmentLength(
  function pointAtLength (line 72106) | function pointAtLength(path, length, istotal) {
  function pathToAbsolute (line 72158) | function pathToAbsolute(pathArray) {
  function path2curve (line 72257) | function path2curve(path, path2) {
  function a2c (line 72413) | function a2c(x1, y1, rx, ry, angle, lac, sweep_flag, x2, y2, recursive) {
  function catmullRom2bezier (line 72530) | function catmullRom2bezier(crp, z) {
  function l2c (line 72596) | function l2c(x1, y1, x2, y2) {
  function q2c (line 72600) | function q2c(x1, y1, ax, ay, x2, y2) {
  function bezlen (line 72613) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
  function getTatLen (line 72661) | function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {
  function base3 (line 72679) | function base3(t, p1, p2, p3, p4) {
  function cacheKey (line 72685) | function cacheKey() {
  function doNf (line 73591) | function doNf(num, left, right) {
  function doNfc (line 73679) | function doNfc(num, right) {
  function addNfp (line 73759) | function addNfp(num) {
  function addNfs (line 73837) | function addNfs(num) {
  function parseObj (line 76762) | function parseObj(model, lines) {
  function vertexCallback (line 81879) | function vertexCallback(data, polyVertArray) {
  function begincallback (line 81885) | function begincallback(type) {
  function errorcallback (line 81891) | function errorcallback(errno) {
  function combinecallback (line 81896) | function combinecallback(coords, data, weight) {
  function edgeCallback (line 81900) | function edgeCallback(flag) {
  function ImageInfos (line 82816) | function ImageInfos(width, height) {
  function setPixel (line 82894) | function setPixel(imageInfo, r, g, b, a) {
  function push (line 82968) | function push(xs, ys, v) {
  function clamp (line 83010) | function clamp(v, min, max) {
  function byte (line 83022) | function byte(v) {
  function Cubic (line 83036) | function Cubic(p0, c0, c1, p1) {
  function cubicToQuadratics (line 83169) | function cubicToQuadratics(x0, y0, cx0, cy0, cx1, cy1, x1, y1) {
  function pushLine (line 83233) | function pushLine(x0, y0, x1, y1) {
  function samePoint (line 83249) | function samePoint(x0, y0, x1, y1) {
  function layout (line 83325) | function layout(dim, dimImageInfos, cellImageInfos) {

FILE: 05_unpredictability/02_roll_the_dice/dice_roll_javascript/sketch.js
  function drawDie (line 5) | function drawDie(x, y){
  function setup (line 66) | function setup(){
  function overlaps (line 72) | function overlaps(x, y){
  function drawDice (line 83) | function drawDice(){
  function keyPressed (line 99) | function keyPressed() {
  function draw (line 124) | function draw(){

FILE: 05_unpredictability/07_drunk_walk_2_random_lattice_walk/lattice_random_walk_javascript/sketch.js
  function setup (line 10) | function setup() {
  function clearCanvas (line 16) | function clearCanvas(){
  function movePoint (line 23) | function movePoint(){
  function draw (line 51) | function draw() {
  function mousePressed (line 55) | function mousePressed(){
  function keyPressed (line 59) | function keyPressed(){

FILE: 05_unpredictability/12_noise_mountains/noise_mountains_js/sketch.js
  function setup (line 2) | function setup() {
  function draw (line 6) | function draw() {

FILE: 06_arrays/01_living_line_1/living_line_js/living_line_js.js
  function setup (line 8) | function setup() {
  function draw (line 14) | function draw() {

FILE: 06_arrays/02_living_line_2/living_line_2_js/living_line_2_js.js
  function setup (line 12) | function setup() {
  function draw (line 22) | function draw() {
  function mouseMoved (line 55) | function mouseMoved() {

FILE: 06_arrays/03_living_line_3/living_line_3_js/living_line_3_js.js
  function setup (line 10) | function setup() {
  function draw (line 19) | function draw() {
  function mouseMoved (line 41) | function mouseMoved() {

FILE: 06_arrays/04_calligraphic_polyline/calligraphic_polyline_js/calligraphic_polyline_js.js
  function setup (line 4) | function setup() {
  function draw (line 12) | function draw() {
  function drawPolyline_by_ellipses (line 17) | function drawPolyline_by_ellipses() {
  function drawPolyline_by_segments (line 28) | function drawPolyline_by_segments() {
  function drawPolyline_by_quads (line 40) | function drawPolyline_by_quads() {
  function estimateSlope (line 94) | function estimateSlope(cur, prev, next) {
  function getWidth (line 112) | function getWidth(index) {
  function mouseMoved (line 125) | function mouseMoved() {

FILE: 06_arrays/05_animated_walk_cycle/animated_walk_cycle_js/animated_walk_cycle_js.js
  function setup (line 7) | function setup() {
  function draw (line 20) | function draw() {

FILE: 06_arrays/06_plant_the_flag/plant_the_flag_js/plant_the_flag_js.js
  function placeFlagsOnTerrain (line 12) | function placeFlagsOnTerrain() {
  function drawFlag (line 26) | function drawFlag(flagx, flagy) {
  function setup (line 36) | function setup() {
  function draw (line 41) | function draw() {
  function calculateTerrain (line 58) | function calculateTerrain() {
  function renderTerrain (line 68) | function renderTerrain() {

FILE: 06_arrays/07_longest_line/longest_line_js/longest_line_js.js
  function setup (line 9) | function setup() {
  function draw (line 14) | function draw() {
  function mousePressed (line 48) | function mousePressed() {
  function mouseReleased (line 53) | function mouseReleased() {
  function mouseDragged (line 58) | function mouseDragged() {

FILE: 06_arrays/08_reordering_rectangles/reordering_rectangles_js/reordering_rectangles_js.js
  class Rectangle (line 10) | class Rectangle {
    method constructor (line 11) | constructor(xx, yy, ww, hh, cc) {
    method getArea (line 19) | getArea() {
    method getLeft (line 23) | getLeft() {
  function setup (line 28) | function setup() {
  function draw (line 57) | function draw() {

FILE: 07_time_and_interactivity/01_eyes_following_cursor/eyes_following_cursor_js/eyes_following_cursor_js.js
  function setup (line 4) | function setup() {
  function draw (line 11) | function draw() {
  function pupil (line 24) | function pupil(x, y) {

FILE: 07_time_and_interactivity/03_ripples_in_a_pond/ripples_in_a_pond_js/p5.js
  function r (line 2) | function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==...
  function getLens (line 27837) | function getLens (b64) {
  function byteLength (line 27857) | function byteLength (b64) {
  function _byteLength (line 27864) | function _byteLength (b64, validLen, placeHoldersLen) {
  function toByteArray (line 27868) | function toByteArray (b64) {
  function tripletToBase64 (line 27913) | function tripletToBase64 (num) {
  function encodeChunk (line 27920) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 27933) | function fromByteArray (uint8) {
  function typedArraySupport (line 28015) | function typedArraySupport () {
  function createBuffer (line 28042) | function createBuffer (length) {
  function Buffer (line 28062) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 28088) | function from (value, encodingOrOffset, length) {
  function assertSize (line 28153) | function assertSize (size) {
  function alloc (line 28161) | function alloc (size, fill, encoding) {
  function allocUnsafe (line 28185) | function allocUnsafe (size) {
  function fromString (line 28203) | function fromString (string, encoding) {
  function fromArrayLike (line 28227) | function fromArrayLike (array) {
  function fromArrayBuffer (line 28236) | function fromArrayBuffer (array, byteOffset, length) {
  function fromObject (line 28259) | function fromObject (obj) {
  function checked (line 28284) | function checked (length) {
  function SlowBuffer (line 28294) | function SlowBuffer (length) {
  function byteLength (line 28385) | function byteLength (string, encoding) {
  function slowToString (line 28434) | function slowToString (encoding, start, end) {
  function swap (line 28512) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 28652) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 28708) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 28776) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 28801) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 28805) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 28809) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 28813) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 28817) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 28899) | function base64Slice (buf, start, end) {
  function utf8Slice (line 28907) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 28985) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 29003) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 29013) | function latin1Slice (buf, start, end) {
  function hexSlice (line 29023) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 29036) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 29075) | function checkOffset (offset, ext, length) {
  function checkInt (line 29250) | function checkInt (buf, value, offset, ext, max, min) {
  function checkIEEE754 (line 29438) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 29443) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 29461) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 29600) | function base64clean (str) {
  function toHex (line 29614) | function toHex (n) {
  function utf8ToBytes (line 29619) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 29699) | function asciiToBytes (str) {
  function utf16leToBytes (line 29708) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 29724) | function base64ToBytes (str) {
  function blitBuffer (line 29728) | function blitBuffer (src, dst, offset, length) {
  function isInstance (line 29739) | function isInstance (obj, type) {
  function numberIsNaN (line 29744) | function numberIsNaN (obj) {
  function objectOrFunction (line 29765) | function objectOrFunction(x) {
  function isFunction (line 29770) | function isFunction(x) {
  function setScheduler (line 29807) | function setScheduler(scheduleFn) {
  function setAsap (line 29811) | function setAsap(asapFn) {
  function useNextTick (line 29824) | function useNextTick() {
  function useVertxTimer (line 29833) | function useVertxTimer() {
  function useMutationObserver (line 29843) | function useMutationObserver() {
  function useMessageChannel (line 29855) | function useMessageChannel() {
  function useSetTimeout (line 29863) | function useSetTimeout() {
  function flush (line 29873) | function flush() {
  function attemptVertx (line 29887) | function attemptVertx() {
  function then (line 29911) | function then(onFulfillment, onRejection) {
  function resolve$1 (line 29966) | function resolve$1(object) {
  function noop (line 29981) | function noop() {}
  function selfFulfillment (line 29989) | function selfFulfillment() {
  function cannotReturnOwn (line 29993) | function cannotReturnOwn() {
  function getThen (line 29997) | function getThen(promise) {
  function tryThen (line 30006) | function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
  function handleForeignThenable (line 30014) | function handleForeignThenable(promise, thenable, then$$1) {
  function handleOwnThenable (line 30043) | function handleOwnThenable(promise, thenable) {
  function handleMaybeThenable (line 30057) | function handleMaybeThenable(promise, maybeThenable, then$$1) {
  function resolve (line 30074) | function resolve(promise, value) {
  function publishRejection (line 30084) | function publishRejection(promise) {
  function fulfill (line 30092) | function fulfill(promise, value) {
  function reject (line 30105) | function reject(promise, reason) {
  function subscribe (line 30115) | function subscribe(parent, child, onFulfillment, onRejection) {
  function publish (line 30131) | function publish(promise) {
  function tryCatch (line 30157) | function tryCatch(callback, detail) {
  function invokeCallback (line 30166) | function invokeCallback(settled, promise, callback, detail) {
  function initializePromise (line 30206) | function initializePromise(promise, resolver) {
  function nextId (line 30219) | function nextId() {
  function makePromise (line 30223) | function makePromise(promise) {
  function validationError (line 30230) | function validationError() {
  function Enumerator (line 30235) | function Enumerator(Constructor, input) {
  function all (line 30375) | function all(entries) {
  function race (line 30444) | function race(entries) {
  function reject$1 (line 30496) | function reject$1(reason) {
  function needsResolver (line 30504) | function needsResolver() {
  function needsNew (line 30508) | function needsNew() {
  function Promise (line 30617) | function Promise(resolver) {
  function polyfill (line 30890) | function polyfill() {
  function generateCallbackFunction (line 30958) | function generateCallbackFunction() {
  function clearFunction (line 30962) | function clearFunction(functionName) {
  function removeScript (line 30972) | function removeScript(scriptId) {
  function fetchJsonp (line 30979) | function fetchJsonp(_url) {
  function t (line 31366) | function t(a,b){return a.b===b.b&&a.a===b.a}
  function u (line 31366) | function u(a,b){return a.b<b.b||a.b===b.b&&a.a<=b.a}
  function v (line 31366) | function v(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?d<e?b.a-a.a+d/(d+...
  function x (line 31366) | function x(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?(b.a-c.a)*d+(b.a-...
  function z (line 31366) | function z(a,b){return a.a<b.a||a.a===b.a&&a.b<=b.b}
  function aa (line 31366) | function aa(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?d<e?b.b-a.b+d/(d...
  function ba (line 31367) | function ba(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?(b.b-c.b)*d+(b.b...
  function ca (line 31367) | function ca(a){return u(a.b.a,a.a)}
  function da (line 31367) | function da(a){return u(a.a,a.b.a)}
  function A (line 31367) | function A(a,b,c,d){a=0>a?0:a;c=0>c?0:c;return a<=c?0===c?(b+d)/2:b+a/(a...
  function ea (line 31367) | function ea(a){var b=B(a.b);C(b,a.c);C(b.b,a.c);D(b,a.a);return b}
  function E (line 31367) | function E(a,b){var c=!1,d=!1;a!==b&&(b.a!==a.a&&(d=!0,F(b.a,a.a)),b.d!=...
  function I (line 31367) | function I(a){var b=a.b,c=!1;a.d!==a.b.d&&(c=!0,G(a.d,a.b.d));a.c===a?F(...
  function K (line 31368) | function K(a){var b=B(a),c=b.b;H(b,a.e);b.a=a.b.a;C(c,b.a);b.d=c.d=a.d;b...
  function L (line 31368) | function L(a,b){var c=!1,d=B(a),e=d.b;b.d!==a.d&&(c=!0,G(b.d,a.d));H(d,a...
  function B (line 31368) | function B(a){var b=new M,c=new M,d=a.b.h;c.h=d;d.b.h=b;b.h=a;a.b.h=c;b....
  function H (line 31368) | function H(a,b){var c=a.c,d=b.c;c.b.e=b;d.b.e=a;a.c=d;b.c=c}
  function C (line 31369) | function C(a,b){var c=b.f,d=new N(b,c);c.e=d;b.f=d;c=d.c=a;do c.a=d,c=c....
  function D (line 31369) | function D(a,b){var c=b.d,d=new ga(b,c);c.b=d;b.d=d;d.a=a;d.c=b.c;c=a;do...
  function fa (line 31369) | function fa(a){var b=a.h;a=a.b.h;b.b.h=a;a.b.h=b}
  function F (line 31369) | function F(a,b){var c=a.c,d=c;do d.a=b,d=d.c;while(d!==c);c=a.f;d=a.e;d....
  function G (line 31369) | function G(a,b){var c=a.a,d=c;do d.d=b,d=d.e;while(d!==c);c=a.d;d=a.b;d....
  function ha (line 31369) | function ha(a){var b=0;Math.abs(a[1])>Math.abs(a[0])&&(b=1);Math.abs(a[2...
  function P (line 31369) | function P(a,b){a.f+=b.f;a.b.f+=b.b.f}
  function ia (line 31369) | function ia(a,b,c){a=a.a;b=b.a;c=c.a;if(b.b.a===a)return c.b.a===a?u(b.a...
  function Q (line 31369) | function Q(a){a.a.i=null;var b=a.e;b.a.c=b.c;b.c.a=b.a;a.e=null}
  function ja (line 31369) | function ja(a,b){I(a.a);a.c=!1;a.a=b;b.i=a}
  function ka (line 31369) | function ka(a){var b=a.a.a;do a=R(a);while(a.a.a===b);a.c&&(b=L(S(a).a.b...
  function la (line 31370) | function la(a,b,c){var d=new ma;d.a=c;d.e=na(a.f,b.e,d);return c.i=d}
  function oa (line 31370) | function oa(a,b){switch(a.s){case 100130:return 0!==(b&1);case 100131:re...
  function pa (line 31370) | function pa(a){var b=a.a,c=b.d;c.c=a.d;c.a=b;Q(a)}
  function T (line 31370) | function T(a,b,c){a=b;for(b=b.a;a!==c;){a.c=!1;var d=S(a),e=d.a;if(e.a!=...
  function U (line 31371) | function U(a,b,c,d,e,f){var g=!0;do la(a,b,c.b),c=c.c;while(c!==d);for(n...
  function sa (line 31371) | function sa(a,b,c,d,e){var f=[b.g[0],b.g[1],b.g[2]];b.d=null;b.d=a.o?a.o...
  function ta (line 31372) | function ta(a,b,c){var d=[null,null,null,null];d[0]=b.a.d;d[1]=c.a.d;sa(...
  function ua (line 31372) | function ua(a,b,c,d,e){var f=Math.abs(b.b-a.b)+Math.abs(b.a-a.a),g=Math....
  function qa (line 31373) | function qa(a,b){var c=S(b),d=b.a,e=c.a;if(u(d.a,e.a)){if(0<x(e.b.a,d.a,...
  function wa (line 31374) | function wa(a,b){var c=S(b),d=b.a,e=c.a,f=d.a,g=e.a,h=d.b.a,k=e.b.a,l=ne...
  function ra (line 31377) | function ra(a,b){for(var c=S(b);;){for(;c.b;)b=c,c=S(c);if(!b.b&&(c=b,b=...
  function ya (line 31379) | function ya(a,b){a.a=b;for(var c=b.c;null===c.i;)if(c=c.c,c===b.c){var c...
  function za (line 31380) | function za(a,b){var c=new ma,d=ea(a.b);d.a.b=O;d.a.a=b;d.b.a.b=-O;d.b.a...
  function Aa (line 31380) | function Aa(a){this.a=new Ba;this.b=a;this.c=ia}
  function na (line 31380) | function na(a,b,c){do b=b.c;while(null!==b.b&&!a.c(a.b,b.b,c));a=new Ba(...
  function Ba (line 31380) | function Ba(a,b,c){this.b=a||null;this.a=b||this;this.c=c||this}
  function X (line 31380) | function X(){this.d=Y;this.p=this.b=this.q=null;this.j=[0,0,0];this.s=10...
  function Z (line 31390) | function Z(a,b){if(a.d!==b)for(;a.d!==b;)if(a.d<b)switch(a.d){case Y:V(a...
  function V (line 31390) | function V(a,b){a.p&&a.p(b,a.c)}
  function ga (line 31390) | function ga(a,b){this.b=a||this;this.d=b||this;this.a=null;this.c=!1}
  function M (line 31390) | function M(){this.h=this;this.i=this.d=this.a=this.e=this.c=this.b=null;...
  function J (line 31390) | function J(a){return a.b.e}
  function Ca (line 31390) | function Ca(){this.c=new N;this.a=new ga;this.b=new M;this.d=new M;this....
  function N (line 31390) | function N(a,b){this.e=a||this;this.f=b||this;this.d=this.c=null;this.g=...
  function Da (line 31390) | function Da(){this.c=[];this.d=null;this.a=0;this.e=!1;this.b=new Ha}
  function Ea (line 31390) | function Ea(a){a.d=[];for(var b=0;b<a.a;b++)a.d[b]=b;a.d.sort(function(a...
  function xa (line 31390) | function xa(a,b){if(a.e){var c=a.b,d=++c.a;2*d>c.f&&(c.f*=2,c.c=Ja(c.c,c...
  function Fa (line 31391) | function Fa(a){if(0===a.a)return Ka(a.b);var b=a.c[a.d[a.a-1]];if(0!==a....
  function Ha (line 31391) | function Ha(){this.d=Ja([0],33);this.e=[null,null];this.c=[0,0];this.a=0...
  function Ja (line 31391) | function Ja(a,b){for(var c=Array(b),d=0;d<a.length;d++)c[d]=a[d];for(;d<...
  function Ia (line 31391) | function Ia(a){for(var b=a.a;1<=b;--b)W(a,b);a.h=!0}
  function Ga (line 31391) | function Ga(a){return a.e[a.d[1]]}
  function Ka (line 31391) | function Ka(a){var b=a.d,c=a.e,d=a.c,e=b[1],f=c[e];0<a.a&&(b[1]=b[a.a],d...
  function W (line 31392) | function W(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f<<1;h<a.a...
  function va (line 31392) | function va(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f>>1,k=c[...
  function ma (line 31392) | function ma(){this.e=this.a=null;this.f=0;this.c=this.b=this.h=this.d=!1}
  function S (line 31392) | function S(a){return a.e.c.b}
  function R (line 31392) | function R(a){return a.e.a.b}
  function Tree (line 31465) | function Tree() {
  function Data (line 31470) | function Data(source, dest) {
  function tinf_build_bits_base (line 31514) | function tinf_build_bits_base(bits, base, delta, first) {
  function tinf_build_fixed_trees (line 31529) | function tinf_build_fixed_trees(lt, dt) {
  function tinf_build_tree (line 31555) | function tinf_build_tree(t, lengths, off, num) {
  function tinf_getbit (line 31583) | function tinf_getbit(d) {
  function tinf_read_bits (line 31599) | function tinf_read_bits(d, num, base) {
  function tinf_decode_symbol (line 31615) | function tinf_decode_symbol(d, t) {
  function tinf_decode_trees (line 31641) | function tinf_decode_trees(d, lt, dt) {
  function tinf_inflate_block_data (line 31707) | function tinf_inflate_block_data(d, lt, dt) {
  function tinf_inflate_uncompressed_block (line 31741) | function tinf_inflate_uncompressed_block(d) {
  function tinf_uncompress (line 31776) | function tinf_uncompress(source, dest) {
  function derive (line 31840) | function derive(v0, v1, v2, v3, t) {
  function BoundingBox (line 31856) | function BoundingBox() {
  function Path (line 32006) | function Path() {
  function floatToString (line 32239) | function floatToString(v) {
  function packValues (line 32247) | function packValues() {
  function fail (line 32323) | function fail(message) {
  function argument (line 32329) | function argument(predicate, message) {
  function constant (line 32358) | function constant(v) {
  function isByteEncodable (line 32911) | function isByteEncodable(value) {
  function encodeVarDeltaRunAsZeroes (line 32916) | function encodeVarDeltaRunAsZeroes(deltas, pos, result) {
  function encodeVarDeltaRunAsBytes (line 32928) | function encodeVarDeltaRunAsBytes(deltas, offset, result) {
  function encodeVarDeltaRunAsWords (line 32960) | function encodeVarDeltaRunAsWords(deltas, offset, result) {
  function Table (line 33311) | function Table(tableName, fields, options) {
  function ushortList (line 33352) | function ushortList(itemName, list, count) {
  function tableList (line 33367) | function tableList(itemName, records, itemCallback) {
  function recordList (line 33380) | function recordList(itemName, records, itemCallback) {
  function Coverage (line 33399) | function Coverage(coverageTable) {
  function ScriptList (line 33412) | function ScriptList(scriptListTable) {
  function FeatureList (line 33449) | function FeatureList(featureListTable) {
  function LookupList (line 33472) | function LookupList(lookupListTable, subtableMakers) {
  function getByte (line 33502) | function getByte(dataView, offset) {
  function getUShort (line 33508) | function getUShort(dataView, offset) {
  function getShort (line 33514) | function getShort(dataView, offset) {
  function getULong (line 33520) | function getULong(dataView, offset) {
  function getFixed (line 33526) | function getFixed(dataView, offset) {
  function getTag (line 33534) | function getTag(dataView, offset) {
  function getOffset (line 33545) | function getOffset(dataView, offset, offSize) {
  function getBytes (line 33556) | function getBytes(dataView, startOffset, endOffset) {
  function bytesToString (line 33566) | function bytesToString(bytes) {
  function Parser (line 33587) | function Parser(data, offset) {
  function parseCmapTableFormat12 (line 34142) | function parseCmapTableFormat12(cmap, p) {
  function parseCmapTableFormat4 (line 34166) | function parseCmapTableFormat4(cmap, p, data, start, offset) {
  function parseCmapTable (line 34218) | function parseCmapTable(data, start) {
  function addSegment (line 34256) | function addSegment(t, code, glyphIndex) {
  function addTerminatorSegment (line 34266) | function addTerminatorSegment(t) {
  function makeCmapTable (line 34276) | function makeCmapTable(glyphs) {
  function DefaultEncoding (line 34553) | function DefaultEncoding(font) {
  function CmapEncoding (line 34579) | function CmapEncoding(cmap) {
  function CffEncoding (line 34598) | function CffEncoding(encoding, charset) {
  function GlyphNames (line 34619) | function GlyphNames(post) {
  function addGlyphNames (line 34674) | function addGlyphNames(font) {
  function line (line 34703) | function line(ctx, x1, y1, x2, y2) {
  function getPathDefinition (line 34715) | function getPathDefinition(glyph, path) {
  function Glyph (line 34757) | function Glyph(options) {
  function drawCircles (line 34987) | function drawCircles(l, x, y, scale) {
  function defineDependentProperty (line 35074) | function defineDependentProperty(glyph, externalName, internalName) {
  function GlyphSet (line 35098) | function GlyphSet(font, glyphs) {
  function glyphLoader (line 35139) | function glyphLoader(font, index) {
  function ttfGlyphLoader (line 35156) | function ttfGlyphLoader(font, index, parseGlyph, data, position, buildPa...
  function cffGlyphLoader (line 35183) | function cffGlyphLoader(font, index, parseCFFCharstring, charstring) {
  function equals (line 35202) | function equals(a, b) {
  function calcCFFSubroutineBias (line 35224) | function calcCFFSubroutineBias(subrs) {
  function parseCFFIndex (line 35239) | function parseCFFIndex(data, start, conversionFn) {
  function parseFloatOperand (line 35273) | function parseFloatOperand(parser) {
  function parseOperand (line 35299) | function parseOperand(parser, b0) {
  function entriesToObject (line 35341) | function entriesToObject(entries) {
  function parseCFFDict (line 35365) | function parseCFFDict(data, start, size) {
  function getCFFString (line 35397) | function getCFFString(strings, index) {
  function interpretDict (line 35409) | function interpretDict(dict, meta, strings) {
  function parseCFFHeader (line 35449) | function parseCFFHeader(data, start) {
  function parseCFFTopDict (line 35506) | function parseCFFTopDict(data, strings) {
  function parseCFFPrivateDict (line 35512) | function parseCFFPrivateDict(data, start, size, strings) {
  function gatherCFFTopDicts (line 35532) | function gatherCFFTopDicts(data, start, cffIndex, strings) {
  function parseCFFCharset (line 35561) | function parseCFFCharset(data, start, nGlyphs, strings) {
  function parseCFFEncoding (line 35603) | function parseCFFEncoding(data, start, charset) {
  function parseCFFCharstring (line 35635) | function parseCFFCharstring(font, glyph, code) {
  function parseCFFFDSelect (line 36055) | function parseCFFFDSelect(data, start, nGlyphs, fdArrayCount) {
  function parseCFFTable (line 36101) | function parseCFFTable(data, start, font) {
  function encodeString (line 36184) | function encodeString(s, strings) {
  function makeHeader (line 36205) | function makeHeader() {
  function makeNameIndex (line 36214) | function makeNameIndex(fontNames) {
  function makeDict (line 36227) | function makeDict(meta, attrs, strings) {
  function makeTopDict (line 36245) | function makeTopDict(attrs, strings) {
  function makeTopDictIndex (line 36253) | function makeTopDictIndex(topDict) {
  function makeStringIndex (line 36261) | function makeStringIndex(strings) {
  function makeGlobalSubrIndex (line 36273) | function makeGlobalSubrIndex() {
  function makeCharsets (line 36280) | function makeCharsets(glyphNames, strings) {
  function glyphToOps (line 36293) | function glyphToOps(glyph) {
  function makeCharStringsIndex (line 36361) | function makeCharStringsIndex(glyphs) {
  function makePrivateDict (line 36375) | function makePrivateDict(attrs, strings) {
  function makeCFFTable (line 36383) | function makeCFFTable(glyphs, options) {
  function parseHeadTable (line 36461) | function parseHeadTable(data, start) {
  function makeHeadTable (line 36485) | function makeHeadTable(options) {
  function parseHheaTable (line 36520) | function parseHheaTable(data, start) {
  function makeHheaTable (line 36540) | function makeHheaTable(options) {
  function parseHmtxTable (line 36568) | function parseHmtxTable(data, start, numMetrics, numGlyphs, glyphs) {
  function makeHmtxTable (line 36585) | function makeHmtxTable(glyphs) {
  function makeLtagTable (line 36602) | function makeLtagTable(tags) {
  function parseLtagTable (line 36626) | function parseLtagTable(data, start) {
  function parseMaxpTable (line 36654) | function parseMaxpTable(data, start) {
  function makeMaxpTable (line 36678) | function makeMaxpTable(numGlyphs) {
  function getLanguageCode (line 37207) | function getLanguageCode(platformID, languageID, ltag) {
  function getEncoding (line 37288) | function getEncoding(platformID, encodingID, languageID) {
  function parseNameTable (line 37310) | function parseNameTable(data, start, ltag) {
  function reverseDict (line 37356) | function reverseDict(dict) {
  function makeNameRecord (line 37365) | function makeNameRecord(platformID, encodingID, languageID, nameID, leng...
  function findSubArray (line 37378) | function findSubArray(needle, haystack) {
  function addStringToPool (line 37398) | function addStringToPool(s, pool) {
  function makeNameTable (line 37413) | function makeNameTable(names, ltag) {
  function getUnicodeRange (line 37643) | function getUnicodeRange(unicode) {
  function parseOS2Table (line 37655) | function parseOS2Table(data, start) {
  function makeOS2Table (line 37708) | function makeOS2Table(options) {
  function parsePostTable (line 37764) | function parsePostTable(data, start) {
  function makePostTable (line 37808) | function makePostTable() {
  function parseGsubTable (line 38008) | function parseGsubTable(data, start) {
  function makeGsubTable (line 38076) | function makeGsubTable(gsub) {
  function parseMetaTable (line 38091) | function parseMetaTable(data, start) {
  function makeMetaTable (line 38111) | function makeMetaTable(tags) {
  function log2 (line 38141) | function log2(v) {
  function computeCheckSum (line 38145) | function computeCheckSum(bytes) {
  function makeTableRecord (line 38162) | function makeTableRecord(tag, checkSum, offset, length) {
  function makeSfntTable (line 38171) | function makeSfntTable(tables) {
  function metricsForChar (line 38227) | function metricsForChar(font, chars, notFoundMetrics) {
  function average (line 38239) | function average(vs) {
  function fontToSfntTable (line 38250) | function fontToSfntTable(font) {
  function searchTag (line 38460) | function searchTag(arr, tag) {
  function binSearch (line 38477) | function binSearch(arr, value) {
  function searchRange (line 38495) | function searchRange(ranges, value) {
  function Layout (line 38521) | function Layout(font, tableName) {
  function Position (line 38804) | function Position(font) {
  function Substitution (line 38879) | function Substitution(font) {
  function arraysEqual (line 38884) | function arraysEqual(ar1, ar2) {
  function getSubstFormat (line 38894) | function getSubstFormat(lookupTable, format, defaultSubtable) {
  function isBrowser (line 39175) | function isBrowser() {
  function nodeBufferToArrayBuffer (line 39179) | function nodeBufferToArrayBuffer(buffer) {
  function arrayBufferToNodeBuffer (line 39189) | function arrayBufferToNodeBuffer(ab) {
  function checkArgument (line 39199) | function checkArgument(expression, message) {
  function parseGlyphCoordinate (line 39208) | function parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask...
  function parseGlyph (line 39234) | function parseGlyph(glyph, data, start) {
  function transformPoints (line 39379) | function transformPoints(points, transform) {
  function getContours (line 39395) | function getContours(points) {
  function getPath (line 39412) | function getPath(points) {
  function buildPath (line 39468) | function buildPath(glyphs, glyph) {
  function parseGlyfTable (line 39507) | function parseGlyfTable(data, start, loca, font) {
  function Hinting (line 39565) | function Hinting(font) {
  function roundOff (line 39591) | function roundOff(v) {
  function roundToGrid (line 39598) | function roundToGrid(v) {
  function roundToDoubleGrid (line 39606) | function roundToDoubleGrid(v) {
  function roundToHalfGrid (line 39613) | function roundToHalfGrid(v) {
  function roundUpToGrid (line 39620) | function roundUpToGrid(v) {
  function roundDownToGrid (line 39627) | function roundDownToGrid(v) {
  function UnitVector (line 39883) | function UnitVector(x, y) {
  function getUnitVector (line 39976) | function getUnitVector(x, y) {
  function HPoint (line 39990) | function HPoint(
  function State (line 40063) | function State(env, prog) {
  function initTZone (line 40417) | function initTZone(state)
  function skip (line 40432) | function skip(state, handleElse)
  function SVTCA (line 40466) | function SVTCA(v, state) {
  function SPVTCA (line 40474) | function SPVTCA(v, state) {
  function SFVTCA (line 40482) | function SFVTCA(v, state) {
  function SPVTL (line 40490) | function SPVTL(a, state) {
  function SFVTL (line 40515) | function SFVTL(a, state) {
  function SPVFS (line 40540) | function SPVFS(state) {
  function SFVFS (line 40552) | function SFVFS(state) {
  function GPV (line 40564) | function GPV(state) {
  function GFV (line 40576) | function GFV(state) {
  function SFVTPV (line 40588) | function SFVTPV(state) {
  function ISECT (line 40596) | function ISECT(state)
  function SRP0 (line 40636) | function SRP0(state) {
  function SRP1 (line 40644) | function SRP1(state) {
  function SRP2 (line 40652) | function SRP2(state) {
  function SZP0 (line 40660) | function SZP0(state) {
  function SZP1 (line 40682) | function SZP1(state) {
  function SZP2 (line 40704) | function SZP2(state) {
  function SZPS (line 40726) | function SZPS(state) {
  function SLOOP (line 40748) | function SLOOP(state) {
  function RTG (line 40756) | function RTG(state) {
  function RTHG (line 40764) | function RTHG(state) {
  function SMD (line 40772) | function SMD(state) {
  function ELSE (line 40782) | function ELSE(state) {
  function JMPR (line 40796) | function JMPR(state) {
  function SCVTCI (line 40807) | function SCVTCI(state) {
  function DUP (line 40817) | function DUP(state) {
  function POP (line 40827) | function POP(state) {
  function CLEAR (line 40835) | function CLEAR(state) {
  function SWAP (line 40843) | function SWAP(state) {
  function DEPTH (line 40857) | function DEPTH(state) {
  function LOOPCALL (line 40867) | function LOOPCALL(state) {
  function CALL (line 40898) | function CALL(state) {
  function CINDEX (line 40921) | function CINDEX(state) {
  function MINDEX (line 40934) | function MINDEX(state) {
  function FDEF (line 40945) | function FDEF(state) {
  function MDAP (line 40964) | function MDAP(round, state) {
  function IUP (line 40984) | function IUP(v, state) {
  function SHP (line 41019) | function SHP(a, state) {
  function SHC (line 41054) | function SHC(a, state) {
  function SHZ (line 41076) | function SHZ(a, state) {
  function SHPIX (line 41107) | function SHPIX(state) {
  function IP (line 41135) | function IP(state) {
  function MSIRP (line 41168) | function MSIRP(a, state) {
  function ALIGNRP (line 41189) | function ALIGNRP(state) {
  function RTDG (line 41219) | function RTDG(state) {
  function MIAP (line 41227) | function MIAP(round, state) {
  function NPUSHB (line 41266) | function NPUSHB(state) {
  function NPUSHW (line 41282) | function NPUSHW(state) {
  function WS (line 41301) | function WS(state) {
  function RS (line 41317) | function RS(state) {
  function WCVTP (line 41332) | function WCVTP(state) {
  function RCVT (line 41345) | function RCVT(state) {
  function GC (line 41356) | function GC(a, state) {
  function MD (line 41368) | function MD(a, state) {
  function MPPEM (line 41383) | function MPPEM(state) {
  function FLIPON (line 41390) | function FLIPON(state) {
  function LT (line 41397) | function LT(state) {
  function LTEQ (line 41409) | function LTEQ(state) {
  function GT (line 41421) | function GT(state) {
  function GTEQ (line 41433) | function GTEQ(state) {
  function EQ (line 41445) | function EQ(state) {
  function NEQ (line 41457) | function NEQ(state) {
  function ODD (line 41469) | function ODD(state) {
  function EVEN (line 41480) | function EVEN(state) {
  function IF (line 41491) | function IF(state) {
  function EIF (line 41507) | function EIF(state) {
  function AND (line 41517) | function AND(state) {
  function OR (line 41529) | function OR(state) {
  function NOT (line 41541) | function NOT(state) {
  function DELTAP123 (line 41554) | function DELTAP123(b, state) {
  function SDB (line 41583) | function SDB(state) {
  function SDS (line 41594) | function SDS(state) {
  function ADD (line 41605) | function ADD(state) {
  function SUB (line 41617) | function SUB(state) {
  function DIV (line 41629) | function DIV(state) {
  function MUL (line 41641) | function MUL(state) {
  function ABS (line 41653) | function ABS(state) {
  function NEG (line 41664) | function NEG(state) {
  function FLOOR (line 41675) | function FLOOR(state) {
  function CEILING (line 41686) | function CEILING(state) {
  function ROUND (line 41697) | function ROUND(dt, state) {
  function WCVTF (line 41708) | function WCVTF(state) {
  function DELTAC123 (line 41722) | function DELTAC123(b, state) {
  function SROUND (line 41750) | function SROUND(state) {
  function S45ROUND (line 41799) | function S45ROUND(state) {
  function ROFF (line 41849) | function ROFF(state) {
  function RUTG (line 41857) | function RUTG(state) {
  function RDTG (line 41865) | function RDTG(state) {
  function SCANCTRL (line 41873) | function SCANCTRL(state) {
  function SDPVTL (line 41883) | function SDPVTL(a, state) {
  function GETINFO (line 41908) | function GETINFO(state) {
  function ROLL (line 41929) | function ROLL(state) {
  function MAX (line 41944) | function MAX(state) {
  function MIN (line 41956) | function MIN(state) {
  function SCANTYPE (line 41968) | function SCANTYPE(state) {
  function INSTCTRL (line 41976) | function INSTCTRL(state) {
  function PUSHB (line 41991) | function PUSHB(n, state) {
  function PUSHW (line 42005) | function PUSHW(n, state) {
  function MDRP_MIRP (line 42031) | function MDRP_MIRP(indirect, setRp0, keepD, ro, dt, state) {
  function Font (line 42624) | function Font(options) {
  function assert (line 43017) | function assert(predicate, message) {
  function assertNamePresent (line 43020) | function assertNamePresent(name) {
  function addName (line 43150) | function addName(name, names) {
  function makeFvarAxis (line 43172) | function makeFvarAxis(n, axis, names) {
  function parseFvarAxis (line 43184) | function parseFvarAxis(data, start, names) {
  function makeFvarInstance (line 43196) | function makeFvarInstance(n, inst, axes, names) {
  function parseFvarInstance (line 43215) | function parseFvarInstance(data, start, axes, names) {
  function makeFvarTable (line 43229) | function makeFvarTable(fvar, names) {
  function parseFvarTable (line 43252) | function parseFvarTable(data, start, names) {
  function parseGposTable (line 43362) | function parseGposTable(data, start) {
  function makeGposTable (line 43391) | function makeGposTable(gpos) {
  function parseWindowsKernTable (line 43404) | function parseWindowsKernTable(p) {
  function parseMacKernTable (line 43424) | function parseMacKernTable(p) {
  function parseKernTable (line 43453) | function parseKernTable(data, start) {
  function parseLocaTable (line 43475) | function parseLocaTable(data, start, numGlyphs, shortVersion) {
  function loadFromFile (line 43510) | function loadFromFile(path, callback) {
  function loadFromUrl (line 43526) | function loadFromUrl(url, callback) {
  function parseOpenTypeTableEntries (line 43552) | function parseOpenTypeTableEntries(data, numTables) {
  function parseWOFFTableEntries (line 43573) | function parseWOFFTableEntries(data, numTables) {
  function uncompressTable (line 43608) | function uncompressTable(data, tableEntry) {
  function parseBuffer (line 43632) | function parseBuffer(buffer) {
  function load (line 43834) | function load(url, callback) {
  function loadSync (line 43858) | function loadSync(url) {
  function defaultSetTimout (line 43891) | function defaultSetTimout() {
  function defaultClearTimeout (line 43894) | function defaultClearTimeout () {
  function runTimeout (line 43917) | function runTimeout(fun) {
  function runClearTimeout (line 43942) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 43974) | function cleanUpNextTick() {
  function drainQueue (line 43989) | function drainQueue() {
  function Item (line 44027) | function Item(fun, array) {
  function noop (line 44041) | function noop() {}
  function normalizeName (line 44110) | function normalizeName(name) {
  function normalizeValue (line 44120) | function normalizeValue(value) {
  function iteratorFor (line 44128) | function iteratorFor(items) {
  function Headers (line 44145) | function Headers(headers) {
  function consumed (line 44217) | function consumed(body) {
  function fileReaderReady (line 44224) | function fileReaderReady(reader) {
  function readBlobAsArrayBuffer (line 44235) | function readBlobAsArrayBuffer(blob) {
  function readBlobAsText (line 44242) | function readBlobAsText(blob) {
  function readArrayBufferAsText (line 44249) | function readArrayBufferAsText(buf) {
  function bufferClone (line 44259) | function bufferClone(buf) {
  function Body (line 44269) | function Body() {
  function normalizeMethod (line 44365) | function normalizeMethod(method) {
  function Request (line 44370) | function Request(input, options) {
  function decode (line 44411) | function decode(body) {
  function parseHeaders (line 44424) | function parseHeaders(rawHeaders) {
  function Response (line 44442) | function Response(bodyInit, options) {
  function getWindowWidth (line 48277) | function getWindowWidth() {
  function getWindowHeight (line 48286) | function getWindowHeight() {
  function launchFullscreen (line 48450) | function launchFullscreen(element) {
  function exitFullscreen (line 48470) | function exitFullscreen() {
  function formatType (line 49084) | function formatType() {
  function calculateOffset (line 51656) | function calculateOffset(object) {
  function getMousePos (line 58982) | function getMousePos(canvas, w, h, evt) {
  function getTouchInfo (line 59574) | function getTouchInfo(canvas, w, h, e, i) {
  function buildBlurKernel (line 60303) | function buildBlurKernel(r) {
  function blurARGB (line 60338) | function blurARGB(canvas, radius) {
  function _sAssign (line 60867) | function _sAssign(sVal, iVal) {
  function makeObject (line 63377) | function makeObject(row, headers) {
  function escapeHelper (line 64426) | function escapeHelper(content) {
  function _checkFileExtension (line 64640) | function _checkFileExtension(filename, extension) {
  function destroyClickedElement (line 64682) | function destroyClickedElement(event) {
  function elementsToP5XML (line 66693) | function elementsToP5XML(elements) {
  function hypot (line 68056) | function hypot(x, y, z) {
  function isSpace (line 71672) | function isSpace(i) {
  function pathToPoints (line 71930) | function pathToPoints(cmds, options) {
  function simplify (line 71951) | function simplify(pts, angle) {
  function splitPaths (line 71965) | function splitPaths(cmds) {
  function cmdToArr (line 71982) | function cmdToArr(cmd) {
  function parseOpts (line 71996) | function parseOpts(options, defaults) {
  function at (line 72011) | function at(v, i) {
  function collinear (line 72016) | function collinear(a, b, c, thresholdAngle) {
  function areaTriangle (line 72041) | function areaTriangle(a, b, c) {
  function findDotsAtSegment (line 72047) | function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
  function getPointAtSegmentLength (line 72080) | function getPointAtSegmentLength(
  function pointAtLength (line 72106) | function pointAtLength(path, length, istotal) {
  function pathToAbsolute (line 72158) | function pathToAbsolute(pathArray) {
  function path2curve (line 72257) | function path2curve(path, path2) {
  function a2c (line 72413) | function a2c(x1, y1, rx, ry, angle, lac, sweep_flag, x2, y2, recursive) {
  function catmullRom2bezier (line 72530) | function catmullRom2bezier(crp, z) {
  function l2c (line 72596) | function l2c(x1, y1, x2, y2) {
  function q2c (line 72600) | function q2c(x1, y1, ax, ay, x2, y2) {
  function bezlen (line 72613) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
  function getTatLen (line 72661) | function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {
  function base3 (line 72679) | function base3(t, p1, p2, p3, p4) {
  function cacheKey (line 72685) | function cacheKey() {
  function doNf (line 73591) | function doNf(num, left, right) {
  function doNfc (line 73679) | function doNfc(num, right) {
  function addNfp (line 73759) | function addNfp(num) {
  function addNfs (line 73837) | function addNfs(num) {
  function parseObj (line 76762) | function parseObj(model, lines) {
  function vertexCallback (line 81879) | function vertexCallback(data, polyVertArray) {
  function begincallback (line 81885) | function begincallback(type) {
  function errorcallback (line 81891) | function errorcallback(errno) {
  function combinecallback (line 81896) | function combinecallback(coords, data, weight) {
  function edgeCallback (line 81900) | function edgeCallback(flag) {
  function ImageInfos (line 82816) | function ImageInfos(width, height) {
  function setPixel (line 82894) | function setPixel(imageInfo, r, g, b, a) {
  function push (line 82968) | function push(xs, ys, v) {
  function clamp (line 83010) | function clamp(v, min, max) {
  function byte (line 83022) | function byte(v) {
  function Cubic (line 83036) | function Cubic(p0, c0, c1, p1) {
  function cubicToQuadratics (line 83169) | function cubicToQuadratics(x0, y0, cx0, cy0, cx1, cy1, x1, y1) {
  function pushLine (line 83233) | function pushLine(x0, y0, x1, y1) {
  function samePoint (line 83249) | function samePoint(x0, y0, x1, y1) {
  function layout (line 83325) | function layout(dim, dimImageInfos, cellImageInfos) {

FILE: 07_time_and_interactivity/03_ripples_in_a_pond/ripples_in_a_pond_js/ripples_in_a_pond_js.js
  function setup (line 5) | function setup() {
  function draw (line 14) | function draw() {
  function mousePressed (line 23) | function mousePressed() {
  class Ring (line 31) | class Ring {
    method constructor (line 32) | constructor(x, y, diameter, on) {
    method start (line 39) | start(xpos, ypos) {
    method grow (line 46) | grow() {
    method display (line 55) | display() {

FILE: 07_time_and_interactivity/06_easing_filtering_a_variable/easing_javascript/sketch.js
  function setup (line 4) | function setup() {
  function draw (line 9) | function draw() {

FILE: 07_time_and_interactivity/07_smoothing/smoothing_javascript/p5.js
  function r (line 2) | function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==...
  function getLens (line 27837) | function getLens (b64) {
  function byteLength (line 27857) | function byteLength (b64) {
  function _byteLength (line 27864) | function _byteLength (b64, validLen, placeHoldersLen) {
  function toByteArray (line 27868) | function toByteArray (b64) {
  function tripletToBase64 (line 27913) | function tripletToBase64 (num) {
  function encodeChunk (line 27920) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 27933) | function fromByteArray (uint8) {
  function typedArraySupport (line 28015) | function typedArraySupport () {
  function createBuffer (line 28042) | function createBuffer (length) {
  function Buffer (line 28062) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 28088) | function from (value, encodingOrOffset, length) {
  function assertSize (line 28153) | function assertSize (size) {
  function alloc (line 28161) | function alloc (size, fill, encoding) {
  function allocUnsafe (line 28185) | function allocUnsafe (size) {
  function fromString (line 28203) | function fromString (string, encoding) {
  function fromArrayLike (line 28227) | function fromArrayLike (array) {
  function fromArrayBuffer (line 28236) | function fromArrayBuffer (array, byteOffset, length) {
  function fromObject (line 28259) | function fromObject (obj) {
  function checked (line 28284) | function checked (length) {
  function SlowBuffer (line 28294) | function SlowBuffer (length) {
  function byteLength (line 28385) | function byteLength (string, encoding) {
  function slowToString (line 28434) | function slowToString (encoding, start, end) {
  function swap (line 28512) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 28652) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 28708) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 28776) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 28801) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 28805) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 28809) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 28813) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 28817) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 28899) | function base64Slice (buf, start, end) {
  function utf8Slice (line 28907) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 28985) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 29003) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 29013) | function latin1Slice (buf, start, end) {
  function hexSlice (line 29023) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 29036) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 29075) | function checkOffset (offset, ext, length) {
  function checkInt (line 29250) | function checkInt (buf, value, offset, ext, max, min) {
  function checkIEEE754 (line 29438) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 29443) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 29461) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 29600) | function base64clean (str) {
  function toHex (line 29614) | function toHex (n) {
  function utf8ToBytes (line 29619) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 29699) | function asciiToBytes (str) {
  function utf16leToBytes (line 29708) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 29724) | function base64ToBytes (str) {
  function blitBuffer (line 29728) | function blitBuffer (src, dst, offset, length) {
  function isInstance (line 29739) | function isInstance (obj, type) {
  function numberIsNaN (line 29744) | function numberIsNaN (obj) {
  function objectOrFunction (line 29765) | function objectOrFunction(x) {
  function isFunction (line 29770) | function isFunction(x) {
  function setScheduler (line 29807) | function setScheduler(scheduleFn) {
  function setAsap (line 29811) | function setAsap(asapFn) {
  function useNextTick (line 29824) | function useNextTick() {
  function useVertxTimer (line 29833) | function useVertxTimer() {
  function useMutationObserver (line 29843) | function useMutationObserver() {
  function useMessageChannel (line 29855) | function useMessageChannel() {
  function useSetTimeout (line 29863) | function useSetTimeout() {
  function flush (line 29873) | function flush() {
  function attemptVertx (line 29887) | function attemptVertx() {
  function then (line 29911) | function then(onFulfillment, onRejection) {
  function resolve$1 (line 29966) | function resolve$1(object) {
  function noop (line 29981) | function noop() {}
  function selfFulfillment (line 29989) | function selfFulfillment() {
  function cannotReturnOwn (line 29993) | function cannotReturnOwn() {
  function getThen (line 29997) | function getThen(promise) {
  function tryThen (line 30006) | function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
  function handleForeignThenable (line 30014) | function handleForeignThenable(promise, thenable, then$$1) {
  function handleOwnThenable (line 30043) | function handleOwnThenable(promise, thenable) {
  function handleMaybeThenable (line 30057) | function handleMaybeThenable(promise, maybeThenable, then$$1) {
  function resolve (line 30074) | function resolve(promise, value) {
  function publishRejection (line 30084) | function publishRejection(promise) {
  function fulfill (line 30092) | function fulfill(promise, value) {
  function reject (line 30105) | function reject(promise, reason) {
  function subscribe (line 30115) | function subscribe(parent, child, onFulfillment, onRejection) {
  function publish (line 30131) | function publish(promise) {
  function tryCatch (line 30157) | function tryCatch(callback, detail) {
  function invokeCallback (line 30166) | function invokeCallback(settled, promise, callback, detail) {
  function initializePromise (line 30206) | function initializePromise(promise, resolver) {
  function nextId (line 30219) | function nextId() {
  function makePromise (line 30223) | function makePromise(promise) {
  function validationError (line 30230) | function validationError() {
  function Enumerator (line 30235) | function Enumerator(Constructor, input) {
  function all (line 30375) | function all(entries) {
  function race (line 30444) | function race(entries) {
  function reject$1 (line 30496) | function reject$1(reason) {
  function needsResolver (line 30504) | function needsResolver() {
  function needsNew (line 30508) | function needsNew() {
  function Promise (line 30617) | function Promise(resolver) {
  function polyfill (line 30890) | function polyfill() {
  function generateCallbackFunction (line 30958) | function generateCallbackFunction() {
  function clearFunction (line 30962) | function clearFunction(functionName) {
  function removeScript (line 30972) | function removeScript(scriptId) {
  function fetchJsonp (line 30979) | function fetchJsonp(_url) {
  function t (line 31366) | function t(a,b){return a.b===b.b&&a.a===b.a}
  function u (line 31366) | function u(a,b){return a.b<b.b||a.b===b.b&&a.a<=b.a}
  function v (line 31366) | function v(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?d<e?b.a-a.a+d/(d+...
  function x (line 31366) | function x(a,b,c){var d=b.b-a.b,e=c.b-b.b;return 0<d+e?(b.a-c.a)*d+(b.a-...
  function z (line 31366) | function z(a,b){return a.a<b.a||a.a===b.a&&a.b<=b.b}
  function aa (line 31366) | function aa(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?d<e?b.b-a.b+d/(d...
  function ba (line 31367) | function ba(a,b,c){var d=b.a-a.a,e=c.a-b.a;return 0<d+e?(b.b-c.b)*d+(b.b...
  function ca (line 31367) | function ca(a){return u(a.b.a,a.a)}
  function da (line 31367) | function da(a){return u(a.a,a.b.a)}
  function A (line 31367) | function A(a,b,c,d){a=0>a?0:a;c=0>c?0:c;return a<=c?0===c?(b+d)/2:b+a/(a...
  function ea (line 31367) | function ea(a){var b=B(a.b);C(b,a.c);C(b.b,a.c);D(b,a.a);return b}
  function E (line 31367) | function E(a,b){var c=!1,d=!1;a!==b&&(b.a!==a.a&&(d=!0,F(b.a,a.a)),b.d!=...
  function I (line 31367) | function I(a){var b=a.b,c=!1;a.d!==a.b.d&&(c=!0,G(a.d,a.b.d));a.c===a?F(...
  function K (line 31368) | function K(a){var b=B(a),c=b.b;H(b,a.e);b.a=a.b.a;C(c,b.a);b.d=c.d=a.d;b...
  function L (line 31368) | function L(a,b){var c=!1,d=B(a),e=d.b;b.d!==a.d&&(c=!0,G(b.d,a.d));H(d,a...
  function B (line 31368) | function B(a){var b=new M,c=new M,d=a.b.h;c.h=d;d.b.h=b;b.h=a;a.b.h=c;b....
  function H (line 31368) | function H(a,b){var c=a.c,d=b.c;c.b.e=b;d.b.e=a;a.c=d;b.c=c}
  function C (line 31369) | function C(a,b){var c=b.f,d=new N(b,c);c.e=d;b.f=d;c=d.c=a;do c.a=d,c=c....
  function D (line 31369) | function D(a,b){var c=b.d,d=new ga(b,c);c.b=d;b.d=d;d.a=a;d.c=b.c;c=a;do...
  function fa (line 31369) | function fa(a){var b=a.h;a=a.b.h;b.b.h=a;a.b.h=b}
  function F (line 31369) | function F(a,b){var c=a.c,d=c;do d.a=b,d=d.c;while(d!==c);c=a.f;d=a.e;d....
  function G (line 31369) | function G(a,b){var c=a.a,d=c;do d.d=b,d=d.e;while(d!==c);c=a.d;d=a.b;d....
  function ha (line 31369) | function ha(a){var b=0;Math.abs(a[1])>Math.abs(a[0])&&(b=1);Math.abs(a[2...
  function P (line 31369) | function P(a,b){a.f+=b.f;a.b.f+=b.b.f}
  function ia (line 31369) | function ia(a,b,c){a=a.a;b=b.a;c=c.a;if(b.b.a===a)return c.b.a===a?u(b.a...
  function Q (line 31369) | function Q(a){a.a.i=null;var b=a.e;b.a.c=b.c;b.c.a=b.a;a.e=null}
  function ja (line 31369) | function ja(a,b){I(a.a);a.c=!1;a.a=b;b.i=a}
  function ka (line 31369) | function ka(a){var b=a.a.a;do a=R(a);while(a.a.a===b);a.c&&(b=L(S(a).a.b...
  function la (line 31370) | function la(a,b,c){var d=new ma;d.a=c;d.e=na(a.f,b.e,d);return c.i=d}
  function oa (line 31370) | function oa(a,b){switch(a.s){case 100130:return 0!==(b&1);case 100131:re...
  function pa (line 31370) | function pa(a){var b=a.a,c=b.d;c.c=a.d;c.a=b;Q(a)}
  function T (line 31370) | function T(a,b,c){a=b;for(b=b.a;a!==c;){a.c=!1;var d=S(a),e=d.a;if(e.a!=...
  function U (line 31371) | function U(a,b,c,d,e,f){var g=!0;do la(a,b,c.b),c=c.c;while(c!==d);for(n...
  function sa (line 31371) | function sa(a,b,c,d,e){var f=[b.g[0],b.g[1],b.g[2]];b.d=null;b.d=a.o?a.o...
  function ta (line 31372) | function ta(a,b,c){var d=[null,null,null,null];d[0]=b.a.d;d[1]=c.a.d;sa(...
  function ua (line 31372) | function ua(a,b,c,d,e){var f=Math.abs(b.b-a.b)+Math.abs(b.a-a.a),g=Math....
  function qa (line 31373) | function qa(a,b){var c=S(b),d=b.a,e=c.a;if(u(d.a,e.a)){if(0<x(e.b.a,d.a,...
  function wa (line 31374) | function wa(a,b){var c=S(b),d=b.a,e=c.a,f=d.a,g=e.a,h=d.b.a,k=e.b.a,l=ne...
  function ra (line 31377) | function ra(a,b){for(var c=S(b);;){for(;c.b;)b=c,c=S(c);if(!b.b&&(c=b,b=...
  function ya (line 31379) | function ya(a,b){a.a=b;for(var c=b.c;null===c.i;)if(c=c.c,c===b.c){var c...
  function za (line 31380) | function za(a,b){var c=new ma,d=ea(a.b);d.a.b=O;d.a.a=b;d.b.a.b=-O;d.b.a...
  function Aa (line 31380) | function Aa(a){this.a=new Ba;this.b=a;this.c=ia}
  function na (line 31380) | function na(a,b,c){do b=b.c;while(null!==b.b&&!a.c(a.b,b.b,c));a=new Ba(...
  function Ba (line 31380) | function Ba(a,b,c){this.b=a||null;this.a=b||this;this.c=c||this}
  function X (line 31380) | function X(){this.d=Y;this.p=this.b=this.q=null;this.j=[0,0,0];this.s=10...
  function Z (line 31390) | function Z(a,b){if(a.d!==b)for(;a.d!==b;)if(a.d<b)switch(a.d){case Y:V(a...
  function V (line 31390) | function V(a,b){a.p&&a.p(b,a.c)}
  function ga (line 31390) | function ga(a,b){this.b=a||this;this.d=b||this;this.a=null;this.c=!1}
  function M (line 31390) | function M(){this.h=this;this.i=this.d=this.a=this.e=this.c=this.b=null;...
  function J (line 31390) | function J(a){return a.b.e}
  function Ca (line 31390) | function Ca(){this.c=new N;this.a=new ga;this.b=new M;this.d=new M;this....
  function N (line 31390) | function N(a,b){this.e=a||this;this.f=b||this;this.d=this.c=null;this.g=...
  function Da (line 31390) | function Da(){this.c=[];this.d=null;this.a=0;this.e=!1;this.b=new Ha}
  function Ea (line 31390) | function Ea(a){a.d=[];for(var b=0;b<a.a;b++)a.d[b]=b;a.d.sort(function(a...
  function xa (line 31390) | function xa(a,b){if(a.e){var c=a.b,d=++c.a;2*d>c.f&&(c.f*=2,c.c=Ja(c.c,c...
  function Fa (line 31391) | function Fa(a){if(0===a.a)return Ka(a.b);var b=a.c[a.d[a.a-1]];if(0!==a....
  function Ha (line 31391) | function Ha(){this.d=Ja([0],33);this.e=[null,null];this.c=[0,0];this.a=0...
  function Ja (line 31391) | function Ja(a,b){for(var c=Array(b),d=0;d<a.length;d++)c[d]=a[d];for(;d<...
  function Ia (line 31391) | function Ia(a){for(var b=a.a;1<=b;--b)W(a,b);a.h=!0}
  function Ga (line 31391) | function Ga(a){return a.e[a.d[1]]}
  function Ka (line 31391) | function Ka(a){var b=a.d,c=a.e,d=a.c,e=b[1],f=c[e];0<a.a&&(b[1]=b[a.a],d...
  function W (line 31392) | function W(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f<<1;h<a.a...
  function va (line 31392) | function va(a,b){for(var c=a.d,d=a.e,e=a.c,f=b,g=c[f];;){var h=f>>1,k=c[...
  function ma (line 31392) | function ma(){this.e=this.a=null;this.f=0;this.c=this.b=this.h=this.d=!1}
  function S (line 31392) | function S(a){return a.e.c.b}
  function R (line 31392) | function R(a){return a.e.a.b}
  function Tree (line 31465) | function Tree() {
  function Data (line 31470) | function Data(source, dest) {
  function tinf_build_bits_base (line 31514) | function tinf_build_bits_base(bits, base, delta, first) {
  function tinf_build_fixed_trees (line 31529) | function tinf_build_fixed_trees(lt, dt) {
  function tinf_build_tree (line 31555) | function tinf_build_tree(t, lengths, off, num) {
  function tinf_getbit (line 31583) | function tinf_getbit(d) {
  function tinf_read_bits (line 31599) | function tinf_read_bits(d, num, base) {
  function tinf_decode_symbol (line 31615) | function tinf_decode_symbol(d, t) {
  function tinf_decode_trees (line 31641) | function tinf_decode_trees(d, lt, dt) {
  function tinf_inflate_block_data (line 31707) | function tinf_inflate_block_data(d, lt, dt) {
  function tinf_inflate_uncompressed_block (line 31741) | function tinf_inflate_uncompressed_block(d) {
  function tinf_uncompress (line 31776) | function tinf_uncompress(source, dest) {
  function derive (line 31840) | function derive(v0, v1, v2, v3, t) {
  function BoundingBox (line 31856) | function BoundingBox() {
  function Path (line 32006) | function Path() {
  function floatToString (line 32239) | function floatToString(v) {
  function packValues (line 32247) | function packValues() {
  function fail (line 32323) | function fail(message) {
  function argument (line 32329) | function argument(predicate, message) {
  function constant (line 32358) | function constant(v) {
  function isByteEncodable (line 32911) | function isByteEncodable(value) {
  function encodeVarDeltaRunAsZeroes (line 32916) | function encodeVarDeltaRunAsZeroes(deltas, pos, result) {
  function encodeVarDeltaRunAsBytes (line 32928) | function encodeVarDeltaRunAsBytes(deltas, offset, result) {
  function encodeVarDeltaRunAsWords (line 32960) | function encodeVarDeltaRunAsWords(deltas, offset, result) {
  function Table (line 33311) | function Table(tableName, fields, options) {
  function ushortList (line 33352) | function ushortList(itemName, list, count) {
  function tableList (line 33367) | function tableList(itemName, records, itemCallback) {
  function recordList (line 33380) | function recordList(itemName, records, itemCallback) {
  function Coverage (line 33399) | function Coverage(coverageTable) {
  function ScriptList (line 33412) | function ScriptList(scriptListTable) {
  function FeatureList (line 33449) | function FeatureList(featureListTable) {
  function LookupList (line 33472) | function LookupList(lookupListTable, subtableMakers) {
  function getByte (line 33502) | function getByte(dataView, offset) {
  function getUShort (line 33508) | function getUShort(dataView, offset) {
  function getShort (line 33514) | function getShort(dataView, offset) {
  function getULong (line 33520) | function getULong(dataView, offset) {
  function getFixed (line 33526) | function getFixed(dataView, offset) {
  function getTag (line 33534) | function getTag(dataView, offset) {
  function getOffset (line 33545) | function getOffset(dataView, offset, offSize) {
  function getBytes (line 33556) | function getBytes(dataView, startOffset, endOffset) {
  function bytesToString (line 33566) | function bytesToString(bytes) {
  function Parser (line 33587) | function Parser(data, offset) {
  function parseCmapTableFormat12 (line 34142) | function parseCmapTableFormat12(cmap, p) {
  function parseCmapTableFormat4 (line 34166) | function parseCmapTableFormat4(cmap, p, data, start, offset) {
  function parseCmapTable (line 34218) | function parseCmapTable(data, start) {
  function addSegment (line 34256) | function addSegment(t, code, glyphIndex) {
  function addTerminatorSegment (line 34266) | function addTerminatorSegment(t) {
  function makeCmapTable (line 34276) | function makeCmapTable(glyphs) {
  function DefaultEncoding (line 34553) | function DefaultEncoding(font) {
  function CmapEncoding (line 34579) | function CmapEncoding(cmap) {
  function CffEncoding (line 34598) | function CffEncoding(encoding, charset) {
  function GlyphNames (line 34619) | function GlyphNames(post) {
  function addGlyphNames (line 34674) | function addGlyphNames(font) {
  function line (line 34703) | function line(ctx, x1, y1, x2, y2) {
  function getPathDefinition (line 34715) | function getPathDefinition(glyph, path) {
  function Glyph (line 34757) | function Glyph(options) {
  function drawCircles (line 34987) | function drawCircles(l, x, y, scale) {
  function defineDependentProperty (line 35074) | function defineDependentProperty(glyph, externalName, internalName) {
  function GlyphSet (line 35098) | function GlyphSet(font, glyphs) {
  function glyphLoader (line 35139) | function glyphLoader(font, index) {
  function ttfGlyphLoader (line 35156) | function ttfGlyphLoader(font, index, parseGlyph, data, position, buildPa...
  function cffGlyphLoader (line 35183) | function cffGlyphLoader(font, index, parseCFFCharstring, charstring) {
  function equals (line 35202) | function equals(a, b) {
  function calcCFFSubroutineBias (line 35224) | function calcCFFSubroutineBias(subrs) {
  function parseCFFIndex (line 35239) | function parseCFFIndex(data, start, conversionFn) {
  function parseFloatOperand (line 35273) | function parseFloatOperand(parser) {
  function parseOperand (line 35299) | function parseOperand(parser, b0) {
  function entriesToObject (line 35341) | function entriesToObject(entries) {
  function parseCFFDict (line 35365) | function parseCFFDict(data, start, size) {
  function getCFFString (line 35397) | function getCFFString(strings, index) {
  function interpretDict (line 35409) | function interpretDict(dict, meta, strings) {
  function parseCFFHeader (line 35449) | function parseCFFHeader(data, start) {
  function parseCFFTopDict (line 35506) | function parseCFFTopDict(data, strings) {
  function parseCFFPrivateDict (line 35512) | function parseCFFPrivateDict(data, start, size, strings) {
  function gatherCFFTopDicts (line 35532) | function gatherCFFTopDicts(data, start, cffIndex, strings) {
  function parseCFFCharset (line 35561) | function parseCFFCharset(data, start, nGlyphs, strings) {
  function parseCFFEncoding (line 35603) | function parseCFFEncoding(data, start, charset) {
  function parseCFFCharstring (line 35635) | function parseCFFCharstring(font, glyph, code) {
  function parseCFFFDSelect (line 36055) | function parseCFFFDSelect(data, start, nGlyphs, fdArrayCount) {
  function parseCFFTable (line 36101) | function parseCFFTable(data, start, font) {
  function encodeString (line 36184) | function encodeString(s, strings) {
  function makeHeader (line 36205) | function makeHeader() {
  function makeNameIndex (line 36214) | function makeNameIndex(fontNames) {
  function makeDict (line 36227) | function makeDict(meta, attrs, strings) {
  function makeTopDict (line 36245) | function makeTopDict(attrs, strings) {
  function makeTopDictIndex (line 36253) | function makeTopDictIndex(topDict) {
  function makeStringIndex (line 36261) | function makeStringIndex(strings) {
  function makeGlobalSubrIndex (line 36273) | function makeGlobalSubrIndex() {
  function makeCharsets (line 36280) | function makeCharsets(glyphNames, strings) {
  function glyphToOps (line 36293) | function glyphToOps(glyph) {
  function makeCharStringsIndex (line 36361) | function makeCharStringsIndex(glyphs) {
  function makePrivateDict (line 36375) | function makePrivateDict(attrs, strings) {
  function makeCFFTable (line 36383) | function makeCFFTable(glyphs, options) {
  function parseHeadTable (line 36461) | function parseHeadTable(data, start) {
  function makeHeadTable (line 36485) | function makeHeadTable(options) {
  function parseHheaTable (line 36520) | function parseHheaTable(data, start) {
  function makeHheaTable (line 36540) | function makeHheaTable(options) {
  function parseHmtxTable (line 36568) | function parseHmtxTable(data, start, numMetrics, numGlyphs, glyphs) {
  function makeHmtxTable (line 36585) | function makeHmtxTable(glyphs) {
  function makeLtagTable (line 36602) | function makeLtagTable(tags) {
  function parseLtagTable (line 36626) | function parseLtagTable(data, start) {
  function parseMaxpTable (line 36654) | function parseMaxpTable(data, start) {
  function makeMaxpTable (line 36678) | function makeMaxpTable(numGlyphs) {
  function getLanguageCode (line 37207) | function getLanguageCode(platformID, languageID, ltag) {
  function getEncoding (line 37288) | function getEncoding(platformID, encodingID, languageID) {
  function parseNameTable (line 37310) | function parseNameTable(data, start, ltag) {
  function reverseDict (line 37356) | function reverseDict(dict) {
  function makeNameRecord (line 37365) | function makeNameRecord(platformID, encodingID, languageID, nameID, leng...
  function findSubArray (line 37378) | function findSubArray(needle, haystack) {
  function addStringToPool (line 37398) | function addStringToPool(s, pool) {
  function makeNameTable (line 37413) | function makeNameTable(names, ltag) {
  function getUnicodeRange (line 37643) | function getUnicodeRange(unicode) {
  function parseOS2Table (line 37655) | function parseOS2Table(data, start) {
  function makeOS2Table (line 37708) | function makeOS2Table(options) {
  function parsePostTable (line 37764) | function parsePostTable(data, start) {
  function makePostTable (line 37808) | function makePostTable() {
  function parseGsubTable (line 38008) | function parseGsubTable(data, start) {
  function makeGsubTable (line 38076) | function makeGsubTable(gsub) {
  function parseMetaTable (line 38091) | function parseMetaTable(data, start) {
  function makeMetaTable (line 38111) | function makeMetaTable(tags) {
  function log2 (line 38141) | function log2(v) {
  function computeCheckSum (line 38145) | function computeCheckSum(bytes) {
  function makeTableRecord (line 38162) | function makeTableRecord(tag, checkSum, offset, length) {
  function makeSfntTable (line 38171) | function makeSfntTable(tables) {
  function metricsForChar (line 38227) | function metricsForChar(font, chars, notFoundMetrics) {
  function average (line 38239) | function average(vs) {
  function fontToSfntTable (line 38250) | function fontToSfntTable(font) {
  function searchTag (line 38460) | function searchTag(arr, tag) {
  function binSearch (line 38477) | function binSearch(arr, value) {
  function searchRange (line 38495) | function searchRange(ranges, value) {
  function Layout (line 38521) | function Layout(font, tableName) {
  function Position (line 38804) | function Position(font) {
  function Substitution (line 38879) | function Substitution(font) {
  function arraysEqual (line 38884) | function arraysEqual(ar1, ar2) {
  function getSubstFormat (line 38894) | function getSubstFormat(lookupTable, format, defaultSubtable) {
  function isBrowser (line 39175) | function isBrowser() {
  function nodeBufferToArrayBuffer (line 39179) | function nodeBufferToArrayBuffer(buffer) {
  function arrayBufferToNodeBuffer (line 39189) | function arrayBufferToNodeBuffer(ab) {
  function checkArgument (line 39199) | function checkArgument(expression, message) {
  function parseGlyphCoordinate (line 39208) | function parseGlyphCoordinate(p, flag, previousValue, shortVectorBitMask...
  function parseGlyph (line 39234) | function parseGlyph(glyph, data, start) {
  function transformPoints (line 39379) | function transformPoints(points, transform) {
  function getContours (line 39395) | function getContours(points) {
  function getPath (line 39412) | function getPath(points) {
  function buildPath (line 39468) | function buildPath(glyphs, glyph) {
  function parseGlyfTable (line 39507) | function parseGlyfTable(data, start, loca, font) {
  function Hinting (line 39565) | function Hinting(font) {
  function roundOff (line 39591) | function roundOff(v) {
  function roundToGrid (line 39598) | function roundToGrid(v) {
  function roundToDoubleGrid (line 39606) | function roundToDoubleGrid(v) {
  function roundToHalfGrid (line 39613) | function roundToHalfGrid(v) {
  function roundUpToGrid (line 39620) | function roundUpToGrid(v) {
  function roundDownToGrid (line 39627) | function roundDownToGrid(v) {
  function UnitVector (line 39883) | function UnitVector(x, y) {
  function getUnitVector (line 39976) | function getUnitVector(x, y) {
  function HPoint (line 39990) | function HPoint(
  function State (line 40063) | function State(env, prog) {
  function initTZone (line 40417) | function initTZone(state)
  function skip (line 40432) | function skip(state, handleElse)
  function SVTCA (line 40466) | function SVTCA(v, state) {
  function SPVTCA (line 40474) | function SPVTCA(v, state) {
  function SFVTCA (line 40482) | function SFVTCA(v, state) {
  function SPVTL (line 40490) | function SPVTL(a, state) {
  function SFVTL (line 40515) | function SFVTL(a, state) {
  function SPVFS (line 40540) | function SPVFS(state) {
  function SFVFS (line 40552) | function SFVFS(state) {
  function GPV (line 40564) | function GPV(state) {
  function GFV (line 40576) | function GFV(state) {
  function SFVTPV (line 40588) | function SFVTPV(state) {
  function ISECT (line 40596) | function ISECT(state)
  function SRP0 (line 40636) | function SRP0(state) {
  function SRP1 (line 40644) | function SRP1(state) {
  function SRP2 (line 40652) | function SRP2(state) {
  function SZP0 (line 40660) | function SZP0(state) {
  function SZP1 (line 40682) | function SZP1(state) {
  function SZP2 (line 40704) | function SZP2(state) {
  function SZPS (line 40726) | function SZPS(state) {
  function SLOOP (line 40748) | function SLOOP(state) {
  function RTG (line 40756) | function RTG(state) {
  function RTHG (line 40764) | function RTHG(state) {
  function SMD (line 40772) | function SMD(state) {
  function ELSE (line 40782) | function ELSE(state) {
  function JMPR (line 40796) | function JMPR(state) {
  function SCVTCI (line 40807) | function SCVTCI(state) {
  function DUP (line 40817) | function DUP(state) {
  function POP (line 40827) | function POP(state) {
  function CLEAR (line 40835) | function CLEAR(state) {
  function SWAP (line 40843) | function SWAP(state) {
  function DEPTH (line 40857) | function DEPTH(state) {
  function LOOPCALL (line 40867) | function LOOPCALL(state) {
  function CALL (line 40898) | function CALL(state) {
  function CINDEX (line 40921) | function CINDEX(state) {
  function MINDEX (line 40934) | function MINDEX(state) {
  function FDEF (line 40945) | function FDEF(state) {
  function MDAP (line 40964) | function MDAP(round, state) {
  function IUP (line 40984) | function IUP(v, state) {
  function SHP (line 41019) | function SHP(a, state) {
  function SHC (line 41054) | function SHC(a, state) {
  function SHZ (line 41076) | function SHZ(a, state) {
  function SHPIX (line 41107) | function SHPIX(state) {
  function IP (line 41135) | function IP(state) {
  function MSIRP (line 41168) | function MSIRP(a, state) {
  function ALIGNRP (line 41189) | function ALIGNRP(state) {
  function RTDG (line 41219) | function RTDG(state) {
  function MIAP (line 41227) | function MIAP(round, state) {
  function NPUSHB (line 41266) | function NPUSHB(state) {
  function NPUSHW (line 41282) | function NPUSHW(state) {
  function WS (line 41301) | function WS(state) {
  function RS (line 41317) | function RS(state) {
  function WCVTP (line 41332) | function WCVTP(state) {
  function RCVT (line 41345) | function RCVT(state) {
  function GC (line 41356) | function GC(a, state) {
  function MD (line 41368) | function MD(a, state) {
  function MPPEM (line 41383) | function MPPEM(state) {
  function FLIPON (line 41390) | function FLIPON(state) {
  function LT (line 41397) | function LT(state) {
  function LTEQ (line 41409) | function LTEQ(state) {
  function GT (line 41421) | function GT(state) {
  function GTEQ (line 41433) | function GTEQ(state) {
  function EQ (line 41445) | function EQ(state) {
  function NEQ (line 41457) | function NEQ(state) {
  function ODD (line 41469) | function ODD(state) {
  function EVEN (line 41480) | function EVEN(state) {
  function IF (line 41491) | function IF(state) {
  function EIF (line 41507) | function EIF(state) {
  function AND (line 41517) | function AND(state) {
  function OR (line 41529) | function OR(state) {
  function NOT (line 41541) | function NOT(state) {
  function DELTAP123 (line 41554) | function DELTAP123(b, state) {
  function SDB (line 41583) | function SDB(state) {
  function SDS (line 41594) | function SDS(state) {
  function ADD (line 41605) | function ADD(state) {
  function SUB (line 41617) | function SUB(state) {
  function DIV (line 41629) | function DIV(state) {
  function MUL (line 41641) | function MUL(state) {
  function ABS (line 41653) | function ABS(state) {
  function NEG (line 41664) | function NEG(state) {
  function FLOOR (line 41675) | function FLOOR(state) {
  function CEILING (line 41686) | function CEILING(state) {
  function ROUND (line 41697) | function ROUND(dt, state) {
  function WCVTF (line 41708) | function WCVTF(state) {
  function DELTAC123 (line 41722) | function DELTAC123(b, state) {
  function SROUND (line 41750) | function SROUND(state) {
  function S45ROUND (line 41799) | function S45ROUND(state) {
  function ROFF (line 41849) | function ROFF(state) {
  function RUTG (line 41857) | function RUTG(state) {
  function RDTG (line 41865) | function RDTG(state) {
  function SCANCTRL (line 41873) | function SCANCTRL(state) {
  function SDPVTL (line 41883) | function SDPVTL(a, state) {
  function GETINFO (line 41908) | function GETINFO(state) {
  function ROLL (line 41929) | function ROLL(state) {
  function MAX (line 41944) | function MAX(state) {
  function MIN (line 41956) | function MIN(state) {
  function SCANTYPE (line 41968) | function SCANTYPE(state) {
  function INSTCTRL (line 41976) | function INSTCTRL(state) {
  function PUSHB (line 41991) | function PUSHB(n, state) {
  function PUSHW (line 42005) | function PUSHW(n, state) {
  function MDRP_MIRP (line 42031) | function MDRP_MIRP(indirect, setRp0, keepD, ro, dt, state) {
  function Font (line 42624) | function Font(options) {
  function assert (line 43017) | function assert(predicate, message) {
  function assertNamePresent (line 43020) | function assertNamePresent(name) {
  function addName (line 43150) | function addName(name, names) {
  function makeFvarAxis (line 43172) | function makeFvarAxis(n, axis, names) {
  function parseFvarAxis (line 43184) | function parseFvarAxis(data, start, names) {
  function makeFvarInstance (line 43196) | function makeFvarInstance(n, inst, axes, names) {
  function parseFvarInstance (line 43215) | function parseFvarInstance(data, start, axes, names) {
  function makeFvarTable (line 43229) | function makeFvarTable(fvar, names) {
  function parseFvarTable (line 43252) | function parseFvarTable(data, start, names) {
  function parseGposTable (line 43362) | function parseGposTable(data, start) {
  function makeGposTable (line 43391) | function makeGposTable(gpos) {
  function parseWindowsKernTable (line 43404) | function parseWindowsKernTable(p) {
  function parseMacKernTable (line 43424) | function parseMacKernTable(p) {
  function parseKernTable (line 43453) | function parseKernTable(data, start) {
  function parseLocaTable (line 43475) | function parseLocaTable(data, start, numGlyphs, shortVersion) {
  function loadFromFile (line 43510) | function loadFromFile(path, callback) {
  function loadFromUrl (line 43526) | function loadFromUrl(url, callback) {
  function parseOpenTypeTableEntries (line 43552) | function parseOpenTypeTableEntries(data, numTables) {
  function parseWOFFTableEntries (line 43573) | function parseWOFFTableEntries(data, numTables) {
  function uncompressTable (line 43608) | function uncompressTable(data, tableEntry) {
  function parseBuffer (line 43632) | function parseBuffer(buffer) {
  function load (line 43834) | function load(url, callback) {
  function loadSync (line 43858) | function loadSync(url) {
  function defaultSetTimout (line 43891) | function defaultSetTimout() {
  function defaultClearTimeout (line 43894) | function defaultClearTimeout () {
  function runTimeout (line 43917) | function runTimeout(fun) {
  function runClearTimeout (line 43942) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 43974) | function cleanUpNextTick() {
  function drainQueue (line 43989) | function drainQueue() {
  function Item (line 44027) | function Item(fun, array) {
  function noop (line 44041) | function noop() {}
  function normalizeName (line 44110) | function normalizeName(name) {
  function normalizeValue (line 44120) | function normalizeValue(value) {
  function iteratorFor (line 44128) | function iteratorFor(items) {
  function Headers (line 44145) | function Headers(headers) {
  function consumed (line 44217) | function consumed(body) {
  function fileReaderReady (line 44224) | function fileReaderReady(reader) {
  function readBlobAsArrayBuffer (line 44235) | function readBlobAsArrayBuffer(blob) {
  function readBlobAsText (line 44242) | function readBlobAsText(blob) {
  function readArrayBufferAsText (line 44249) | function readArrayBufferAsText(buf) {
  function bufferClone (line 44259) | function bufferClone(buf) {
  function Body (line 44269) | function Body() {
  function normalizeMethod (line 44365) | function normalizeMethod(method) {
  function Request (line 44370) | function Request(input, options) {
  function decode (line 44411) | function decode(body) {
  function parseHeaders (line 44424) | function parseHeaders(rawHeaders) {
  function Response (line 44442) | function Response(bodyInit, options) {
  function getWindowWidth (line 48277) | function getWindowWidth() {
  function getWindowHeight (line 48286) | function getWindowHeight() {
  function launchFullscreen (line 48450) | function launchFullscreen(element) {
  function exitFullscreen (line 48470) | function exitFullscreen() {
  function formatType (line 49084) | function formatType() {
  function calculateOffset (line 51656) | function calculateOffset(object) {
  function getMousePos (line 58982) | function getMousePos(canvas, w, h, evt) {
  function getTouchInfo (line 59574) | function getTouchInfo(canvas, w, h, e, i) {
  function buildBlurKernel (line 60303) | function buildBlurKernel(r) {
  function blurARGB (line 60338) | function blurARGB(canvas, radius) {
  function _sAssign (line 60867) | function _sAssign(sVal, iVal) {
  function makeObject (line 63377) | function makeObject(row, headers) {
  function escapeHelper (line 64426) | function escapeHelper(content) {
  function _checkFileExtension (line 64640) | function _checkFileExtension(filename, extension) {
  function destroyClickedElement (line 64682) | function destroyClickedElement(event) {
  function elementsToP5XML (line 66693) | function elementsToP5XML(elements) {
  function hypot (line 68056) | function hypot(x, y, z) {
  function isSpace (line 71672) | function isSpace(i) {
  function pathToPoints (line 71930) | function pathToPoints(cmds, options) {
  function simplify (line 71951) | function simplify(pts, angle) {
  function splitPaths (line 71965) | function splitPaths(cmds) {
  function cmdToArr (line 71982) | function cmdToArr(cmd) {
  function parseOpts (line 71996) | function parseOpts(options, defaults) {
  function at (line 72011) | function at(v, i) {
  function collinear (line 72016) | function collinear(a, b, c, thresholdAngle) {
  function areaTriangle (line 72041) | function areaTriangle(a, b, c) {
  function findDotsAtSegment (line 72047) | function findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) {
  function getPointAtSegmentLength (line 72080) | function getPointAtSegmentLength(
  function pointAtLength (line 72106) | function pointAtLength(path, length, istotal) {
  function pathToAbsolute (line 72158) | function pathToAbsolute(pathArray) {
  function path2curve (line 72257) | function path2curve(path, path2) {
  function a2c (line 72413) | function a2c(x1, y1, rx, ry, angle, lac, sweep_flag, x2, y2, recursive) {
  function catmullRom2bezier (line 72530) | function catmullRom2bezier(crp, z) {
  function l2c (line 72596) | function l2c(x1, y1, x2, y2) {
  function q2c (line 72600) | function q2c(x1, y1, ax, ay, x2, y2) {
  function bezlen (line 72613) | function bezlen(x1, y1, x2, y2, x3, y3, x4, y4, z) {
  function getTatLen (line 72661) | function getTatLen(x1, y1, x2, y2, x3, y3, x4, y4, ll) {
  function base3 (line 72679) | function base3(t, p1, p2, p3, p4) {
  function cacheKey (line 72685) | function cacheKey() {
  function doNf (line 73591) | function doNf(num, left, right) {
  function doNfc (line 73679) | function doNfc(num, right) {
  function addNfp (line 73759) | function addNfp(num) {
  function addNfs (line 73837) | function addNfs(num) {
  function parseObj (line 76762) | function parseObj(model, lines) {
  function vertexCallback (line 81879) | function vertexCallback(data, polyVertArray) {
  function begincallback (line 81885) | function begincallback(type) {
  function errorcallback (line 81891) | function errorcallback(errno) {
  function combinecallback (line 81896) | function combinecallback(coords, data, weight) {
  function edgeCallback (line 81900) | function edgeCallback(flag) {
  function ImageInfos (line 82816) | function ImageInfos(width, height) {
  function setPixel (line 82894) | function setPixel(imageInfo, r, g, b, a) {
  function push (line 82968) | function push(xs, ys, v) {
  function clamp (line 83010) | function clamp(v, min, max) {
  function byte (line 83022) | function byte(v) {
  function Cubic (line 83036) | function Cubic(p0, c0, c1, p1) {
  function cubicToQuadratics (line 83169) | function cubicToQuadratics(x0, y0, cx0, cy0, cx1, cy1, x1, y1) {
  function pushLine (line 83233) | function pushLine(x0, y0, x1, y1) {
  function samePoint (line 83249) | function samePoint(x0, y0, x1, y1) {
  function layout (line 83325) | function layout(dim, dimImageInfos, cellImageInfos) {

FILE: 07_time_and_interactivity/07_smoothing/smoothing_javascript/sketch.js
  function setup (line 4) | function setup() {
  function mousePressed (line 10) | function mousePressed() {
  function draw (line 18) | function draw() {

FILE: 08_typography/01_ransom_letter/ransom_letter_js/ransom_letter_js.js
  function setup (line 3) | function setup() {
  function draw (line 14) | function draw() {
  function keyTyped (line 41) | function keyTyped() {

FILE: 08_typography/02_one_line_typewriter/one_line_typewriter_js/one_line_typewriter_js.js
  function setup (line 4) | function setup() {
  function draw (line 10) | function draw() {
  function keyPressed (line 28) | function keyPressed() {

FILE: 08_typography/03_dynamic_text/dynamic_text_js/dynamic_text_js.js
  function setup (line 7) | function setup() {
  function draw (line 16) | function draw() {
  function drawWord (line 41) | function drawWord() {
  function keyTyped (line 51) | function keyTyped() {

FILE: 08_typography/04_responsive_text/responsive_text_js/responsive_text_js.js
  function setup (line 11) | function setup() {
  function draw (line 24) | function draw() {
  function keyPressed (line 71) | function keyPressed() {

FILE: 08_typography/05_scrolling_headlines/scrolling_headlines_js/scrolling_headlines_js.js
  function setup (line 4) | function setup() {
  function draw (line 10) | function draw() {
  function keyTyped (line 30) | function keyTyped() {

FILE: 08_typography/06_split_flap_type/split_flap_type_js/split_flap_type_js.js
  function setup (line 14) | function setup() {
  function draw (line 31) | function draw() {
  function drawCurrentWord (line 67) | function drawCurrentWord(tx, ty){
  function keyTyped (line 92) | function keyTyped() {

FILE: 08_typography/07_word_finder/word_finder_js/word_finder_js.js
  function setup (line 19) | function setup() {
  function draw (line 25) | function draw() {
  function keyTyped (line 66) | function keyTyped() {

FILE: 08_typography/08_letterform_collage_tool/letterform_collage_tool_js/letterform_collage_tool_js.js
  function setup (line 8) | function setup() {
  function draw (line 20) | function draw() {
  function mouseReleased (line 29) | function mouseReleased() {
  function keyTyped (line 36) | function keyTyped() {

FILE: 08_typography/09_procrustean_typography/procrustean_typography_js/procrustean_typography_js.js
  function setup (line 4) | function setup() {
  function draw (line 13) | function draw() {

FILE: 08_typography/10_text_along_a_curve/text_along_a_curve_js/text_along_a_curve_js.js
  function setup (line 10) | function setup() {
  function draw (line 27) | function draw() {
  function keyTyped (line 82) | function keyTyped() {

FILE: 08_typography/11_glyph_hacking/glyph_hacking_js/glyph_hacking_js.js
  function getPoints (line 15) | function getPoints(){
  function setup (line 27) | function setup() {
  function draw (line 38) | function draw() {
  function keyTyped (line 96) | function keyTyped() {

FILE: 08_typography/11_glyph_hacking/glyph_hacking_js/libraries/rune.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function rgb2hsl (line 62) | function rgb2hsl(rgb) {
  function rgb2hsv (line 97) | function rgb2hsv(rgb) {
  function rgb2hwb (line 130) | function rgb2hwb(rgb) {
  function rgb2cmyk (line 141) | function rgb2cmyk(rgb) {
  function rgb2keyword (line 154) | function rgb2keyword(rgb) {
  function rgb2xyz (line 158) | function rgb2xyz(rgb) {
  function rgb2lab (line 175) | function rgb2lab(rgb) {
  function rgb2lch (line 197) | function rgb2lch(args) {
  function hsl2rgb (line 201) | function hsl2rgb(hsl) {
  function hsl2hsv (line 239) | function hsl2hsv(hsl) {
  function hsl2hwb (line 258) | function hsl2hwb(args) {
  function hsl2cmyk (line 262) | function hsl2cmyk(args) {
  function hsl2keyword (line 266) | function hsl2keyword(args) {
  function hsv2rgb (line 271) | function hsv2rgb(hsv) {
  function hsv2hsl (line 299) | function hsv2hsl(hsv) {
  function hsv2hwb (line 313) | function hsv2hwb(args) {
  function hsv2cmyk (line 317) | function hsv2cmyk(args) {
  function hsv2keyword (line 321) | function hsv2keyword(args) {
  function hwb2rgb (line 326) | function hwb2rgb(hwb) {
  function hwb2hsl (line 361) | function hwb2hsl(args) {
  function hwb2hsv (line 365) | function hwb2hsv(args) {
  function hwb2cmyk (line 369) | function hwb2cmyk(args) {
  function hwb2keyword (line 373) | function hwb2keyword(args) {
  function cmyk2rgb (line 377) | function cmyk2rgb(cmyk) {
  function cmyk2hsl (line 390) | function cmyk2hsl(args) {
  function cmyk2hsv (line 394) | function cmyk2hsv(args) {
  function cmyk2hwb (line 398) | function cmyk2hwb(args) {
  function cmyk2keyword (line 402) | function cmyk2keyword(args) {
  function xyz2rgb (line 407) | function xyz2rgb(xyz) {
  function xyz2lab (line 434) | function xyz2lab(xyz) {
  function xyz2lch (line 455) | function xyz2lch(args) {
  function lab2xyz (line 459) | function lab2xyz(lab) {
  function lab2lch (line 480) | function lab2lch(lab) {
  function lab2rgb (line 495) | function lab2rgb(args) {
  function lch2lab (line 499) | function lch2lab(lch) {
  function lch2xyz (line 511) | function lch2xyz(args) {
  function lch2rgb (line 515) | function lch2rgb(args) {
  function keyword2rgb (line 519) | function keyword2rgb(keyword) {
  function keyword2hsl (line 523) | function keyword2hsl(args) {
  function keyword2hsv (line 527) | function keyword2hsv(args) {
  function keyword2hwb (line 531) | function keyword2hwb(args) {
  function keyword2cmyk (line 535) | function keyword2cmyk(args) {
  function keyword2lab (line 539) | function keyword2lab(args) {
  function keyword2xyz (line 543) | function keyword2xyz(args) {
  function flatten (line 820) | function flatten(array, isDeep, guard) {
  function last (line 844) | function last(array) {
  function map (line 984) | function map(collection, iteratee, thisArg) {
  function restParam (line 1021) | function restParam(func, start) {
  function SetCache (line 1070) | function SetCache(values) {
  function arrayEach (line 1095) | function arrayEach(array, iteratee) {
  function arrayMap (line 1119) | function arrayMap(array, iteratee) {
  function arrayPush (line 1141) | function arrayPush(array, values) {
  function arraySome (line 1165) | function arraySome(array, predicate) {
  function assignDefaults (line 1188) | function assignDefaults(objectValue, sourceValue) {
  function assignWith (line 1208) | function assignWith(object, source, customizer) {
  function baseAssign (line 1241) | function baseAssign(object, source) {
  function baseCallback (line 1266) | function baseCallback(func, thisArg, argCount) {
  function baseCopy (line 1296) | function baseCopy(source, props, object) {
  function baseDifference (line 1328) | function baseDifference(array, values) {
  function baseFlatten (line 1403) | function baseFlatten(array, isDeep, isStrict, result) {
  function baseForOwn (line 1460) | function baseForOwn(object, iteratee) {
  function baseGet (line 1479) | function baseGet(object, path, pathKey) {
  function baseIndexOf (line 1509) | function baseIndexOf(array, value, fromIndex) {
  function baseIsEqual (line 1544) | function baseIsEqual(value, other, customizer, isLoose, stackA, stackB) {
  function baseIsEqualDeep (line 1595) | function baseIsEqualDeep(object, other, equalFunc, customizer, isLoose, ...
  function baseIsMatch (line 1674) | function baseIsMatch(object, matchData, customizer) {
  function baseMap (line 1727) | function baseMap(collection, iteratee) {
  function baseMatches (line 1751) | function baseMatches(source) {
  function baseMatchesProperty (line 1790) | function baseMatchesProperty(path, srcValue) {
  function baseProperty (line 1826) | function baseProperty(key) {
  function basePropertyDeep (line 1845) | function basePropertyDeep(path) {
  function baseSlice (line 1865) | function baseSlice(array, start, end) {
  function baseToString (line 1898) | function baseToString(value) {
  function bindCallback (line 1917) | function bindCallback(func, thisArg, argCount) {
  function cacheIndexOf (line 1957) | function cacheIndexOf(cache, value) {
  function cachePush (line 1977) | function cachePush(value) {
  function createAssigner (line 2000) | function createAssigner(assigner) {
  function createBaseEach (line 2044) | function createBaseEach(eachFunc, fromRight) {
  function createBaseFor (line 2074) | function createBaseFor(fromRight) {
  function createCache (line 2111) | function createCache(values) {
  function createDefaults (line 2129) | function createDefaults(assigner, customizer) {
  function createForEach (line 2154) | function createForEach(arrayFunc, eachFunc) {
  function equalArrays (line 2181) | function equalArrays(array, other, equalFunc, customizer, isLoose, stack...
  function equalByTag (line 2239) | function equalByTag(object, other, tag) {
  function equalObjects (line 2290) | function equalObjects(object, other, equalFunc, customizer, isLoose, sta...
  function getMatchData (line 2364) | function getMatchData(object) {
  function getNative (line 2387) | function getNative(object, key) {
  function indexOfNaN (line 2404) | function indexOfNaN(array, fromIndex, fromRight) {
  function isArrayLike (line 2430) | function isArrayLike(value) {
  function isIndex (line 2454) | function isIndex(value, length) {
  function isIterateeCall (line 2476) | function isIterateeCall(value, index, object) {
  function isKey (line 2508) | function isKey(value, object) {
  function isLength (line 2538) | function isLength(value) {
  function isObjectLike (line 2552) | function isObjectLike(value) {
  function isStrictComparable (line 2569) | function isStrictComparable(value) {
  function shimKeys (line 2596) | function shimKeys(object) {
  function toObject (line 2628) | function toObject(value) {
  function toPath (line 2651) | function toPath(value) {
  function isArguments (line 2693) | function isArguments(value) {
  function isFunction (line 2773) | function isFunction(value) {
  function isNative (line 2820) | function isNative(value) {
  function isObject (line 2853) | function isObject(value) {
  function isTypedArray (line 2932) | function isTypedArray(value) {
  function keysIn (line 3092) | function keysIn(object) {
  function pairs (line 3141) | function pairs(object) {
  function identity (line 3174) | function identity(value) {
  function property (line 3207) | function property(path) {
  function EvStore (line 3348) | function EvStore(elem) {
  function Individual (line 3370) | function Individual(key, value) {
  function OneVersion (line 3388) | function OneVersion(moduleName, version, defaultValue) {
  function isArray (line 3437) | function isArray(obj) {
  function applyProperties (line 3452) | function applyProperties(node, props, previous) {
  function removeProperty (line 3475) | function removeProperty(node, propName, propValue, previous) {
  function patchObject (line 3499) | function patchObject(node, props, previous, propName, propValue) {
  function getPrototype (line 3535) | function getPrototype(value) {
  function createElement (line 3557) | function createElement(vnode, opts) {
  function domIndex (line 3604) | function domIndex(rootNode, tree, indices, nodes) {
  function recurse (line 3613) | function recurse(rootNode, tree, indices, nodes, rootIndex) {
  function indexInRange (line 3648) | function indexInRange(indices, left, right) {
  function ascending (line 3676) | function ascending(a, b) {
  function applyPatch (line 3690) | function applyPatch(vpatch, domNode, renderOptions) {
  function removeNode (line 3720) | function removeNode(domNode, vNode) {
  function insertNode (line 3732) | function insertNode(parentNode, vNode, renderOptions) {
  function stringPatch (line 3742) | function stringPatch(domNode, leftVNode, vText, renderOptions) {
  function widgetPatch (line 3760) | function widgetPatch(domNode, leftVNode, widget, renderOptions) {
  function vNodePatch (line 3783) | function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
  function destroyWidget (line 3794) | function destroyWidget(domNode, w) {
  function reorderChildren (line 3800) | function reorderChildren(domNode, moves) {
  function replaceRoot (line 3825) | function replaceRoot(oldRoot, newRoot) {
  function patch (line 3842) | function patch(rootNode, patches, renderOptions) {
  function patchRecursive (line 3852) | function patchRecursive(rootNode, patches, renderOptions) {
  function applyPatch (line 3877) | function applyPatch(rootNode, domNode, patchList, renderOptions) {
  function patchIndices (line 3903) | function patchIndices(patches) {
  function updateWidget (line 3920) | function updateWidget(a, b) {
  function AttributeHook (line 3937) | function AttributeHook(namespace, value) {
  function EvHook (line 3976) | function EvHook(value) {
  function SoftSetHook (line 4003) | function SoftSetHook(value) {
  function h (line 4036) | function h(tagName, properties, children) {
  function addChild (line 4080) | function addChild(c, childNodes, tag, props) {
  function transformProperties (line 4104) | function transformProperties(props) {
  function isChild (line 4121) | function isChild(x) {
  function isChildren (line 4125) | function isChildren(x) {
  function UnexpectedVirtualElement (line 4129) | function UnexpectedVirtualElement(data) {
  function errorString (line 4148) | function errorString(obj) {
  function parseTag (line 4166) | function parseTag(tag, props) {
  function SVGAttributeNamespace (line 4521) | function SVGAttributeNamespace(value) {
  function svg (line 4542) | function svg(tagName, properties, children) {
  function isChildren (line 4587) | function isChildren(x) {
  function handleThunk (line 4599) | function handleThunk(a, b) {
  function renderThunk (line 4617) | function renderThunk(thunk, previous) {
  function isThunk (line 4636) | function isThunk(t) {
  function isHook (line 4643) | function isHook(hook) {
  function isVirtualNode (line 4654) | function isVirtualNode(x) {
  function isVirtualText (line 4663) | function isVirtualText(x) {
  function isWidget (l
Copy disabled (too large) Download .json
Condensed preview — 1042 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (55,488K chars).
[
  {
    "path": "01_graphic_elements/01_one_with_everything/one_with_everything_java/one_with_everything_java.pde",
    "chars": 2158,
    "preview": "float offset;\nfloat x;\n\nvoid setup() {\n  size(800, 800);\n  noLoop(); \n  \n  offset = width/10;\n  x = offset * 2;\n}\n\nvoid "
  },
  {
    "path": "01_graphic_elements/02_quadrilateral_zoo/quadrilateral_zoo_java/quadrilateral_zoo_java.pde",
    "chars": 1268,
    "preview": "float offset;\nfloat x;\n\nvoid setup() {\n  size(800, 800);\n  offset = width/10;\n  x = offset * 2;\n}\n\nvoid draw() {\n  backg"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_java/initials_java.pde",
    "chars": 542,
    "preview": "\n\nvoid setup() {\n  size(800, 800);\n  background(253);\n  smooth();\n  \n  fill(0); \n  stroke(0);\n  strokeWeight(5);\n  strok"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_javascript/index.html",
    "chars": 491,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\">\n    <title>initials_javascript</title>\n    <script src=\"libra"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_javascript/libraries/p5.dom.js",
    "chars": 67370,
    "preview": "/*! p5.dom.js v0.2.13 Oct 1, 2016 */\n/**\n * <p>The web is much more than just canvas and p5.dom makes it easy to interac"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_javascript/libraries/p5.js",
    "chars": 954100,
    "preview": "/*! p5.js v0.5.4 October 01, 2016 */\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.expo"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_javascript/libraries/p5.sound.js",
    "chars": 315502,
    "preview": "/*! p5.sound.js v0.3.1 2016-09-29 */\n(function (root, factory) {\n  if (typeof define === 'function' && define.amd)\n    d"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_javascript/sketch.js",
    "chars": 640,
    "preview": "//Drawing the initials 'TB'\r\n\r\nfunction setup(){\r\n  createCanvas(300,300);\r\n  background(0);\r\n  smooth();\r\n  stroke(255)"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_python/initials_python.pyde",
    "chars": 663,
    "preview": "#Drawing the initials 'TB'\r\n\r\ndef setup():\r\n  size(300,300) \r\n  background(0) \r\n  smooth() \r\n  stroke(255) \r\n  strokeWei"
  },
  {
    "path": "01_graphic_elements/03_initials/initials_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "01_graphic_elements/04_braille_tool/braille_tool_java/braille_tool_java.pde",
    "chars": 2659,
    "preview": "int A = 0b000001;\nint B = 0b000011;\nint C = 0b001001;\nint D = 0b011001;\nint E = 0b010001; \nint F = 0b001011; \nint G = 0b"
  },
  {
    "path": "01_graphic_elements/05_mondrian/mondrian_java/mondrian_java.pde",
    "chars": 1175,
    "preview": "// Composition C (No.III) with Red, Yellow and Blue\n// https://www.wikiart.org/en/piet-mondrian/composition-c-no-iii-wit"
  },
  {
    "path": "01_graphic_elements/08_kaleidoscope/kaleidoscope_java/kaleidoscope_java.pde",
    "chars": 1933,
    "preview": "float side;\n\nvoid setup() {\n  size(800, 800, FX2D);\n  side = 200;\n  // noLoop();\n}\n\nvoid draw() {\n  background(253);\n\n  "
  },
  {
    "path": "02_iteration/01_simple_iteration_seven_circles/simple_iteration_java/simple_iteration_java.pde",
    "chars": 442,
    "preview": "// Simple iteration. \n// Uses introductory \"immediate mode\"\n// With no setup() or draw() functions. \n\nsize(800, 800, FX2"
  },
  {
    "path": "02_iteration/01_simple_iteration_seven_circles/simple_iteration_js/index.html",
    "chars": 614,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/01_simple_iteration_seven_circles/simple_iteration_js/simple_iteration_js.js",
    "chars": 328,
    "preview": "\nfunction setup(){\n  createCanvas(800, 800);\n  background (253); \n  fill(229); \n  \n  strokeWeight(8); \n  y = height * (1"
  },
  {
    "path": "02_iteration/01_simple_iteration_seven_circles/simple_iteration_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/01_simple_iteration_seven_circles/simple_iteration_python/simple_iteration_python.pyde",
    "chars": 328,
    "preview": "# Simple iteration. \n# Uses introductory \"immediate mode\"\n# With no setup() or draw() functions. \n\nsize(800, 800)\nbackgr"
  },
  {
    "path": "02_iteration/01_simple_iteration_seven_circles/simple_iteration_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/02_transitioning_rectangles/transitioning_rectangles_java/transitioning_rectangles_java.pde",
    "chars": 810,
    "preview": "// Rectangle Sequence \n\nvoid setup() {\n  size(800, 800, FX2D);\n  noLoop();\n}\n\nvoid draw() {\n  background (253); \n  strok"
  },
  {
    "path": "02_iteration/02_transitioning_rectangles/transitioning_rectangles_js/index.html",
    "chars": 622,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/02_transitioning_rectangles/transitioning_rectangles_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/02_transitioning_rectangles/transitioning_rectangles_js/transitioning_rectangles_js.js",
    "chars": 549,
    "preview": "function setup() {\n  createCanvas(800, 800);\n  noSmooth();\n}\n\nfunction draw() {\n  background(253);\n  strokeWeight(2);\n\n "
  },
  {
    "path": "02_iteration/02_transitioning_rectangles/transitioning_rectangles_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/02_transitioning_rectangles/transitioning_rectangles_python/transitioning_rectangles_python.pyde",
    "chars": 525,
    "preview": "\ndef setup() :\n  size(800, 800) \n  noSmooth()\n\n\ndef draw() :\n  background (253) \n  strokeWeight(2)\n  \n  nRectangles = 14"
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_java/simple/string_art_simple_java.pde",
    "chars": 431,
    "preview": "void setup() {\n  size(400, 400); \n  smooth();\n}\n\nvoid draw() {\n  background (255); \n  stroke(0); \n  strokeWeight (1.5); "
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_java/string_art_challenge_java.pde",
    "chars": 739,
    "preview": "void setup() {\n  size(800, 800, FX2D); \n  smooth();\n}\n\nvoid draw() {\n  background (253); \n  strokeWeight(8); \n  strokeCa"
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_js/index.html",
    "chars": 618,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_js/string_art_challenge_js.js",
    "chars": 573,
    "preview": "function setup() {\n  createCanvas(800,800);\n  smooth();\n}\n\nfunction draw() {\n  background(253);\n  stroke(0);\n  strokeWei"
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/03_string_art_challenge/string_art_challenge_python/string_art_challenge_python.pyde",
    "chars": 574,
    "preview": "def setup():\n    size(800, 800)\n    smooth()\n\n\ndef draw():\n    background(253)\n    strokeWeight(8)\n    stroke(0)\n    str"
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_java/mini_calendar_java.pde",
    "chars": 1409,
    "preview": "import java.time.YearMonth; \n\nvoid setup() {\n  size(800, 800, FX2D);\n  noLoop(); \n}\n\n\nvoid draw() {\n  rectMode(CENTER);\n"
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_js/index.html",
    "chars": 611,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_js/mini_calendar_js.js",
    "chars": 1419,
    "preview": "function setup() {\n  createCanvas(800, 800);\n  noLoop(); \n}\n\n\nfunction draw() {\n  rectMode(CENTER);\n  ellipseMode(CENTER"
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_python/mini_calendar_python.pyde",
    "chars": 1227,
    "preview": "def setup():\n  size(800, 800)\n    \ndef draw():\n  rectMode(CENTER)\n  ellipseMode(CENTER)\n  background(255)\n  noStroke()\n "
  },
  {
    "path": "02_iteration/04_mini_calendar/mini_calendar_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_java/receding_landscape_java.pde",
    "chars": 456,
    "preview": "// Receding Horizon\n// Iteration exercise \n// Java solution\n\nsize(800, 800);\nbackground(253);\nstrokeWeight(3); \nstroke(0"
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_js/index.html",
    "chars": 616,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_js/receding_landscape_js.js",
    "chars": 412,
    "preview": "function setup() {\n  createCanvas(800, 800);\n  background(253);\n  strokeWeight(8); \n  stroke(0); \n  smooth();\n  \n  //ite"
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_python/receding_landscape_python.pyde",
    "chars": 390,
    "preview": "# Receding Horizon\n# Iteration exercise \n# Java solution\n\nsize(800, 800)\nbackground(255)\nstrokeWeight(3)\nstroke(0)\nsmoot"
  },
  {
    "path": "02_iteration/05_receding_landscape/receding_landscape_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_java/lines_to_the_cursor_java.pde",
    "chars": 590,
    "preview": "PImage cursorImg; \n\nvoid setup() {\n  size(800, 800); \n  cursorImg = loadImage(\"cursor_with_shadow_15x21.png\"); \n  smooth"
  },
  {
    "path": "02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_js/index.html",
    "chars": 617,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_js/lines_to_the_cursor_js.js",
    "chars": 400,
    "preview": "function setup() {\n  createCanvas(800, 800); \n  smooth();\n}\n\nfunction draw() {\n  background (253); \n\n  strokeWeight (8);"
  },
  {
    "path": "02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_python/lines_to_the_cursor_python.pyde",
    "chars": 339,
    "preview": "\ndef setup():\n  size(800, 800)\n  smooth()\n\n\ndef draw():\n  background(253)\n  strokeWeight (8)\n  stroke(0)\n\n  nLines = 10\n"
  },
  {
    "path": "02_iteration/06_lines_to_the_cursor/lines_to_the_cursor_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/07_color_bar_gradient/color_bar_gradient_java/color_bar_gradient_java.pde",
    "chars": 1284,
    "preview": "// Color Bar Gradient\n\n/*\nUsing iteration, generate a gradient that interpolates \nfrom one fill color to another across "
  },
  {
    "path": "02_iteration/07_color_bar_gradient/color_bar_gradient_js/color_bar_gradient_js.js",
    "chars": 855,
    "preview": "var nRectangles = 17;\nvar colorA;\nvar colorB;\n\nfunction setup() {\n  createCanvas(800, 800);\n  rectMode(CENTER);\n  noStro"
  },
  {
    "path": "02_iteration/07_color_bar_gradient/color_bar_gradient_js/index.html",
    "chars": 616,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/07_color_bar_gradient/color_bar_gradient_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/07_color_bar_gradient/color_bar_gradient_python/color_bar_gradient_python.pyde",
    "chars": 1083,
    "preview": "# Color Bar Gradient\n\n\n#Using iteration, generate a gradient that interpolates \n#from one fill color to another across e"
  },
  {
    "path": "02_iteration/07_color_bar_gradient/color_bar_gradient_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/08_dashed_line/dashed_line_java/dashed_line_java.pde",
    "chars": 1157,
    "preview": "// Dashed line\nPImage cursorImage; \n\nvoid setup() {\n  size(800, 800);\n  cursorImage = loadImage(\"cursor_with_shadow_15x2"
  },
  {
    "path": "02_iteration/08_dashed_line/dashed_line_js/dashed_line_js.js",
    "chars": 921,
    "preview": "function setup() {\n  createCanvas(800, 800);\n  smooth(); \n}\n\nfunction draw() {\n  background(253); \n\n  //these x and y va"
  },
  {
    "path": "02_iteration/08_dashed_line/dashed_line_js/index.html",
    "chars": 609,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/08_dashed_line/dashed_line_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/08_dashed_line/dashed_line_python/dashed_line_python.pyde",
    "chars": 834,
    "preview": "# Dashed line\n\ndef setup() :\n  size(800, 800)\n  smooth() \n\n\ndef draw() :\n  background(253) \n\n  #these x and y values rep"
  },
  {
    "path": "02_iteration/08_dashed_line/dashed_line_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_java/checkers_java.pde",
    "chars": 378,
    "preview": "// Checker board generation\n// Using nested iteration\n\nvoid setup() {\n  size(800, 800, FX2D);\n  noLoop(); \n}\n\nvoid draw("
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_js/checkers_js.js",
    "chars": 575,
    "preview": "function setup() {\n  createCanvas(800, 800);\n}\n\nfunction draw() {\n  var a=1;\n  //color of each individual square\n  var c"
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_js/index.html",
    "chars": 606,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_python/checkers_python.pyde",
    "chars": 534,
    "preview": "def setup() :\n  size(800, 800)\n\ndef draw():\n  n = 8\n  s = height/n\n\n  a = 1\n  #color of each individual square\n  c = 0\n "
  },
  {
    "path": "02_iteration/09_nested_iteration_checkers/checkers_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/10_iteration_with_functions/interaction_with_functions_js/index.html",
    "chars": 624,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/10_iteration_with_functions/interaction_with_functions_js/interaction_with_functions_js.js",
    "chars": 921,
    "preview": "// Iteration with Functions. \n// A function which drawa a smily face, \n// is invoked inside a nested iteration.\n\nfunctio"
  },
  {
    "path": "02_iteration/10_iteration_with_functions/interaction_with_functions_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/10_iteration_with_functions/iteration_with_functions_java/iteration_with_functions_java.pde",
    "chars": 1055,
    "preview": "// Iteration with Functions. \n// A function which drawa a smily face, \n// is invoked inside a nested iteration.\n\nvoid se"
  },
  {
    "path": "02_iteration/10_iteration_with_functions/iteration_with_functions_python/iteration_with_functions_python.pyde",
    "chars": 842,
    "preview": "# Iteration with Functions. \n# A function which drawa a smily face, \n# is invoked inside a nested iteration.\n\ndef setup("
  },
  {
    "path": "02_iteration/10_iteration_with_functions/iteration_with_functions_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/11_stochastic_elements/stochastic_elements_java/stochastic_elements_java.pde",
    "chars": 1339,
    "preview": "// Iteration with Randomness\n\nvoid setup() {\n  size(800, 800);\n  noLoop();\n}\n\nvoid draw() {\n  background(160); \n  //draw"
  },
  {
    "path": "02_iteration/11_stochastic_elements/stochastic_elements_js/index.html",
    "chars": 617,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/11_stochastic_elements/stochastic_elements_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/11_stochastic_elements/stochastic_elements_js/stochastic_elements_js.js",
    "chars": 1185,
    "preview": "// Iteration with Randomness\n\nfunction setup() {\n  createCanvas(800, 800); \n  noLoop();\n}\n\nfunction draw() {\n  backgroun"
  },
  {
    "path": "02_iteration/11_stochastic_elements/stochastic_elements_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/11_stochastic_elements/stochastic_elements_python/stochastic_elements_python.pyde",
    "chars": 1063,
    "preview": "# Iteration with Randomness\n\ndef setup():\n  size(800, 800) \n  noLoop()\n\n\ndef draw():\n  background(160)\n  #draws 50 crate"
  },
  {
    "path": "02_iteration/12_interrupted_grid/interrupted_grid_java/interrupted_grid_java.pde",
    "chars": 666,
    "preview": "// Grid with Randomness\n\nvoid setup() {\n  size(800, 800);\n  smooth();\n  noLoop(); \n}\n\nvoid draw() {\n  background(253); \n"
  },
  {
    "path": "02_iteration/12_interrupted_grid/interrupted_grid_js/index.html",
    "chars": 614,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/12_interrupted_grid/interrupted_grid_js/interrupted_grid_js.js",
    "chars": 590,
    "preview": "// Grid with Randomness\n\nfunction setup() {\n  createCanvas(800, 800);\n  smooth();\n  noLoop(); \n}\n\nfunction draw() {\n  ba"
  },
  {
    "path": "02_iteration/12_interrupted_grid/interrupted_grid_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/12_interrupted_grid/interrupted_grid_python/grid_with_randomness_python.pyde",
    "chars": 534,
    "preview": "# Grid with Randomness\n\ndef setup():\n  size(800, 800) \n  smooth() \n  noLoop()  \n\n\ndef draw()  :\n  background(255)  \n  st"
  },
  {
    "path": "02_iteration/12_interrupted_grid/interrupted_grid_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_java/geometric_progression_java.pde",
    "chars": 540,
    "preview": "// Geometric Progression\n\nvoid setup() {\n  size(800, 800);\n  smooth(); \n}\n\nvoid draw() {\n  background(253);\n  stroke(0);"
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_js/geometric_progression_js.js",
    "chars": 462,
    "preview": "// Geometric Progression\n\nfunction setup() {\n  createCanvas(800, 800);\n  smooth(); \n}\n\nfunction draw() {\n  background(25"
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_js/index.html",
    "chars": 619,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_python/geometric_progression_python.pyde",
    "chars": 412,
    "preview": "# Geometric Progression\n\ndef setup() :\n  size(800, 800)\n  smooth() \n\n\ndef draw():\n  background(253)\n  stroke(0) \n  noFil"
  },
  {
    "path": "02_iteration/13_geometric_progression/geometric_progression_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/14_moire_patterns/moire_java/moire_java.pde",
    "chars": 730,
    "preview": "float rot; \n\nvoid setup() {\n  size(800, 800, FX2D);\n  smooth();\n  rot = 0;\n}\n\nvoid draw() {\n  background(253); \n  stroke"
  },
  {
    "path": "02_iteration/14_moire_patterns/moire_js/index.html",
    "chars": 603,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/14_moire_patterns/moire_js/moire_js.js",
    "chars": 626,
    "preview": "var rot; \n\nfunction setup() {\n  createCanvas(800, 800);\n  smooth();\n  rot = 0;\n}\n\nfunction draw() {\n  background(253); \n"
  },
  {
    "path": "02_iteration/14_moire_patterns/moire_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/14_moire_patterns/moire_python/moire_python.pyde",
    "chars": 565,
    "preview": "rot = 0 \n\ndef setup():\n  size(800, 800, FX2D)\n  smooth()\n\ndef draw():\n  global rot\n  \n  background(255)\n  strokeWeight(2"
  },
  {
    "path": "02_iteration/14_moire_patterns/moire_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/15_recoding_schotter/schotter_java/schotter_java.pde",
    "chars": 794,
    "preview": "\nvoid setup() {\n  size(800, 800, FX2D);\n  smooth();\n  noLoop();\n}\n\nvoid draw() {\n  background(253);\n  \n  int nSquares = "
  },
  {
    "path": "02_iteration/15_recoding_schotter/schotter_js/index.html",
    "chars": 606,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/15_recoding_schotter/schotter_js/schotter_js.js",
    "chars": 503,
    "preview": "var r = 0;\nvar v = 0;\nvar w = 90;\n\nfunction setup() {\n  createCanvas(800, 800);\n  smooth();\n  noLoop();\n}\n\nfunction draw"
  },
  {
    "path": "02_iteration/15_recoding_schotter/schotter_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/15_recoding_schotter/schotter_python/schotter_python.pyde",
    "chars": 609,
    "preview": "def setup() :\n  size(800,800)\n  smooth()\n  noLoop()\n\ndef draw():\n  background(253)\n    \n  nSquares = 5\n  sqSize = 120 \n "
  },
  {
    "path": "02_iteration/15_recoding_schotter/schotter_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "02_iteration/16_hexagonal_grid/hexagonal_grid_java/hexagonal_grid_java.pde",
    "chars": 1098,
    "preview": "// Hexagonal Grid\n\nfloat sqrt3 = sqrt(3);\n\nvoid setup() {\n  size(800, 800);\n  smooth();\n}\n\nvoid draw() {\n  background(25"
  },
  {
    "path": "02_iteration/16_hexagonal_grid/hexagonal_grid_js/hexagonal_grid_js.js",
    "chars": 1008,
    "preview": "// Hexagonal Grid\n\nvar sqrt3;\n\nfunction setup() {\n  createCanvas(800, 800);\n  smooth();\n  sqrt3 =  sqrt(3);\n  noLoop();\n"
  },
  {
    "path": "02_iteration/16_hexagonal_grid/hexagonal_grid_js/index.html",
    "chars": 612,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "02_iteration/16_hexagonal_grid/hexagonal_grid_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "02_iteration/16_hexagonal_grid/hexagonal_grid_python/hexagonal_grid_python.pyde",
    "chars": 900,
    "preview": "# Hexagonal Grid\n\nsqrt3 = sqrt(3)\n\ndef setup():\n  size(800, 800)\n  smooth()\n \ndef draw() :\n  background(253) \n  side = 1"
  },
  {
    "path": "03_color/02_overlapping_color/overlapping_color_java/overlapping_color_java.pde",
    "chars": 577,
    "preview": "// Overlapping color\n// Exercises: Overlapping\n\nvoid setup() {\n  size(800, 800);\n  noLoop();\n}\n\nvoid draw() {\n  backgrou"
  },
  {
    "path": "03_color/02_overlapping_color/overlapping_color_js/index.html",
    "chars": 615,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/02_overlapping_color/overlapping_color_js/overlapping_color_js.js",
    "chars": 505,
    "preview": "// Overlapping color\n// Exercises: Overlapping\n\nfunction setup() {\n  createCanvas(800, 800);\n  \n  noLoop();\n}\n\nfunction "
  },
  {
    "path": "03_color/02_overlapping_color/overlapping_color_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/02_overlapping_color/overlapping_python/overlapping_python.pyde",
    "chars": 414,
    "preview": "#Exercises: Color\n#Overlapping Color\n\ndef setup():\n  size(800, 800)\n  background(253)\n  noStroke()\n  blendMode(DIFFERENC"
  },
  {
    "path": "03_color/02_overlapping_color/overlapping_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "03_color/03_constructing_a_gradient/constructing_a_gradient_java/constructing_a_gradient_java.pde",
    "chars": 621,
    "preview": "// Exercises: Color\n// Two Color Gradient\n\ncolor p;\ncolor c, d;\nvoid setup() {\n  size(800, 800);\n  c= color(random(255),"
  },
  {
    "path": "03_color/03_constructing_a_gradient/constructing_a_gradient_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "03_color/03_constructing_a_gradient/constructing_a_gradient_js/constructing_a_gradient_js.js",
    "chars": 541,
    "preview": "// Exercises: Color\n// Two Color Gradient\n\nvar p;\nvar c, d;\n\nfunction setup() {\n  createCanvas(800, 800);\n  c= color(ran"
  },
  {
    "path": "03_color/03_constructing_a_gradient/constructing_a_gradient_js/index.html",
    "chars": 621,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/03_constructing_a_gradient/constructing_a_gradient_python/constructing_a_gradient_python.pyde",
    "chars": 453,
    "preview": "c, d = None, None\n\ndef setup():\n  size(800, 800)\n  global c, d\n  c= color(random(255), random(255), random(255))\n  d= co"
  },
  {
    "path": "03_color/03_constructing_a_gradient/constructing_a_gradient_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "03_color/04_color_wheel/color_wheel_java/color_wheel_java.pde",
    "chars": 651,
    "preview": "void setup() {\n  size(800, 800);\n  noLoop();\n  \n  background(253);\n  \n  pushMatrix();\n  translate(width/2, height/2);\n \n"
  },
  {
    "path": "03_color/04_color_wheel/color_wheel_js/color_wheel_js.js",
    "chars": 532,
    "preview": "function setup() {\n  createCanvas(800, 800);\n   \n  background(253);\n  \n  push();\n  translate(width/2, height/2);\n \n  var"
  },
  {
    "path": "03_color/04_color_wheel/color_wheel_js/index.html",
    "chars": 609,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/04_color_wheel/color_wheel_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/04_color_wheel/color_wheel_python/color_wheel_python.pyde",
    "chars": 479,
    "preview": "def setup():\n  size(800, 800)\n  noLoop()\n  \n  background(253)\n  \n  pushMatrix()\n  translate(width/2, height/2)\n \n  radiu"
  },
  {
    "path": "03_color/04_color_wheel/color_wheel_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_java/threshold_of_perception_java.pde",
    "chars": 292,
    "preview": "void setup() {\n  size(800, 800);\n}\n\nvoid draw() {\n  noStroke();\n  \n  float phi = 0.618034; \n  \n  fill( 60, 130, 235);\n  "
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_js/index.html",
    "chars": 621,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_js/threshold_of_perception_js.js",
    "chars": 211,
    "preview": "function setup() {\n  createCanvas(800, 800);\n}\n\nfunction draw() {\n  noStroke();\n  \n  fill(60, 130, 235);\n  rect(0, 0, wi"
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "03_color/05_threshold_of_perception/threshold_of_perception_python/threshold_of_perception_python.pyde",
    "chars": 175,
    "preview": "def setup():\n    size(800, 800);\n    \ndef draw():\n    background(60, 130, 235);\n    noStroke();\n    fill(65, 135, 240);\n"
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_java/interactive_complement_java.pde",
    "chars": 1017,
    "preview": "\nPImage cursorImg; \n\n//------------------------------------\nvoid setup() {\n  size(800, 800);\n  noStroke();\n  cursorImg ="
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_java/sketch.properties",
    "chars": 48,
    "preview": "mode.id=processing.mode.java.JavaMode\nmode=Java\n"
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_js/index.html",
    "chars": 620,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_js/interactive_complement_js.js",
    "chars": 897,
    "preview": "var cursorImg; \n\n//------------------------------------\nfunction setup() {\n  createCanvas(800, 800);\n  noStroke();\n  cur"
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_python/interactive_complement.pyde",
    "chars": 869,
    "preview": "cursorImg  = None\n\n#------------------------------------\ndef setup():\n  size(800, 800)\n  noStroke()\n  \n  global cursorIm"
  },
  {
    "path": "03_color/06_interactive_complement/interactive_complement_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/07_accented_palette/accented_palette_java/accented_palette_java.pde",
    "chars": 1704,
    "preview": "void setup() {\n  size(800, 800); \n  \n  // Complementary is a color scheme using one base color and its complement, \n  //"
  },
  {
    "path": "03_color/07_accented_palette/accented_palette_js/accented_palette_js.js",
    "chars": 1592,
    "preview": "function setup() {\n  createCanvas(800, 800); \n  \n  // Complementary is a color scheme using one base color and its compl"
  },
  {
    "path": "03_color/07_accented_palette/accented_palette_js/index.html",
    "chars": 614,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/07_accented_palette/accented_palette_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/07_accented_palette/accented_palette_python/accented_palette_python.pyde",
    "chars": 1381,
    "preview": "def setup():\n  size(800, 800) \n  \n  # Complementary is a scheme using one base and its complement, \n  # the on the exact"
  },
  {
    "path": "03_color/07_accented_palette/accented_palette_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/08_split_complements/split_complementary_java/split_complementary_java.pde",
    "chars": 1582,
    "preview": "\nPImage colorWheelImg; \nPImage cursorImg; \n\nvoid setup() {\n  size(800, 800); \n  colorWheelImg = loadImage(\"color_wheel.p"
  },
  {
    "path": "03_color/08_split_complements/split_complementary_js/index.html",
    "chars": 617,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/08_split_complements/split_complementary_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/08_split_complements/split_complementary_js/split_complementary_js.js",
    "chars": 1252,
    "preview": "var colorWheelImg; \nvar cursorImg; \n\nfunction setup() {\n  createCanvas(800, 800); \n  colorWheelImg = loadImage(\"data/col"
  },
  {
    "path": "03_color/08_split_complements/split_complementary_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/08_split_complements/split_complementary_python/split_complementary_python.pyde",
    "chars": 1162,
    "preview": "colorWheelImg, cursorImg = None, None\n\ndef setup():\n  size(800, 800) \n  \n  global colorWheelImg, cursorImg\n  colorWheelI"
  },
  {
    "path": "03_color/09_albers_color_relativity_1/color_relativity_1_java/color_relativity_1_java.pde",
    "chars": 562,
    "preview": "//Exercises: Color\n//Color relativity\n\nvoid setup() {\n  size(800, 800);\n  noStroke();\n}\n\nvoid draw() {\n  // Make 3 color"
  },
  {
    "path": "03_color/09_albers_color_relativity_1/color_relativity_1_js/color_relativity_1_js.js",
    "chars": 490,
    "preview": "//Exercises: Color\n//Color relativity\n\nfunction setup() {\n  createCanvas(800, 800);\n  noStroke();\n}\n\nfunction draw() {\n "
  },
  {
    "path": "03_color/09_albers_color_relativity_1/color_relativity_1_js/index.html",
    "chars": 616,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/09_albers_color_relativity_1/color_relativity_1_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/09_albers_color_relativity_1/color_relativity_1_python/color_relativity_1_python.pyde",
    "chars": 441,
    "preview": "#Exercises: Color\n#Color relativity\n\ndef setup():\n  size(800, 800)\n  noStroke()\n\ndef draw():\n  # Make 3 colors look like"
  },
  {
    "path": "03_color/09_albers_color_relativity_1/color_relativity_1_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "03_color/10_albers_color_relativity_2/color_relativity_2_java/color_relativity_2_java.pde",
    "chars": 705,
    "preview": "//Exercises: Color \n//Color Relativity 2\n\ncolor color1 = color(90, 31, 21);\ncolor color2 = color(165, 224, 234);\ncolor c"
  },
  {
    "path": "03_color/10_albers_color_relativity_2/color_relativity_2_js/color_relativity_2_js.js",
    "chars": 610,
    "preview": "//Exercises: var \n//var Relativity 2\n\nfunction setup() {\n\n  noStroke();\n  createCanvas(800, 800);\n  background(253);\n  p"
  },
  {
    "path": "03_color/10_albers_color_relativity_2/color_relativity_2_js/index.html",
    "chars": 616,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/10_albers_color_relativity_2/color_relativity_2_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/10_albers_color_relativity_2/color_relativity_2_python/color_relativity_2_python.pyde",
    "chars": 601,
    "preview": "#Exercises: Color \n#Color Relativity 2\n\ncolor1 = color(90, 31, 21)\ncolor2 = color(165, 224, 234)\ncolor3 = color(118, 129"
  },
  {
    "path": "03_color/10_albers_color_relativity_2/color_relativity_2_python/sketch.properties",
    "chars": 48,
    "preview": "mode=Python\r\nmode.id=jycessing.mode.PythonMode\r\n"
  },
  {
    "path": "03_color/11_color_inspector/color_inspector_java/color_inspector_java.pde",
    "chars": 1333,
    "preview": "\nPImage sourceImg;\nPImage cursorImg; \nPFont myFont; \n\n//------------------------------------\nvoid setup() {\n  size(800, "
  },
  {
    "path": "03_color/11_color_inspector/color_inspector_js/color_inspector_js.js",
    "chars": 1182,
    "preview": "var sourceImg;\nvar cursorImg; \nvar myFont; \n\n//------------------------------------\nfunction setup() {\n  createCanvas(80"
  },
  {
    "path": "03_color/11_color_inspector/color_inspector_js/index.html",
    "chars": 613,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/11_color_inspector/color_inspector_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/11_color_inspector/color_inspector_python/color_inspector_python.pyde",
    "chars": 1204,
    "preview": "sourceImg, cursorImg, myFont = None, None, None\n\n#------------------------------------\ndef setup():\n  size(800, 800)\n  \n"
  },
  {
    "path": "03_color/11_color_inspector/color_inspector_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/12_color_survey/color_survey_alternate/color_mixer_java/color_mixer_java.pde",
    "chars": 2387,
    "preview": "PFont myFont; \nPImage cursorImg; \ncolor mauves[] = {\n  color(150, 117, 157), \n  color(186, 122, 123), \n  color(172, 114,"
  },
  {
    "path": "03_color/12_color_survey/color_survey_alternate/color_mixer_python/color_mixer_python.pyde",
    "chars": 2270,
    "preview": "myFont, cursorImg = None, None\nmauves = [color(150, 117, 157), color(186, 122, 123), \n          color(172, 114, 148), co"
  },
  {
    "path": "03_color/12_color_survey/color_survey_alternate/color_mixer_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/package.json",
    "chars": 676,
    "preview": "{\n  \"//1\": \"describes your app and its dependencies\",\n  \"//2\": \"https://docs.npmjs.com/files/package.json\",\n  \"//3\": \"up"
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/server.js",
    "chars": 1942,
    "preview": "//////////////////////////////////////////\n// \"Color Survey\" (Server)              //\n// Exercise on page 156 of CCM    "
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/sketches/index.html",
    "chars": 148,
    "preview": "<script>window.location.href=\"/survey\"</script>\n<!-- <ul>\n  <li><a href=\"/survey\">Survey</a></li>\n  <li><a href=\"/viewer"
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/sketches/survey/index.html",
    "chars": 463,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js\"></s"
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/sketches/survey/sketch.js",
    "chars": 3167,
    "preview": "//////////////////////////////////////////\n// \"Color Survey\"                       //\n// Exercise on page 156 of CCM    "
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/sketches/viewer/index.html",
    "chars": 469,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <script src=\"https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.1.9/p5.js\"></s"
  },
  {
    "path": "03_color/12_color_survey/color_survey_app_js/sketches/viewer/sketch.js",
    "chars": 1557,
    "preview": "//////////////////////////////////////////\n// \"Color Survey\" (Viewer)              //\n// Exercise on page 156 of CCM    "
  },
  {
    "path": "03_color/12_color_survey/color_survey_java/color_survey_java.pde",
    "chars": 3875,
    "preview": "//////////////////////////////////////////\n// \"Color Survey\"                       //\n// Exercise on page 156 of CCM    "
  },
  {
    "path": "03_color/12_color_survey/color_survey_java/survey_result.csv",
    "chars": 220,
    "preview": "mauve,teal,plum\n12553384,9364182,15363159\n13009241,6073058,13652551\n15438500,7715539,15574723\n12540235,4563338,14560133\n"
  },
  {
    "path": "03_color/12_color_survey/color_survey_py/color_survey_py.pyde",
    "chars": 3478,
    "preview": "########################################\n# \"Color Survey\"                       #\n# Exercise on page 156 of CCM         "
  },
  {
    "path": "03_color/12_color_survey/color_survey_py/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/12_color_survey/color_survey_py/survey_result.csv",
    "chars": 196,
    "preview": "mauve,teal,plum\n12553384,9364182,15363159\n13009241,6073058,13652551\n15438500,7715539,15574723\n12540235,4563338,14560133\n"
  },
  {
    "path": "03_color/12_color_survey/color_survey_viewer_java/color_survey_viewer_java.pde",
    "chars": 1764,
    "preview": "//////////////////////////////////////////\n// \"Color Survey\" (Viewer)              //\n// Exercise on page 156 of CCM    "
  },
  {
    "path": "03_color/12_color_survey/color_survey_viewer_py/color_survey_viewer_py.pyde",
    "chars": 1594,
    "preview": "########################################\n# \"Color Survey\" (Viewer)              #\n# Exercise on page 156 of CCM         "
  },
  {
    "path": "03_color/12_color_survey/color_survey_viewer_py/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/13_palette_from_photo/palette_from_book_java/palette_from_book_java.pde",
    "chars": 3058,
    "preview": "// Use k-means (k=5) to calculate an optimal palette for an image. \n// Basically k-means clustering in 3D (RGB) space, r"
  },
  {
    "path": "03_color/13_palette_from_photo/palette_from_book_js/index.html",
    "chars": 615,
    "preview": "<html>\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n  <!-- "
  },
  {
    "path": "03_color/13_palette_from_photo/palette_from_book_js/palette_from_book_js.js",
    "chars": 3303,
    "preview": "// Use k-means (k=5) to calculate an optimal palette for an image. \n// Basically k-means clustering in 3D (RGB) space, r"
  },
  {
    "path": "03_color/13_palette_from_photo/palette_from_book_js/sketch.properties",
    "chars": 49,
    "preview": "mode=p5.js\nmode.id=processing.mode.p5js.p5jsMode\n"
  },
  {
    "path": "03_color/13_palette_from_photo/palette_from_book_python/palette_from_book_python.pyde",
    "chars": 2806,
    "preview": "# Use k-means (k=5) to calculate an optimal palette for an image. \n# Basically k-means clustering in 3D (RGB) space, run"
  },
  {
    "path": "03_color/13_palette_from_photo/palette_from_book_python/sketch.properties",
    "chars": 46,
    "preview": "mode=Python\nmode.id=jycessing.mode.PythonMode\n"
  },
  {
    "path": "03_color/13_palette_from_photo/palette_v2_java/palette_v2_java.pde",
    "chars": 5024,
    "preview": "//////////////////////////////////////////\n// \"Palette from Photo\"                 //\n// or k-means clustering          "
  }
]

// ... and 842 more files (download for full content)

About this extraction

This page contains the full source code of the CodeAsCreativeMedium/exercises GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1042 files (49.0 MB), approximately 12.9M tokens, and a symbol index with 13763 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!