From 490f531521139de56d2c98c3e873b2372398c025 Mon Sep 17 00:00:00 2001 From: Viktor Vaczi Date: Wed, 7 Jan 2026 09:42:31 +0100 Subject: [PATCH] feat(webgl): Add GAL native test harness for visual regression testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a standalone test application that compiles KiCad's actual OPENGL_GAL against system wxWidgets to generate baseline screenshots for comparing native OpenGL rendering against WebGL rendering in the browser. Architecture: - Compiles 18 KiCad GAL source files from the kicad submodule - Uses template-based private member accessor (safer than #define private public) - Generates shader C++ files from GLSL (10 shader pairs for SMAA AA) - Minimal stubs for KiCad dependencies (PGM_BASE, ADVANCED_CFG, etc.) Test coverage: - 11 scenarios testing ~19% of GAL API - basic-lines, line-widths, circles, arcs, rectangles, polygons - alpha-blending, transforms, grid-cursor, segments, complex-scene Key insights documented: - GAL uses world-to-screen transformation requiring 1:1 pixel mapping - FBO reading required for clean screenshots on macOS - Layer depth needed for proper z-ordering in complex scenes 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../0002-gal-native-test-architecture.md | 287 +++ scripts/build-gal-native-test.sh | 71 + scripts/build-wxwidgets-native.sh | 62 + .../baseline/gal-alpha-blending.png | Bin 0 -> 78077 bytes tests/gal-regression/baseline/gal-arcs.png | Bin 0 -> 81131 bytes .../baseline/gal-basic-lines.png | Bin 0 -> 82664 bytes tests/gal-regression/baseline/gal-circles.png | Bin 0 -> 92839 bytes .../baseline/gal-complex-scene.png | Bin 0 -> 81162 bytes .../baseline/gal-grid-cursor.png | Bin 0 -> 78152 bytes .../baseline/gal-line-widths.png | Bin 0 -> 76857 bytes .../gal-regression/baseline/gal-polygons.png | Bin 0 -> 79666 bytes .../baseline/gal-rectangles.png | Bin 0 -> 76915 bytes .../gal-regression/baseline/gal-segments.png | Bin 0 -> 78983 bytes .../baseline/gal-transforms.png | Bin 0 -> 79688 bytes tests/gal-regression/native/CMakeLists.txt | 120 ++ tests/gal-regression/native/config.h | 26 + .../gal-regression/native/gal_native_test.cpp | 312 +++ .../native/gal_test_accessor.cpp | 113 ++ .../gal-regression/native/gal_test_accessor.h | 29 + .../gal-regression/native/generate_shaders.py | 102 + .../native/generated/glsl_kicad_frag.cpp | 13 + .../native/generated/glsl_kicad_frag.h | 13 + .../native/generated/glsl_kicad_vert.cpp | 13 + .../native/generated/glsl_kicad_vert.h | 13 + .../native/generated/glsl_smaa_base.cpp | 13 + .../native/generated/glsl_smaa_base.h | 13 + .../generated/glsl_smaa_pass_1_frag_color.cpp | 13 + .../generated/glsl_smaa_pass_1_frag_color.h | 13 + .../generated/glsl_smaa_pass_1_frag_luma.cpp | 13 + .../generated/glsl_smaa_pass_1_frag_luma.h | 13 + .../generated/glsl_smaa_pass_1_vert.cpp | 13 + .../native/generated/glsl_smaa_pass_1_vert.h | 13 + .../generated/glsl_smaa_pass_2_frag.cpp | 13 + .../native/generated/glsl_smaa_pass_2_frag.h | 13 + .../generated/glsl_smaa_pass_2_vert.cpp | 13 + .../native/generated/glsl_smaa_pass_2_vert.h | 13 + .../generated/glsl_smaa_pass_3_frag.cpp | 13 + .../native/generated/glsl_smaa_pass_3_frag.h | 13 + .../generated/glsl_smaa_pass_3_vert.cpp | 13 + .../native/generated/glsl_smaa_pass_3_vert.h | 13 + tests/gal-regression/native/kicad_stubs.cpp | 269 +++ tests/gal-regression/native/kicad_stubs.h | 27 + tests/gal-regression/native/stb_image_write.h | 1724 +++++++++++++++++ tests/gal-regression/native/trace_helpers.h | 66 + .../scenarios/gal_test_scenarios.cpp | 567 ++++++ .../scenarios/gal_test_scenarios.h | 40 + 46 files changed, 4075 insertions(+) create mode 100644 features/webgl/0002-gal-native-test-architecture.md create mode 100755 scripts/build-gal-native-test.sh create mode 100755 scripts/build-wxwidgets-native.sh create mode 100644 tests/gal-regression/baseline/gal-alpha-blending.png create mode 100644 tests/gal-regression/baseline/gal-arcs.png create mode 100644 tests/gal-regression/baseline/gal-basic-lines.png create mode 100644 tests/gal-regression/baseline/gal-circles.png create mode 100644 tests/gal-regression/baseline/gal-complex-scene.png create mode 100644 tests/gal-regression/baseline/gal-grid-cursor.png create mode 100644 tests/gal-regression/baseline/gal-line-widths.png create mode 100644 tests/gal-regression/baseline/gal-polygons.png create mode 100644 tests/gal-regression/baseline/gal-rectangles.png create mode 100644 tests/gal-regression/baseline/gal-segments.png create mode 100644 tests/gal-regression/baseline/gal-transforms.png create mode 100644 tests/gal-regression/native/CMakeLists.txt create mode 100644 tests/gal-regression/native/config.h create mode 100644 tests/gal-regression/native/gal_native_test.cpp create mode 100644 tests/gal-regression/native/gal_test_accessor.cpp create mode 100644 tests/gal-regression/native/gal_test_accessor.h create mode 100644 tests/gal-regression/native/generate_shaders.py create mode 100644 tests/gal-regression/native/generated/glsl_kicad_frag.cpp create mode 100644 tests/gal-regression/native/generated/glsl_kicad_frag.h create mode 100644 tests/gal-regression/native/generated/glsl_kicad_vert.cpp create mode 100644 tests/gal-regression/native/generated/glsl_kicad_vert.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_base.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_base.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.h create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.cpp create mode 100644 tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.h create mode 100644 tests/gal-regression/native/kicad_stubs.cpp create mode 100644 tests/gal-regression/native/kicad_stubs.h create mode 100644 tests/gal-regression/native/stb_image_write.h create mode 100644 tests/gal-regression/native/trace_helpers.h create mode 100644 tests/gal-regression/scenarios/gal_test_scenarios.cpp create mode 100644 tests/gal-regression/scenarios/gal_test_scenarios.h diff --git a/features/webgl/0002-gal-native-test-architecture.md b/features/webgl/0002-gal-native-test-architecture.md new file mode 100644 index 0000000..1cd06e8 --- /dev/null +++ b/features/webgl/0002-gal-native-test-architecture.md @@ -0,0 +1,287 @@ +# GAL Native Test Harness Architecture + +## Overview + +The GAL native test harness is a standalone macOS application that compiles KiCad's actual `OPENGL_GAL` rendering engine against system wxWidgets. It generates baseline PNG screenshots for visual regression testing of WebGL rendering in the WASM build. + +**Purpose**: Compare native OpenGL rendering (ground truth) against WebGL rendering in the browser to detect visual regressions. + +--- + +## Architecture + +``` +┌─────────────────────────────────────────────────────────────────────┐ +│ GAL Native Test │ +├─────────────────────────────────────────────────────────────────────┤ +│ gal_native_test.cpp (wxApp + wxFrame) │ +│ └─ Creates OPENGL_GAL on wxGLCanvas │ +│ └─ Runs 11 test scenarios │ +│ └─ Captures FBO → PNG for each │ +├─────────────────────────────────────────────────────────────────────┤ +│ kicad_stubs.cpp │ gal_test_accessor.cpp │ +│ • PGM_BASE singleton │ • Template accessor for │ +│ • ADVANCED_CFG │ private OPENGL_GAL members │ +│ • KIFONT stubs │ • FBO reading │ +│ • Observable stubs │ │ +├─────────────────────────────────────────────────────────────────────┤ +│ KiCad OPENGL_GAL (from submodule) │ +│ kicad/common/gal/opengl/*.cpp (18 source files) │ +├─────────────────────────────────────────────────────────────────────┤ +│ System Dependencies │ +│ wxWidgets (via homebrew) │ GLEW │ OpenGL │ +└─────────────────────────────────────────────────────────────────────┘ +``` + +--- + +## GAL Code Source + +The test harness compiles **KiCad's actual OPENGL_GAL** from the kicad submodule: + +### Source Files (`/kicad/common/gal/opengl/`) + +| File | Purpose | +|------|---------| +| `opengl_gal.cpp` | Main GAL implementation - drawing primitives | +| `opengl_compositor.cpp` | FBO management, layer compositing | +| `antialiasing.cpp` | SMAA antialiasing implementation | +| `vertex_manager.cpp` | Vertex buffer accumulation | +| `vertex_item.cpp` | Individual vertex items | +| `vertex_container.cpp` | Vertex storage base class | +| `cached_container.cpp` | Cached geometry container | +| `cached_container_gpu.cpp` | GPU-resident cached geometry | +| `cached_container_ram.cpp` | RAM-backed cached geometry | +| `noncached_container.cpp` | Per-frame geometry | +| `gpu_manager.cpp` | GPU buffer management | +| `shader.cpp` | GLSL shader compilation/linking | +| `utils.cpp` | OpenGL utility functions | +| `gl_resources.cpp` | OpenGL resource management | +| `hidpi_gl_canvas.cpp` | HiDPI-aware GL canvas | +| `graphics_abstraction_layer.cpp` | GAL base class | +| `color4d.cpp` | Color handling | +| `gal_display_options.cpp` | Display options | + +### Build Configuration (`CMakeLists.txt`) + +```cmake +# Links against system wxWidgets +find_program(WX_CONFIG_EXECUTABLE wx-config + HINTS /opt/homebrew/bin /usr/local/bin) + +# Includes KiCad headers from submodule +target_include_directories(gal_native_test PRIVATE + ${KICAD_SOURCE}/include + ${KICAD_SOURCE}/include/gal + ${KICAD_SOURCE}/include/gal/opengl + ${KICAD_SOURCE}/libs/kimath/include + ${KICAD_SOURCE}/libs/core/include +) +``` + +--- + +## Generated Files + +### Location + +`/tests/gal-regression/native/generated/` + +### Purpose + +GLSL shaders must be embedded as strings at runtime. `generate_shaders.py` converts shader source files to C++ hex arrays. + +### Generator Script + +`generate_shaders.py` reads from `/kicad/common/gal/shaders/` and creates: + +| Shader | Generated Files | Purpose | +|--------|-----------------|---------| +| `kicad.frag` | `glsl_kicad_frag.cpp/h` | Fragment shader (coloring) | +| `kicad.vert` | `glsl_kicad_vert.cpp/h` | Vertex shader (transforms) | +| `smaa_base.glsl` | `glsl_smaa_base.cpp/h` | SMAA common structures | +| `smaa_pass_1_*.glsl` | 3 file pairs | SMAA edge detection | +| `smaa_pass_2_*.glsl` | 2 file pairs | SMAA blending weights | +| `smaa_pass_3_*.glsl` | 2 file pairs | SMAA neighborhood blending | + +### Generated Code Structure + +```cpp +// generated/glsl_kicad_frag.cpp +namespace KIGFX { +namespace BUILTIN_SHADERS { +static unsigned char glsl_kicad_frag_bytes[] = { 0x2f, 0x2a, ... }; +std::string glsl_kicad_frag = std::string( + reinterpret_cast(glsl_kicad_frag_bytes), 4233); +}} +``` + +--- + +## Test Harness Components + +### `gal_native_test.cpp` + +Main test driver with wxApp/wxFrame: + +1. Creates `OPENGL_GAL` on a wxGLCanvas +2. Configures coordinate system for 1:1 world-to-screen mapping +3. Iterates through test scenarios +4. Captures FBO contents as PNG screenshots + +Key configuration: +```cpp +// Critical: Set 1:1 world-to-screen mapping +// GAL default is for PCB nanometers (3.937e-8), which would +// compress pixel coordinates (0-800) to ~0.003 screen pixels +m_gal->SetWorldUnitLength(1.0 / ADVANCED_CFG::GetCfg().m_ScreenDPI); +``` + +### `kicad_stubs.cpp` + +Minimal implementations for KiCad symbols not included in GAL: + +- `PGM_BASE` singleton with `GL_CONTEXT_MANAGER` +- `ADVANCED_CFG` with `m_ScreenDPI = 91` +- `KIFONT` stubs (returns nullptr for fonts) +- `OBSERVABLE_BASE` observer pattern stubs +- UI dialog stubs (`DisplayError`, etc.) + +### `gal_test_accessor.cpp` + +Uses C++ template technique to access private members: + +```cpp +// Access private OPENGL_GAL members without modifying headers +template struct steal_impl; +template +struct steal_impl { + friend T get(steal_impl*) { return ptr; } +}; +``` + +Provides: +- `GetCompositorMainBufferTexture()` - For screenshot reading +- `GetCompositorMainFBO()` - FBO ID access +- `ReadCompositorFBOPixels()` - Direct pixel readback + +### `gal_test_scenarios.cpp` + +11 rendering test scenarios using the GAL API. + +--- + +## Test Coverage Analysis + +### Current Scenarios + +| # | Name | GAL Features Tested | +|---|------|-------------------| +| 0 | basic-lines | `DrawLine`, `SetStrokeColor`, `SetLineWidth` | +| 1 | line-widths | `DrawLine` with varying widths (0.5 to 12.0) | +| 2 | circles | `DrawCircle` (filled and stroked) | +| 3 | arcs | `DrawArc` | +| 4 | rectangles | `DrawRectangle` (filled and stroked) | +| 5 | polygons | `DrawPolygon`, `DrawPolyline` | +| 6 | alpha-blending | `SetFillColor` with alpha transparency | +| 7 | transforms | `Save`, `Restore`, `Rotate`, `Translate`, `Scale` | +| 8 | grid-cursor | `DrawGrid`, `DrawCursor` | +| 9 | segments | `DrawSegment` | +| 10 | complex-scene | `SetLayerDepth` (z-ordering) | + +### Coverage: ~19% of GAL API (14 of 73 methods) + +### Missing Coverage (Priority Order) + +**High Priority** (Critical for KiCad functionality): +1. `DrawBitmap()` - Image/icon rendering +2. `DrawCurve()` - Bezier curves +3. `DrawGlyph()` / `BitmapText()` - Text rendering +4. `DrawSegmentChain()` - Complex paths +5. `DrawArcSegment()` - Filled arc segments + +**Medium Priority** (Performance-critical features): +6. Group methods: `BeginGroup()`, `EndGroup()`, `DrawGroup()`, `ClearCache()` +7. Render targets: `SetTarget()`, offscreen rendering +8. `SetNegativeDrawMode()` - Gerber-style rendering + +**Low Priority** (Already implicit or not relevant to WASM): +9. `EnableDepthTest()` - Implicit in complex-scene +10. Context locking - Single-threaded in WASM + +--- + +## Code Quality Assessment + +### Strengths + +1. **Clean separation** - Stubs, accessor, scenarios in separate files +2. **Minimal stubs** - Only implements what's needed +3. **Safe accessor** - Template technique avoids `#define private public` +4. **Standard shader embedding** - Common practice for GL applications + +### Architecture Decisions + +| Decision | Rationale | +|----------|-----------| +| Compile actual KiCad GAL | Ground truth for comparison | +| System wxWidgets | Native OpenGL context | +| FBO reading | Clean screenshots without window capture | +| Hex shader embedding | Runtime shader loading like KiCad | + +--- + +## Running the Test + +### Build + +```bash +./scripts/build-gal-native-test.sh +``` + +### Execute + +```bash +./tests/gal-regression/native/build/gal_native_test --output ./baselines +``` + +### Options + +| Flag | Description | +|------|-------------| +| `--output ` | Output directory for PNG files | +| `--width ` | Canvas width (default: 800) | +| `--height ` | Canvas height (default: 600) | +| `--show` | Show window instead of headless | + +--- + +## Next Steps + +### Immediate: Expand Test Coverage + +1. Add `DrawBitmap` scenario with simple test image +2. Add `DrawCurve` (Bezier) scenario +3. Add text rendering scenario (requires KIFONT implementation) +4. Add `DrawSegmentChain` scenario +5. Add `DrawArcSegment` scenario + +### Future: WebGL Comparison + +1. Run same scenarios in WASM build +2. Compare native vs WebGL screenshots +3. Automate regression detection + +--- + +## File Reference + +| File | Location | +|------|----------| +| Test driver | `tests/gal-regression/native/gal_native_test.cpp` | +| Stubs | `tests/gal-regression/native/kicad_stubs.cpp` | +| Private accessor | `tests/gal-regression/native/gal_test_accessor.cpp` | +| Test scenarios | `tests/gal-regression/scenarios/gal_test_scenarios.cpp` | +| CMake config | `tests/gal-regression/native/CMakeLists.txt` | +| Shader generator | `tests/gal-regression/native/generate_shaders.py` | +| Build script | `scripts/build-gal-native-test.sh` | diff --git a/scripts/build-gal-native-test.sh b/scripts/build-gal-native-test.sh new file mode 100755 index 0000000..9ad16a9 --- /dev/null +++ b/scripts/build-gal-native-test.sh @@ -0,0 +1,71 @@ +#!/bin/bash +# +# Build script for the native GAL test harness +# +# This builds a standalone test application that uses KiCad's actual OPENGL_GAL +# to render test scenarios and generate baseline screenshots. +# + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +TEST_DIR="$PROJECT_ROOT/tests/gal-regression/native" +BUILD_DIR="$TEST_DIR/build" +LOG_FILE="$PROJECT_ROOT/tests/logs/gal-native-build.log" + +# Create log directory +mkdir -p "$(dirname "$LOG_FILE")" + +echo "Building GAL Native Test..." +echo " Test dir: $TEST_DIR" +echo " Build dir: $BUILD_DIR" +echo " Log file: $LOG_FILE" + +# Create build directory +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" + +# Generate shader headers if needed +if [ ! -d "$TEST_DIR/generated" ] || [ -z "$(ls -A $TEST_DIR/generated 2>/dev/null)" ]; then + echo "Generating shader headers..." + python3 "$TEST_DIR/generate_shaders.py" >> "$LOG_FILE" 2>&1 +fi + +# Configure +echo "Running CMake..." +cmake .. >> "$LOG_FILE" 2>&1 +CMAKE_STATUS=$? + +if [ $CMAKE_STATUS -ne 0 ]; then + echo "CMake configuration failed! Check $LOG_FILE for details." + echo "" + echo "Last 50 lines of log:" + tail -50 "$LOG_FILE" + exit 1 +fi + +# Build +echo "Building..." +make -j$(sysctl -n hw.ncpu 2>/dev/null || echo 4) >> "$LOG_FILE" 2>&1 +BUILD_STATUS=$? + +if [ $BUILD_STATUS -ne 0 ]; then + echo "Build failed! Check $LOG_FILE for details." + echo "" + echo "Last 100 lines of log:" + tail -100 "$LOG_FILE" + exit 1 +fi + +echo "Build successful!" +echo "Executable: $BUILD_DIR/gal_native_test" +echo "" +echo "To run:" +echo " $BUILD_DIR/gal_native_test" +echo "" +echo "Options:" +echo " --output Output directory for baseline PNGs" +echo " --width Canvas width (default: 800)" +echo " --height Canvas height (default: 600)" +echo " --show Show window (default: headless)" diff --git a/scripts/build-wxwidgets-native.sh b/scripts/build-wxwidgets-native.sh new file mode 100755 index 0000000..1a0d996 --- /dev/null +++ b/scripts/build-wxwidgets-native.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# Build wxWidgets for native macOS (not WASM) +# This is used for the native GAL test harness +# + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +WX_SRC="$PROJECT_ROOT/wxwidgets" +BUILD_DIR="$PROJECT_ROOT/build-native/wxwidgets" +INSTALL_DIR="$PROJECT_ROOT/build-native/wxwidgets-install" +LOG_FILE="$PROJECT_ROOT/tests/logs/wxwidgets-native-build.log" + +mkdir -p "$(dirname "$LOG_FILE")" + +echo "Building wxWidgets for native macOS..." +echo " Source: $WX_SRC" +echo " Build: $BUILD_DIR" +echo " Install: $INSTALL_DIR" +echo " Log: $LOG_FILE" + +# Create build directory +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" + +# Set up paths for homebrew libraries +export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig:/opt/homebrew/opt/libpng/lib/pkgconfig:$PKG_CONFIG_PATH" +export CPPFLAGS="-I/opt/homebrew/include $CPPFLAGS" +export LDFLAGS="-L/opt/homebrew/lib $LDFLAGS" + +# Configure wxWidgets for native macOS with OpenGL support +echo "Configuring..." +"$WX_SRC/configure" \ + --prefix="$INSTALL_DIR" \ + --disable-shared \ + --with-opengl \ + --with-osx_cocoa \ + --disable-webview \ + --disable-mediactrl \ + --with-libpng=sys \ + --with-libjpeg=sys \ + --with-libtiff=sys \ + --with-zlib=sys \ + >> "$LOG_FILE" 2>&1 + +# Build +echo "Building (this may take a while)..." +make -j$(sysctl -n hw.ncpu 2>/dev/null || echo 4) >> "$LOG_FILE" 2>&1 + +# Install +echo "Installing..." +make install >> "$LOG_FILE" 2>&1 + +echo "" +echo "wxWidgets native build complete!" +echo "wx-config: $INSTALL_DIR/bin/wx-config" +echo "" +echo "To use in CMake:" +echo " set(wxWidgets_CONFIG_EXECUTABLE $INSTALL_DIR/bin/wx-config)" +echo " find_package(wxWidgets REQUIRED COMPONENTS core base gl)" diff --git a/tests/gal-regression/baseline/gal-alpha-blending.png b/tests/gal-regression/baseline/gal-alpha-blending.png new file mode 100644 index 0000000000000000000000000000000000000000..09e0f061955b836f2da692491b8e1539af5a92ae GIT binary patch literal 78077 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 WcU{xyfdL-;8*F-j+U_#| literal 0 HcmV?d00001 diff --git a/tests/gal-regression/baseline/gal-circles.png b/tests/gal-regression/baseline/gal-circles.png new file mode 100644 index 0000000000000000000000000000000000000000..989c4b9912cf2bdeca9f711696c0d96265bb658b GIT binary patch literal 92839 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⁣TdFh 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 HS(p6{AQ>ru literal 0 HcmV?d00001 diff --git a/tests/gal-regression/baseline/gal-polygons.png b/tests/gal-regression/baseline/gal-polygons.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b97523aa6ab321922a300101a2ee2780efa947 GIT binary patch literal 79666 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 literal 0 HcmV?d00001 diff --git a/tests/gal-regression/baseline/gal-rectangles.png b/tests/gal-regression/baseline/gal-rectangles.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c22a9a0410b22a191ac8976f0ec7ab00250cb5 GIT binary patch literal 76915 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 bi)F(68_Ivs_xVE>_&4#U$vMxBFIe_}KOJqp literal 0 HcmV?d00001 diff --git a/tests/gal-regression/baseline/gal-transforms.png b/tests/gal-regression/baseline/gal-transforms.png new file mode 100644 index 0000000000000000000000000000000000000000..e5fbc201050a734a2e0fea99a43bbc667654abfb GIT binary patch literal 79688 zcmeHQdt8)N`kxsl7*OUru@wI+v9gNQs(-Y=VyVh zU15jCeFl3N>SLg{eJKya{3PRJDGy6{S-$^A;Rj22S;ET_UY78-19`A~pXK{3-~Xcl z*S;db>ile(gRSzgMXvTB50>wdw>@!cd&8?D|fUf>H=0_`990{S-#(%u*25(+4??P-)HOl z?WwY}^?kO!&(`}-9X<@+q(XZb$M_uB)!Sh<6hJ6O4cl{?x2yx8^zw!MLE zZ}@+^y`gNd>H|lI<+={3b#>LhS>i|Dj@18r`MlY3eRNwpFgHi)lRT;o{d!UeChnI} zW;<6^9j&u095XG!Y$`LzTK%V1mTK*gYh4rC)`z-$?{b7bNs^#>BBxDHyKh4BPZi3& zZjRrJJR|f?YgaV9u~nC|S2ZB0ZLOqj&^*~I*E(gC%jDYn=f8o7LQ%JvI)_;Q(5s4p zQe9uI&iAML*wd=`xL*`^;$%2(Ok3%7`5q(xUsd6jq@Na1X4`V&HHBYxQ%gSUD(zo> z0O?vmKKe+9IDK?hEyOAuce*k5`$`ny@u`01zpPI(S4 z=!5zRQzX~debZTl_Xh%ue~IGwdIaa|VJe%?5ZOpGMY{?)zCMF@zaK&Qx*OqZyh^g+ z^!KUPruL6hWS{mPT<|BHq{)<|ZxE790mc`$r`1Y5f|a@@>E^`c$oD)`8#;4M>*v0L zXoFU!7;-bUhn%R)@ma{1BK4b>b1I|4Nb4%88~x$Drm0)4mj}7H9>oV*RFyo>EuHS`d6L;-%1rm?p=KD!`0Hp86w0YbfJ zYPnte779Pe^o*?b)n7bz)py_PpP>13wy<6pWb!1+=5pjg`vOAVUJROZmT1n_p?rd! zd{{0u^1FyUm6>IF!sGV{bDo(mJZJc=ngXIz$b1z*_nu$f{+zptFlQ$+XHRi5br;Fq z5gscg$AZG#&k{8pl^j-WcoX@eRZ$d0`LhFgmU}?Rl%Ozu_?X?@6Er80X&Yp^AogLO%_uw~+ zGzNt11`zn5i-y<2!}^BlVkOyq158WAk0vBr8c~*sUyMoO~eL(?K+wHG+aos%0-`SFr8n< z$v=_~Prm%%va^duT)SJ=b+zS}bn{bj$h1|GHGu2^;5H#nB2q0aj!7}E$tsV!=F#oY zdUTv~Fb=fb-Q5k9r|zV7 zdxm3F1OJ!&R<`2#)Taz|(Sdt^<^lt*dLQYPnA9sl^9Y(ksUf}sQ5WNd`Q#oi)4zKg z<`X`B9DxqocQo1dcCd`U73Y;|o&AyS=rukOal@s$B}Vh6&B&xBFy))!$-OxcveSjV z_a>e|Bfb}(SY8+7@U9X|)U!`K8llVCuR3%ZQGl1I7X5_K4O(P9<-aDXme|=a1f1p3 z<@+ru2y31o@-BKI!R(hcwBQs%jom8dA=3JqXqkY|(;TO3rH{~b}3>qwM|1ht18`$;ETaEMR7o*QID{#nA4{gnt$_EMhg zM0lcwIQHvoL!Z6YQ^45$$RK~GgM5q(A_Dk+V|LOnRkagdCsoR`cc^-ix zB3kl$Y%!-PhmaZDb^lxB;}KF_&S$EaS=C_D040-!y}I}o1rHO2k)}8lV#3uNYwxHp z0B6Ukgb@bdqW+Y-wa8>bIPL~Lx->v*09ViKXD}UQ3W6y$9l24Wvsxa-;4A5G5j)C{+B=E~G1<4nR6Ot#I7(XVIWK41 zCI3SYR%VnLLc77V1h3oE7J{yW*IX@3yU`1r>gF*8UywWuIG%(g)g`nnScjxMQy|!c zU$OQc|01}6HQAdA5f?C%dWcQ-kBcH?U##8x-a?H!3J~srp9~YZu&D;i^Vk`6)N>b@ zad7vThY-?E(t2;EU7tm7fPU+jY94mzw-MfndsWj@;VZE$sWflON9MH*Y#Ffr9OOY2 zoWCg8vjQqfNrMYw5nkS+0qR5K(md<~lK~YfbT~c!E73A)r5hboIDPCHDbgGp z6Iwr}pt6z5tO=7Dt$VG(WY$r<)a^L2^%{8>i6uYYauKOG+3djR1!1+{tdwLt^<$2g zF(+vFIm#(Nga!7U3cHby4+e--bzBi{Yc0Tz8_#QE__RCLAVkY3D%p=PDI0hQ20ynv zLUi(66;W)INp{~lOxU+-K(Qg@^)~qdhx{#bk;0Y1pDTWCK~i}e@E4MVFE$JVm}Brk zyo?*@1?-=E_%Fh2wkZKRhU*|`0XZ53nl#yEj*#P~fJX!b1|H9b&^2JDuo(39R0Dq! zW^S1XGL4U?20n6=8{|ddL5wNX7)}U(tT%!HhgUZ~4v;TQm-VKwT`G^!IG!qOmmvfQ z_eyB)Jsyfy+&Bfo;}rdc`khkYkCh29SD(SRSD%9=FT)^2JWY1*K3rH+(m`sFFc(BG zYO?*!+6%)2_5w;JGLuU15#1APeZM5}X8aezaZUa>C1(#Z2uZtq25VMdB${#t30Cft z=pYA>K_a+8N>=~C4T6zFSDT*v4w+~Qq zPCTTvzog6OXRIPtI2jwn4w0}yICo(4-NGq;4np%Dpc$e+c9*UaaMn24vcM&fBD5C> zn~e(Pn66p3@i+)J$KNejwTQZM9@d;9qn3I-^PFMXB961W|OQc|A zHi;@Ag{th62G)>1WQW?3AMBUHK<@AW*9K(o)9OKoTqEt7SLEX z;mU7@T&`3>p10RuI^;7__FZ%xnbcj1jwd3r*GN}%OwEHrvCaClr5obEOo`O*e2emD zb%cJyciw|R_L>S|KvRb7ozNat|aCguC zCpI6bt`!AKWiegkU(N8f-Bm%wqu>dI**5Bh=Gpg!@CtMG(Tk?ZLi37goO8ZDD3f2{ROHDT*W3+sv8-i6# z?oddvADO61qVY^!H_V3<7r2*aKGo$)VXxADo&#Qq#UW z>WrYdx_rc_V1BiL_`n*r{MFeS98lf}EBRAl?G|FqAvr?zQi}M7qH~c?mB}{&5GDle zL-ekdBA-g)<|lC*<1;w)=AeQOh`KdHN<*k|@`p~}EsN9_pYo2V9%G44#7NdRf{TDP zjwz_Rg=~&6o(41x#g{}QqHb$xT-c8K2KPC#+UI*EG@bd;Do5~m#Sj`7eir5#$gjvt zJPqovAf1@om~_A~0yTB`o}A5*#v2Kwg z*>-(Z4DclD%P8NQh)(aJ9`+|hn^ls)AgP`>$4H&;9pN$LztJ(yqhqxE0oet2jqRdi zn+OrN+`9I#J(O$4lEEGZdl>BbLtw}8Wd?f~ z>|wB{wGiV3b{t=3u!q4O279pMs4dr;Nxut*`dFt7!F~U&E_^Y}&oDp3{015OI9LsbXD%*rY`b!L zWq|fG<%2>y3@#XhY>?1-Fe4>?f1ig=|oR!7tItn6SxY zh(6BuFRoV>O1m9Wq3RGhlH1Ja+yj7zQH=`qU!mheZ=y2Ckwd~T?alOb#0g|ealD`8 zTx?2N+MJ}$37Rb4@Xjb%zMpFEC&+Zok;Wsy;98Es$hkjY*g7~O01TeH*hyP{?IQt&o@6!$UKT}UpgD?+{EKMbX;)ZzxALdCqOcgRrT0jVN=Fx|bAhRjNhk1++ zvmY5|7R&~SD(8mTh!10LZ&rZ}69Ka!yctPm^LKohQ0gV>g+q@#54Oe=XVZf?n`wv~ zV6!;gR(laS4QbNKR_U8BGLr3VD`BYI~5{H*&1k{TZ438xo>&2#5cHJPW!@*%1IT-S94w3c{K? zjx{gdXG-?z8Na6XeE^wmZbsPz!kS+QYraOF1+1AvS%WErG$7;%Va-^=nmfp|G*W|| zHO~uA*B!bX5Un}JX$_+2a7=3eJytOTaYrIk*@X9jraOeDVTgYOnif-)C9LhMr`|xkWgVa)^4qNr=UXfd4mB$JBBpAw4gEq@9$c0m3AS3dyl;x7UoE&S2ir zQ#{YEGs2x6#G!x?&Uq|M9Ydrv0P*-5X)ryztwBx|CV}bKcps4@laTPdOFuA&oyXDE zaTk#YW&;G4?|<%r8(e%sg`}o^F^(P7wwXKuBAtEhP%;w^2t#9e&E#lX&0{5q*Fjl2k~^!ZBH_f{)L6ys-K!!kEPf z@Ube?!)Q1_PB6t0Oc`c)cLSFrTt-P6L`lM0FA%hSGyMH?95Q+V)fgFtX)1)Ie(>=* zk7fBsI46UWR7U$DTtp!5W=><=^35DcNRuFt(l%<4-Gv39MuDTgJfw|h1Q;eA;()2h(T7>PYmU-9@gSBQe;mMkY230 zKE#yLhaBfH`S*xB^Atm`HaID>DO30h>On+f+?TBGMi_GhWejnPa0J9d_zPOnP%}lI zeQq#^W>AeGMZ%-5Ct&PassM^Rk2H^dlM5bv!ls7WAR>Q(Ge z4)t_(VUCqE{wpcyz>V34zImK?K{|c~+K-~$6}GW@I7e8M(~w7#_4b|ZF_KfzVWy{# zaEat4Va|tary9Fom{!r797ERD%pwf=RQO9})wIt=9YU*t)A~L6l|<{`L{3ZPfjUBd z^YAj^AfL-IHKF%%!qoW)=PSa1VmPXe@Jma=;p~JynOtnf#u!D%K+f}u=omriWQ@z$ z81}YIzX%C;1sHctPF^8ACS2F4T-dCXEgp9yeNo|Lt|$)vpJv{KwP;JBy8fY{Ig$1Z zDdwOQ=n(^!8{>_r#~!L4;{_#O%_&DrGx2($9*EZ~YqYC}U`6Q+Cs>X3ESw<(mSUY@ zD(px4ZwRuKV2d29bP{RB0Sv(k4EB~luM0AS{1zCpcrqnsFW+(VTu!aMlb;|ly(ls3 z@}YSQlqfDDXJSpHF%$UI(?Y_Jhwe4dKxO57tEptd5Xopj6Cu=`7lKmqAE;#N>)>oO za5V`5Ws#3kWxpcC)nagSz}3naf>l99FsxbvM8ib(3r^&7I+0@~_K6_vk0R~u-F^_9 z2&e{3WLyjx3?}j{#t}M^je-;T8=XjPlYJscPo8wU3lW5K#hh2RRzChEoycF1iIh^& zWC~6si%z84jl^Hj5hMv~vCl(*T}NJ4!;`@B?g%FUW%bZ1tpnTvA=nmr1Lw*#Vs8_r zW;sGlGiB?a1gSYrso9ebz4O4I9Yt~#xgB2R2|XinF#I-5=X+HT(Y#gS#>+(5t4IXy0|F4r)4!N^y z+@MuDXxL9$o9y)lAMKq9Jx)HbTtw=KHal%jS_#F6xKL~Ohf8#Qb-Ep83xI{?=dDSj zyF}geU_VN*$aQ`Y% zgueLkmlZc|*)pJ5shkJlu5@%k;&K3!FsCFWuM=#_l_VEW3>q6;XjV@6G|KllG_L@B zMkaQ$m5KdKW9&hv*+Lun!B_Z>xR>-_WS1?|8BC{hjc_HaLv|@jE9W-YGbGo>= zWpmQnd%(uC#0@d<3{%@83DG zIVgF>-f_!_;}(sH)RI-K-OG--zZ*3hRyEwgAA(qK3D?!cmmt-L-Vtk@VtQ|Qv(n>g znacBB>sHMgaM_u6U;(6MClm*ykk&>{9Xm-L<#xN-Z60)lGd!i52yI^WrD*ngwX7e4 z?YURT#MATr1J7^sp6pv=csV=qZ|k7E^T_3>qnBDS1n62o`eeT3WC&WB+3Q07+HnhF z#U{QZ>g<}&SU_or|;?&@7D*X0FdNNJ7vOM3Q7Vx)L=sN=~Njf)K z>zsP$8n|x5P1_e;>YZ;b?s@1%GRULv`BCTZ$>#+R-Zp|CCheS@stP3eGOpcKBR)Cq zh;6^k^2`F#ptR$!R?WzkEnQ95fwwsIYAOOJrwCgR9k00@wWC1~Yyh9p+DK(IEqmpqQ>_H0x2far$J2K%$&=4-BE{RT+P2PUC!56G5AqwQ+!9f!`&eElbY6#4?XpI)QQS-G?gfMWe=+R-%TQlGT|SSM6Y_C%In1z z=&jiw~2cq9?!2~pm*j#Wij zGLOc=)WGAGjA}`h^WagSIv0@!N1MSz!Azp(wZxW+F`QK$<<*2p+Z{{3X;PP*1LqB? zL)TEB-*S{3VPAXa)qNL&2P-*JyYhy$R5hT;1kr_Pa6?NPEdPenVCYl$`&QEmSma$I zm;ck&GyAAD;`uh|-2$2#Ch^)>tp_5a%4@T(T1Rvruz}pKMJ98$#mRg^Cv(&>8U8CR zY-%F9o7kf6#!^AAxT|;W_94fGXdYe3j#EwI&UTfjbX-f!iR|2)1Bsux~j+dfd6g zJtGi+gQ`+tMo@%G65P7b1GI`P`|z~yQ^m1!J1&Q9|3LTXmwscPF#Ek_TR5hm5Olm0 zcn*c|X`9H#0hpHH#(@UAtdQnma5D@yt;fiEKlC6A70eY5Q^Wd9*s%2Ek{X!Ekqu;- z9ws8VOy6MNcZB#)a_?+sk{BMrYjDubFv`?t)?YBMl0LG zRq;IgPEF+6NE6g!iFjv_w!A>hSQi&X|D;LLh2O=^LyF|ReUzA`9|Il&$si4I#qK7O z4^812uoGL!y-na&LSCXevRs&RMv$Pi+AvWVx2DE}?*bTHqa;1{{m~x#3YamZpDICW zBlT}{YEm70kc=@NszpwGxBppWFH2xEAu~`14jGvP8sByHJ(==JwgedIwyQ0?9lysi zjo-Z)tV@{m!i{Hseoa%bJW5tn)hBs+&Ve7vgGEGh!*x$hBghsv7eVz_Nh-KdVtVe}D#D{b z3lpOyUxFe=jqoGjR#HODOrO!9zta+g3*{ofVMO5k?%(5N=9w8|?;%#G;gRc2!c9>f zRlwN+NXt}XGYv@t9CNK0EWOQDVXu%&phoz`G{E*BVlip*D^rFLqxwPE8yQRJSc4p6 zIlW5b!ka<&Gcl?`NUeGU#hf1s@3BZFJ-PGMk&n=x+{n#gYWpe?Z#PY`r?@F_weDK3 za`zM2eoHJ>&t}8c(*W%&99`K{G=#2`2wk@+U1OZ6aVUNS1k=t53!-ilx~xuBF2^s{ z(As84VdYHq0k@W~P9JiE>ovYn*jET#1qThLt+R_wGm~--95)02PfI{UqjSsOI7s5b zBBViPoPG7`h(iU7LDrx4GCkY0>cBj>3= z_rQthiP$s7HiQw?If|&xVrr-SD@(vm{R%ZaJAIAlVC}Fki0Bs~H*eR{eNa#G_L!1H zx2Ge~h1)#2Mck5=S%lHkk-ZH>KSfUatkORZt5zLreTE$%ih>AKiG1SDN(M3nkjARmy$F2~0{4@!2ckGZj4f@E+O0oQW307_FUzb6bj zj4+6p0I9nlkd3=@Id&~-U*S?2`eNS+gRBxUvBS;0`cIIZoL zDav+rl6DEPxcyW&$**)@m#2G}gXoQQ>mHN@{*?~-fl%@XkgJ}GZ;I29wNP;|`j>79 zQT=Q=4k9tZeI_N4N&>rjAgW2~egr{WaClvVObr2MnYtv#3(C3XM3SQco}U~P&Iu6l zD)Q6zX8-RyBuHL~A(D^Tv~qX!EY0XBZeRPi3guy6DUroUEW?BQ`^YU=>l}s$co6E+ z*QD!aZs$yv+%f^nccoXQ-3Zt_&i^J4MK@Cy{sy0mqE$qV){UM^TnXKs6c>(?AvU=<}*#*i};iYj|G+Pd;TfaU*Vpm4Y0-w3!Pxtk*`SNiKeR$@gWDGpN#6ZlK!`HPkF#gwV5aVl{!f!mbZRSqn zT(A!s)QcMw%Wq(nob0Uqif{eevkLW`$>IxLl4Dlnp53)h0}S0+3bf}`ss^|N#AwVE zjp^H)8<)5E$M=77vd0O=b@D23SEu^9ec}tFC-xm5{Bd{9Me(AlxcB>$1nbZZm_Sm5 z(a+bHlRGbEbuxDQ^)*-d#;!CfiV_B=tvx(`ZL{e3sOgI*lA;4Aq|gBE=N(?>f*sGL z@tsnI(1uNUnnKy%w^z}OpujmVaaBNaGjDAN@wCUMa8`+3GjW$%T@$id;3P_ z=6tQ1n@?=XavaJf;I`rx?VCj$(Rn21RfBWr04w!Q*fFxVG`LV1aKX!GzOSU>PFiE0 z?R)Fvfa4>FN;eN$IEcXCyH1aH@b4VO(XRIyi8+YWlod|ei) z0PP9TUhZ8@99TaD!sOX+VQ?;REr2WBm!+z10&2|eN;ajJL>O!7K(Av1QBOG1X$=yH zgZgNdc2J1fRBkXqtp{*RDMblS3hq_qY>bqsR8EB4Tyj7Wq@IP|D>6b7d|Me~b*O;TtHBf^IP0+t z>W4i&H$>esyq(?kLHK@ir0C?hD#Gl8!aI&qg_#Y@nWsDTpQ}%LsM>IVu&A4)+SiYG zi7ifHg_rs)mKB?WFdOAmj;sn@A5^f`Nk1HxqLFH0JDr)dV4n*?2I^+AqD@?XW%Q#vb=Wfq?3c}su12_2*Lp7n@vwmK_&;b60qx@3Sm zeZY1us>wFqhF%Ts5USk1L2RdxlCVT9d%+)i0 zI$m=5H^VvKha|T6OusiR4T7t-eB4C>0u+#7*;8<5I6{TPD?*y^zt}R3_~oqHXz`&|C4q!^}y6IhbT#Z3?&eZ>t>hS_1Af-E#S29JD%)`DElzKURxX-TTO^FG5= z{6<7ayc0ZVlmSJ-Rqkg3Q#4z3S$LC~d!a0u0^oU05lbVj2UzoCd=uQ@d$|>c!1@`K zi@@U^bq1pKP;}c7-+NM;{>NX*O~Ad7RLv2Sh40jCfC-l6j1rqohYZ(Sor_>;0@f?x zs`<(pYD?8?*@+qVNOv&O<<(5ell3k;qRj<&3fd_rDL=P`>_v~l#pa@KhiPMS{(y9!6|wk4xdDG1=vcbMA%_; zj#q(wrOJ&P>U3xCuZk`(i9Y)^%ye*Bw~BIaOEhwR#i6vY!UbhlvWt8c|4qP@jWAO5 zs&xxS-Xgh-q;s(OwN5mdB^qK zX964#Sz@f6_jI-PWLQCx3+IIXL=LKnUyn2%TPaJ(no!tf-SVCm*zPSA`nl74&G!0+ z3(ALEZF7f2hiBFM+g_cZ%dg{u2p)_1Evd@rx_3X91<4|4ll1D~grp<0H33e6LU>3u z9VOW*RR(9r-e=-MF^_wX**>#Z2 zZ|}c%n_}BV!QwuP`z-FaA;t@Rg~fdq_gUO;d$73|^0{BIxXS4%Rp~iQLfAP80aM(C!G(ZJ6ua^ zuNdZMn4e+(HsE`quQ1HdFh9fmt%VpTr0@7L1HBCNGSKS+X50EF1HBCNGR)t`J-4-V43`y$Jq`9v?eyTZBIC{{ZE?cM$*p literal 0 HcmV?d00001 diff --git a/tests/gal-regression/native/CMakeLists.txt b/tests/gal-regression/native/CMakeLists.txt new file mode 100644 index 0000000..9febf2c --- /dev/null +++ b/tests/gal-regression/native/CMakeLists.txt @@ -0,0 +1,120 @@ +cmake_minimum_required(VERSION 3.16) +project(gal_native_test) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# Suppress deprecation warnings on macOS +if(APPLE) + add_compile_definitions(GL_SILENCE_DEPRECATION) +endif() + +# Find wxWidgets (system installation) +set(wxWidgets_CONFIG_EXECUTABLE "/opt/homebrew/bin/wx-config") +find_package(wxWidgets REQUIRED COMPONENTS core base gl) +include(${wxWidgets_USE_FILE}) + +# Find other required packages +find_package(OpenGL REQUIRED) +find_package(GLEW REQUIRED) + +# KiCad source root +set(KICAD_ROOT ${CMAKE_SOURCE_DIR}/../../../kicad) + +# Generated shader files +set(SHADER_SOURCES + ${CMAKE_SOURCE_DIR}/generated/glsl_kicad_frag.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_kicad_vert.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_base.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_1_frag_color.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_1_frag_luma.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_1_vert.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_2_frag.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_2_vert.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_3_frag.cpp + ${CMAKE_SOURCE_DIR}/generated/glsl_smaa_pass_3_vert.cpp +) + +# KiCad OpenGL GAL sources +set(KICAD_GAL_SOURCES + ${KICAD_ROOT}/common/gal/opengl/opengl_gal.cpp + ${KICAD_ROOT}/common/gal/opengl/gl_context_mgr.cpp + ${KICAD_ROOT}/common/gal/opengl/shader.cpp + ${KICAD_ROOT}/common/gal/opengl/vertex_manager.cpp + ${KICAD_ROOT}/common/gal/opengl/vertex_item.cpp + ${KICAD_ROOT}/common/gal/opengl/vertex_container.cpp + ${KICAD_ROOT}/common/gal/opengl/cached_container.cpp + ${KICAD_ROOT}/common/gal/opengl/cached_container_gpu.cpp + ${KICAD_ROOT}/common/gal/opengl/cached_container_ram.cpp + ${KICAD_ROOT}/common/gal/opengl/noncached_container.cpp + ${KICAD_ROOT}/common/gal/opengl/gpu_manager.cpp + ${KICAD_ROOT}/common/gal/opengl/opengl_compositor.cpp + ${KICAD_ROOT}/common/gal/opengl/antialiasing.cpp + ${KICAD_ROOT}/common/gal/opengl/utils.cpp + ${KICAD_ROOT}/common/gal/opengl/gl_resources.cpp + ${KICAD_ROOT}/common/gal/graphics_abstraction_layer.cpp + ${KICAD_ROOT}/common/gal/color4d.cpp + ${KICAD_ROOT}/common/gal/gal_display_options.cpp + ${KICAD_ROOT}/common/gal/hidpi_gl_canvas.cpp +) + +# Our stub and test files +set(STUB_SOURCES + ${CMAKE_SOURCE_DIR}/kicad_stubs.cpp + ${CMAKE_SOURCE_DIR}/gal_test_accessor.cpp + ${CMAKE_SOURCE_DIR}/../scenarios/gal_test_scenarios.cpp +) + +# Main executable +add_executable(gal_native_test + gal_native_test.cpp + ${STUB_SOURCES} + ${KICAD_GAL_SOURCES} + ${SHADER_SOURCES} +) + +# Include directories - our stubs first, then KiCad, then wxWidgets +target_include_directories(gal_native_test PRIVATE + # Our stubs (for KiCad-specific types not in wxWidgets) + ${CMAKE_SOURCE_DIR} + ${CMAKE_SOURCE_DIR}/../scenarios + ${CMAKE_SOURCE_DIR}/generated + + # KiCad includes + ${KICAD_ROOT}/include + ${KICAD_ROOT}/include/gal + ${KICAD_ROOT}/include/gal/opengl + ${KICAD_ROOT}/common # For gal/opengl/antialiasing.h + + # KiCad libs + ${KICAD_ROOT}/libs/kimath/include + ${KICAD_ROOT}/libs/kimath/include/math + ${KICAD_ROOT}/libs/kimath/include/geometry + ${KICAD_ROOT}/libs/core/include + + # KiCad thirdparty + ${KICAD_ROOT}/thirdparty/thread-pool + + # System includes + ${OPENGL_INCLUDE_DIR} + ${GLEW_INCLUDE_DIRS} + + # Homebrew dependencies + /opt/homebrew/include # nlohmann-json, clipper2 +) + +# Link libraries +target_link_libraries(gal_native_test + ${wxWidgets_LIBRARIES} + OpenGL::GL + GLEW::GLEW +) + +# Compile definitions +target_compile_definitions(gal_native_test PRIVATE + GAL_TEST_BUILD=1 +) + +message(STATUS "KiCad root: ${KICAD_ROOT}") +message(STATUS "wxWidgets libraries: ${wxWidgets_LIBRARIES}") +message(STATUS "Building GAL native test with actual KiCad OPENGL_GAL sources") diff --git a/tests/gal-regression/native/config.h b/tests/gal-regression/native/config.h new file mode 100644 index 0000000..88a3f7a --- /dev/null +++ b/tests/gal-regression/native/config.h @@ -0,0 +1,26 @@ +// Minimal config.h for native GAL test +// Based on KiCad's generated config +#ifndef KICAD_CONFIG_H +#define KICAD_CONFIG_H + +// Version info +#define KICAD_MAJOR_VERSION 8 +#define KICAD_MINOR_VERSION 0 +#define KICAD_PATCH_VERSION 0 + +// Enable OpenGL +#define KICAD_USE_OCC 0 +#define KICAD_USE_EGL 0 + +// Platform detection +#ifdef __APPLE__ +#define KICAD_MACOS 1 +#endif + +// Math +#define KICAD_USE_STDROUND 1 + +// Ensure types are properly sized +#include + +#endif // KICAD_CONFIG_H diff --git a/tests/gal-regression/native/gal_native_test.cpp b/tests/gal-regression/native/gal_native_test.cpp new file mode 100644 index 0000000..01f8c70 --- /dev/null +++ b/tests/gal-regression/native/gal_native_test.cpp @@ -0,0 +1,312 @@ +/** + * Native GAL Test Application + * + * This app uses KiCad's actual OPENGL_GAL to render test scenarios + * and captures baseline screenshots for visual regression testing. + * + * The test scenarios call GAL API methods (gal->DrawLine(), gal->DrawCircle(), etc.) + * which are rendered by the real OPENGL_GAL implementation. + */ + +// Our stubs - includes wx/wx.h from system wxWidgets +#include "kicad_stubs.h" + +// KiCad GAL headers +#include +#include + +// stb_image_write for PNG output +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" + +// Standard library +#include +#include +#include +#include +#include + +// Test accessor for private GAL members +#include "gal_test_accessor.h" + +// Test scenarios +#include "gal_test_scenarios.h" + +namespace fs = std::filesystem; + +// Global config +static std::string g_outputDir = "../baseline"; +static int g_width = 800; +static int g_height = 600; +static bool g_showWindow = false; + +/** + * Save a screenshot by reading directly from the compositor's FBO + * This bypasses macOS framebuffer reading issues by reading the FBO directly + */ +bool SaveScreenshot(const std::string& path, KIGFX::OPENGL_GAL* gal, int width, int height) { + glFinish(); + + // Try reading from FBO directly + std::vector pixels; + int readWidth = 0, readHeight = 0; + + GLuint fboId = GetCompositorMainFBO(gal); + unsigned int bufferHandle = GetMainBufferHandle(gal); + GLuint textureId = GetCompositorMainBufferTexture(gal); + + std::cout << "FBO ID: " << fboId << ", Buffer handle: " << bufferHandle + << ", Texture ID: " << textureId << std::endl; + + if (ReadCompositorFBOPixels(gal, pixels, &readWidth, &readHeight)) { + std::cout << "Read from FBO: " << readWidth << "x" << readHeight << std::endl; + } else { + std::cerr << "Failed to read from FBO, falling back to texture read" << std::endl; + // Fallback to texture read + readWidth = width; + readHeight = height; + pixels.resize(readWidth * readHeight * 4); + glBindTexture(GL_TEXTURE_2D, textureId); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); + } + + // Check for GL errors + GLenum err = glGetError(); + if (err != GL_NO_ERROR) { + std::cerr << "GL error: 0x" << std::hex << err << std::dec << std::endl; + } + + // Debug: Check if we got any non-black pixels and show some sample values + bool hasContent = false; + int nonBlackCount = 0; + for (size_t i = 0; i < pixels.size(); i += 4) { + if (pixels[i] > 0 || pixels[i+1] > 0 || pixels[i+2] > 0) { + hasContent = true; + nonBlackCount++; + if (nonBlackCount <= 3) { + int pixelIdx = i / 4; + int px = pixelIdx % readWidth; + int py = pixelIdx / readWidth; + std::cout << " Sample pixel at (" << px << "," << py << "): RGBA(" + << (int)pixels[i] << "," << (int)pixels[i+1] << "," + << (int)pixels[i+2] << "," << (int)pixels[i+3] << ")" << std::endl; + } + } + } + std::cout << "Has non-black content: " << (hasContent ? "YES" : "NO"); + if (hasContent) std::cout << " (" << nonBlackCount << " non-black pixels)"; + std::cout << std::endl; + + // Flip vertically (OpenGL has origin at bottom-left) + stbi_flip_vertically_on_write(1); + + int result = stbi_write_png(path.c_str(), readWidth, readHeight, 4, pixels.data(), readWidth * 4); + + if (result) { + std::cout << "Saved: " << path << std::endl; + } else { + std::cerr << "Failed to save: " << path << std::endl; + } + + return result != 0; +} + +/** + * Test frame containing the OPENGL_GAL canvas + */ +class GALTestFrame : public wxFrame { +public: + GALTestFrame() + : wxFrame(nullptr, wxID_ANY, "GAL Native Test", wxDefaultPosition, wxSize(g_width, g_height)) + { + // Create display options + KIGFX::GAL_DISPLAY_OPTIONS displayOptions; + KIGFX::VC_SETTINGS vcSettings; + + std::cout << "Creating OPENGL_GAL instance...\n"; + + try { + m_gal = new KIGFX::OPENGL_GAL( + vcSettings, + displayOptions, + this, // parent window + nullptr, // mouse listener + nullptr, // paint listener + "GAL Native Test" // name + ); + } catch (const std::exception& e) { + std::cerr << "Failed to create OPENGL_GAL: " << e.what() << std::endl; + Close(); + return; + } + + std::cout << "OPENGL_GAL created successfully\n"; + + // Set up sizer + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); + sizer->Add(m_gal, 1, wxEXPAND); + SetSizer(sizer); + + // Bind close event + Bind(wxEVT_CLOSE_WINDOW, &GALTestFrame::OnClose, this); + + // Run tests after the frame is shown + CallAfter(&GALTestFrame::RunTests); + } + + ~GALTestFrame() { + // GAL will be deleted by wxWidgets when frame closes + } + + void OnClose(wxCloseEvent& event) { + event.Skip(); + } + + void RunTests() { + if (!m_gal) { + wxTheApp->ExitMainLoop(); + return; + } + + // Create output directory + fs::create_directories(g_outputDir); + + // Set up the viewport - use ResizeScreen to properly initialize compositor + m_gal->ResizeScreen(g_width, g_height); + m_gal->SetClearColor(KIGFX::COLOR4D(0.1, 0.1, 0.15, 1.0)); + + // CRITICAL: Set worldUnitLength for 1:1 world-to-screen coordinate mapping + // GAL default worldUnitLength is for PCB nanometers (3.937e-8), which would + // compress our pixel-scale coordinates (0-800) to ~0.003 screen pixels total! + // We need: worldScale = screenDPI * worldUnitLength * zoomFactor = 1.0 + // With screenDPI=91 and zoomFactor=1.0, worldUnitLength should be 1/91 + m_gal->SetWorldUnitLength(1.0 / ADVANCED_CFG::GetCfg().m_ScreenDPI); + + // Set up coordinate transformation for 1:1 world-to-screen mapping + // LookAtPoint should be at center, ZoomFactor of 1.0 gives 1:1 mapping + m_gal->SetLookAtPoint(VECTOR2D(g_width / 2.0, g_height / 2.0)); + m_gal->SetZoomFactor(1.0); + m_gal->ComputeWorldScreenMatrix(); + + // Get framebuffer size for screenshots + wxSize clientSize = m_gal->GetClientSize(); + double scaleFactor = m_gal->GetContentScaleFactor(); + int fbWidth = (int)(clientSize.GetWidth() * scaleFactor); + int fbHeight = (int)(clientSize.GetHeight() * scaleFactor); + + std::cout << "Canvas size: " << g_width << "x" << g_height << "\n"; + std::cout << "Client size: " << clientSize.GetWidth() << "x" << clientSize.GetHeight() << "\n"; + std::cout << "Framebuffer size: " << fbWidth << "x" << fbHeight << "\n"; + std::cout << "Scale factor: " << scaleFactor << "\n\n"; + + // Get scenario count + int scenarioCount = GALTest::GetScenarioCount(); + std::cout << "Running " << scenarioCount << " test scenarios...\n\n"; + + // Run each scenario + int passed = 0; + for (int i = 0; i < scenarioCount; i++) { + const char* name = GALTest::GetScenarioName(i); + std::cout << "Scenario " << i << ": " << name << "... "; + + // Render using proper GAL sequence + m_gal->LockContext(i); + m_gal->BeginDrawing(); + + // Must call SetTarget after BeginDrawing to set m_currentManager + m_gal->SetTarget(KIGFX::TARGET_NONCACHED); + + // Clear all targets (FBOs) to prevent content accumulation between scenarios + m_gal->ClearTarget(KIGFX::TARGET_NONCACHED); + + // Clear the screen (window framebuffer) + m_gal->ClearScreen(); + + // Render the scenario using GAL API + GALTest::RenderScenario(m_gal, i, g_width, g_height); + + // EndDrawing renders vertices to FBO, composites to screen, swaps buffers + m_gal->EndDrawing(); + m_gal->UnlockContext(i); + + // Save screenshot by reading directly from compositor's texture + std::string filename = g_outputDir + "/gal-" + name + ".png"; + if (SaveScreenshot(filename, m_gal, fbWidth, fbHeight)) { + std::cout << "OK\n"; + passed++; + } else { + std::cout << "FAILED\n"; + } + } + + std::cout << "\nResults: " << passed << "/" << scenarioCount << " scenarios saved\n"; + + m_passed = passed; + m_total = scenarioCount; + + // Close if not showing window + if (!g_showWindow) { + Close(); + } + } + + int GetPassed() const { return m_passed; } + int GetTotal() const { return m_total; } + +private: + KIGFX::OPENGL_GAL* m_gal = nullptr; + int m_passed = 0; + int m_total = 0; +}; + +/** + * Test application + */ +class GALTestApp : public wxApp { +public: + bool OnInit() override { + // Parse command line + for (int i = 1; i < argc; i++) { + wxString arg = argv[i]; + if (arg == "--output" && i + 1 < argc) { + g_outputDir = argv[++i].ToStdString(); + } else if (arg == "--width" && i + 1 < argc) { + g_width = wxAtoi(argv[++i]); + } else if (arg == "--height" && i + 1 < argc) { + g_height = wxAtoi(argv[++i]); + } else if (arg == "--show") { + g_showWindow = true; + } else if (arg == "--help") { + std::cout << "Usage: gal_native_test [options]\n"; + std::cout << " --output Output directory for baseline PNGs\n"; + std::cout << " --width Canvas width (default: 800)\n"; + std::cout << " --height Canvas height (default: 600)\n"; + std::cout << " --show Show window (default: headless)\n"; + return false; + } + } + + std::cout << "GAL Native Test - OPENGL_GAL Baseline Generator\n"; + std::cout << "================================================\n\n"; + + // Initialize GLEW + glewExperimental = GL_TRUE; + + m_frame = new GALTestFrame(); + m_frame->Show(true); + + return true; + } + + int OnExit() override { + if (m_frame) { + return (m_frame->GetPassed() == m_frame->GetTotal()) ? 0 : 1; + } + return 1; + } + +private: + GALTestFrame* m_frame = nullptr; +}; + +wxIMPLEMENT_APP(GALTestApp); diff --git a/tests/gal-regression/native/gal_test_accessor.cpp b/tests/gal-regression/native/gal_test_accessor.cpp new file mode 100644 index 0000000..73d0d37 --- /dev/null +++ b/tests/gal-regression/native/gal_test_accessor.cpp @@ -0,0 +1,113 @@ +/** + * GAL Test Accessor Implementation + * + * Uses a member pointer technique to access private members without + * the #define private public hack that breaks standard library headers. + */ + +#include "gal_test_accessor.h" +#include "kicad_stubs.h" + +#include +#include + +// Template-based private member accessor trick +// See: https://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html + +template +struct result { + typedef typename Tag::type type; + static type ptr; +}; + +template +typename result::type result::ptr; + +template +struct rob : result { + struct filler { + filler() { result::ptr = p; } + }; + static filler filler_obj; +}; + +template +typename rob::filler rob::filler_obj; + +// Tags for the private members we need to access +struct OPENGL_GAL_compositor { typedef KIGFX::OPENGL_COMPOSITOR* KIGFX::OPENGL_GAL::*type; }; +struct OPENGL_GAL_mainBuffer { typedef unsigned int KIGFX::OPENGL_GAL::*type; }; +struct OPENGL_COMPOSITOR_mainFbo { typedef GLuint KIGFX::OPENGL_COMPOSITOR::*type; }; + +// Instantiate the accessors +template struct rob; +template struct rob; +template struct rob; + +GLuint GetCompositorMainBufferTexture(KIGFX::OPENGL_GAL* gal) { + // Get the compositor pointer using the member pointer accessor + KIGFX::OPENGL_COMPOSITOR* compositor = gal->*result::ptr; + unsigned int mainBuffer = gal->*result::ptr; + + if (compositor && mainBuffer > 0) { + return compositor->GetBufferTexture(mainBuffer); + } + return 0; +} + +void GetCompositorBufferSize(KIGFX::OPENGL_GAL* gal, int* width, int* height) { + KIGFX::OPENGL_COMPOSITOR* compositor = gal->*result::ptr; + + if (compositor) { + VECTOR2I size = compositor->GetScreenSize(); + *width = size.x; + *height = size.y; + } else { + *width = 0; + *height = 0; + } +} + +GLuint GetCompositorMainFBO(KIGFX::OPENGL_GAL* gal) { + KIGFX::OPENGL_COMPOSITOR* compositor = gal->*result::ptr; + if (compositor) { + return compositor->*result::ptr; + } + return 0; +} + +unsigned int GetMainBufferHandle(KIGFX::OPENGL_GAL* gal) { + return gal->*result::ptr; +} + +bool ReadCompositorFBOPixels(KIGFX::OPENGL_GAL* gal, std::vector& pixels, int* width, int* height) { + KIGFX::OPENGL_COMPOSITOR* compositor = gal->*result::ptr; + unsigned int mainBuffer = gal->*result::ptr; + + if (!compositor || mainBuffer == 0) { + return false; + } + + GLuint mainFbo = compositor->*result::ptr; + + // Get size from compositor + VECTOR2I size = compositor->GetScreenSize(); + *width = size.x; + *height = size.y; + + // Compute attachment point: GL_COLOR_ATTACHMENT0 + (mainBuffer - 1) + GLenum attachmentPoint = GL_COLOR_ATTACHMENT0_EXT + (mainBuffer - 1); + + // Bind the FBO for reading + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mainFbo); + glReadBuffer(attachmentPoint); + + // Read pixels + pixels.resize((*width) * (*height) * 4); + glReadPixels(0, 0, *width, *height, GL_RGBA, GL_UNSIGNED_BYTE, pixels.data()); + + // Unbind FBO + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + + return true; +} diff --git a/tests/gal-regression/native/gal_test_accessor.h b/tests/gal-regression/native/gal_test_accessor.h new file mode 100644 index 0000000..d96a0a6 --- /dev/null +++ b/tests/gal-regression/native/gal_test_accessor.h @@ -0,0 +1,29 @@ +/** + * GAL Test Accessor + * + * Provides access to OPENGL_GAL internal members for testing purposes. + * This uses a technique to access private members without modifying KiCad headers. + */ + +#ifndef GAL_TEST_ACCESSOR_H +#define GAL_TEST_ACCESSOR_H + +#include +#include + +// Forward declarations +namespace KIGFX { + class OPENGL_GAL; + class OPENGL_COMPOSITOR; +} + +// Test accessor functions - implemented in gal_test_accessor.cpp +GLuint GetCompositorMainBufferTexture(KIGFX::OPENGL_GAL* gal); +void GetCompositorBufferSize(KIGFX::OPENGL_GAL* gal, int* width, int* height); +GLuint GetCompositorMainFBO(KIGFX::OPENGL_GAL* gal); +unsigned int GetMainBufferHandle(KIGFX::OPENGL_GAL* gal); + +// Read pixels directly from the compositor's FBO +bool ReadCompositorFBOPixels(KIGFX::OPENGL_GAL* gal, std::vector& pixels, int* width, int* height); + +#endif // GAL_TEST_ACCESSOR_H diff --git a/tests/gal-regression/native/generate_shaders.py b/tests/gal-regression/native/generate_shaders.py new file mode 100644 index 0000000..402b4fb --- /dev/null +++ b/tests/gal-regression/native/generate_shaders.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +""" +Generate C++ shader headers from KiCad GLSL files. + +This script converts GLSL shader files to C++ headers compatible with +KiCad's BUILTIN_SHADERS namespace. +""" + +import os +import sys + +def convert_shader_to_cpp(source_path, var_name): + """Convert a shader file to C++ header content.""" + with open(source_path, 'rb') as f: + data = f.read() + + # Convert to hex array + hex_values = ', '.join(f'0x{b:02x}' for b in data) + hex_values += ', 0x00' # Null terminate + + array_size = len(data) + + header_content = f"""// Auto-generated shader header from {os.path.basename(source_path)} +#ifndef {var_name.upper()}_H +#define {var_name.upper()}_H + +#include + +namespace KIGFX {{ +namespace BUILTIN_SHADERS {{ + extern std::string {var_name}; +}} +}} + +#endif // {var_name.upper()}_H +""" + + cpp_content = f"""// Auto-generated from {os.path.basename(source_path)} +#include +#include "{var_name}.h" + +namespace KIGFX {{ +namespace BUILTIN_SHADERS {{ + +static unsigned char {var_name}_bytes[] = {{ {hex_values} }}; + +std::string {var_name} = std::string(reinterpret_cast({var_name}_bytes), {array_size}); + +}} +}} +""" + + return header_content, cpp_content + +def main(): + script_dir = os.path.dirname(os.path.abspath(__file__)) + kicad_root = os.path.abspath(os.path.join(script_dir, '..', '..', '..', 'kicad')) + shaders_dir = os.path.join(kicad_root, 'common', 'gal', 'shaders') + + output_dir = os.path.join(script_dir, 'generated') + os.makedirs(output_dir, exist_ok=True) + + shaders = [ + ('kicad_frag.glsl', 'glsl_kicad_frag'), + ('kicad_vert.glsl', 'glsl_kicad_vert'), + ('smaa_base.glsl', 'glsl_smaa_base'), + ('smaa_pass_1_frag_color.glsl', 'glsl_smaa_pass_1_frag_color'), + ('smaa_pass_1_frag_luma.glsl', 'glsl_smaa_pass_1_frag_luma'), + ('smaa_pass_1_vert.glsl', 'glsl_smaa_pass_1_vert'), + ('smaa_pass_2_frag.glsl', 'glsl_smaa_pass_2_frag'), + ('smaa_pass_2_vert.glsl', 'glsl_smaa_pass_2_vert'), + ('smaa_pass_3_frag.glsl', 'glsl_smaa_pass_3_frag'), + ('smaa_pass_3_vert.glsl', 'glsl_smaa_pass_3_vert'), + ] + + generated_cpp_files = [] + + for shader_file, var_name in shaders: + source_path = os.path.join(shaders_dir, shader_file) + + if not os.path.exists(source_path): + print(f"Warning: {source_path} not found, skipping") + continue + + header_content, cpp_content = convert_shader_to_cpp(source_path, var_name) + + header_path = os.path.join(output_dir, f'{var_name}.h') + cpp_path = os.path.join(output_dir, f'{var_name}.cpp') + + with open(header_path, 'w') as f: + f.write(header_content) + + with open(cpp_path, 'w') as f: + f.write(cpp_content) + + generated_cpp_files.append(cpp_path) + print(f"Generated {var_name}.h and {var_name}.cpp") + + print(f"\nGenerated {len(generated_cpp_files)} shader files in {output_dir}") + +if __name__ == '__main__': + main() diff --git a/tests/gal-regression/native/generated/glsl_kicad_frag.cpp b/tests/gal-regression/native/generated/glsl_kicad_frag.cpp new file mode 100644 index 0000000..4b26c47 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_kicad_frag.cpp @@ -0,0 +1,13 @@ +// Auto-generated from kicad_frag.glsl +#include +#include "glsl_kicad_frag.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_kicad_frag_bytes[] = { 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x49, 0x43, 0x41, 0x44, 0x2c, 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x45, 0x44, 0x41, 0x20, 0x43, 0x41, 0x44, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x36, 0x20, 0x43, 0x45, 0x52, 0x4e, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x36, 0x20, 0x4b, 0x69, 0x63, 0x61, 0x64, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x73, 0x2e, 0x74, 0x78, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x40, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x4d, 0x61, 0x63, 0x69, 0x65, 0x6a, 0x20, 0x53, 0x75, 0x6d, 0x69, 0x6e, 0x73, 0x6b, 0x69, 0x20, 0x3c, 0x6d, 0x61, 0x63, 0x69, 0x65, 0x6a, 0x2e, 0x73, 0x75, 0x6d, 0x69, 0x6e, 0x73, 0x6b, 0x69, 0x40, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x63, 0x68, 0x3e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x62, 0x75, 0x74, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x6f, 0x6c, 0x64, 0x2d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x67, 0x70, 0x6c, 0x2d, 0x32, 0x2e, 0x30, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x35, 0x31, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, 0x20, 0x4d, 0x41, 0x20, 0x20, 0x30, 0x32, 0x31, 0x31, 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, 0x55, 0x53, 0x41, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x32, 0x30, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x2d, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x55, 0x53, 0x45, 0x5f, 0x4d, 0x53, 0x44, 0x46, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4b, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x34, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x41, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x35, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x5f, 0x57, 0x41, 0x4c, 0x4c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x75, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x69, 0x70, 0x6d, 0x61, 0x70, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x20, 0x2f, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x75, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x65, 0x67, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x69, 0x73, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x28, 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x2d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x73, 0x20, 0x29, 0x20, 0x29, 0x2c, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x2e, 0x78, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x20, 0x76, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x74, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x73, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x49, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x65, 0x67, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x3f, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x64, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x20, 0x61, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x20, 0x61, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2d, 0x20, 0x61, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x28, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x28, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2a, 0x20, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x29, 0x20, 0x3e, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2a, 0x20, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x29, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x64, 0x72, 0x61, 0x77, 0x4c, 0x69, 0x6e, 0x65, 0x28, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x69, 0x73, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x49, 0x6e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x28, 0x20, 0x61, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x29, 0x20, 0x21, 0x3d, 0x20, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x55, 0x53, 0x45, 0x5f, 0x4d, 0x53, 0x44, 0x46, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x28, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x76, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x76, 0x2e, 0x72, 0x2c, 0x20, 0x76, 0x2e, 0x67, 0x20, 0x29, 0x2c, 0x20, 0x6d, 0x69, 0x6e, 0x28, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x20, 0x76, 0x2e, 0x72, 0x2c, 0x20, 0x76, 0x2e, 0x67, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x2e, 0x62, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x56, 0x53, 0x20, 0x74, 0x6f, 0x20, 0x46, 0x53, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x74, 0x68, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x27, 0x74, 0x20, 0x72, 0x65, 0x6c, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x74, 0x2d, 0x65, 0x78, 0x61, 0x63, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x41, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x72, 0x61, 0x77, 0x4c, 0x69, 0x6e, 0x65, 0x28, 0x20, 0x67, 0x6c, 0x5f, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x30, 0x5d, 0x2e, 0x73, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4b, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x64, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x5f, 0x57, 0x41, 0x4c, 0x4c, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x64, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x28, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x7a, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x55, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x77, 0x65, 0x27, 0x72, 0x65, 0x20, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6b, 0x61, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x20, 0x64, 0x46, 0x64, 0x78, 0x28, 0x20, 0x74, 0x65, 0x78, 0x20, 0x29, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x34, 0x3b, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x55, 0x53, 0x45, 0x5f, 0x4d, 0x53, 0x44, 0x46, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x69, 0x73, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x28, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x20, 0x75, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x20, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x20, 0x29, 0x3b, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x69, 0x73, 0x74, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x20, 0x75, 0x5f, 0x66, 0x6f, 0x6e, 0x74, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x20, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x7a, 0x6f, 0x6f, 0x6d, 0x2d, 0x61, 0x64, 0x61, 0x70, 0x74, 0x69, 0x76, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x73, 0x74, 0x65, 0x70, 0x28, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2d, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2b, 0x20, 0x64, 0x65, 0x72, 0x69, 0x76, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2d, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x00 }; + +std::string glsl_kicad_frag = std::string(reinterpret_cast(glsl_kicad_frag_bytes), 4233); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_kicad_frag.h b/tests/gal-regression/native/generated/glsl_kicad_frag.h new file mode 100644 index 0000000..187e73f --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_kicad_frag.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from kicad_frag.glsl +#ifndef GLSL_KICAD_FRAG_H +#define GLSL_KICAD_FRAG_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_kicad_frag; +} +} + +#endif // GLSL_KICAD_FRAG_H diff --git a/tests/gal-regression/native/generated/glsl_kicad_vert.cpp b/tests/gal-regression/native/generated/glsl_kicad_vert.cpp new file mode 100644 index 0000000..799790e --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_kicad_vert.cpp @@ -0,0 +1,13 @@ +// Auto-generated from kicad_vert.glsl +#include +#include "glsl_kicad_vert.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_kicad_vert_bytes[] = { 0x2f, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4b, 0x49, 0x43, 0x41, 0x44, 0x2c, 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x45, 0x44, 0x41, 0x20, 0x43, 0x41, 0x44, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x2d, 0x32, 0x30, 0x31, 0x36, 0x20, 0x43, 0x45, 0x52, 0x4e, 0x0a, 0x20, 0x2a, 0x20, 0x40, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x20, 0x4d, 0x61, 0x63, 0x69, 0x65, 0x6a, 0x20, 0x53, 0x75, 0x6d, 0x69, 0x6e, 0x73, 0x6b, 0x69, 0x20, 0x3c, 0x6d, 0x61, 0x63, 0x69, 0x65, 0x6a, 0x2e, 0x73, 0x75, 0x6d, 0x69, 0x6e, 0x73, 0x6b, 0x69, 0x40, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x63, 0x68, 0x3e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x20, 0x69, 0x74, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x73, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x28, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x62, 0x75, 0x74, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x20, 0x2a, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 0x20, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 0x55, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x6f, 0x6c, 0x64, 0x2d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x2f, 0x67, 0x70, 0x6c, 0x2d, 0x32, 0x2e, 0x30, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x67, 0x6e, 0x75, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x32, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x35, 0x31, 0x20, 0x46, 0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, 0x20, 0x53, 0x74, 0x72, 0x65, 0x65, 0x74, 0x2c, 0x20, 0x46, 0x69, 0x66, 0x74, 0x68, 0x20, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, 0x20, 0x4d, 0x41, 0x20, 0x20, 0x30, 0x32, 0x31, 0x31, 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x2c, 0x20, 0x55, 0x53, 0x41, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x32, 0x30, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4b, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x4f, 0x4e, 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x34, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x41, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x35, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x36, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x37, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x38, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x39, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x46, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x31, 0x30, 0x2e, 0x30, 0x3b, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x5f, 0x57, 0x41, 0x4c, 0x4c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x31, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x0a, 0x2f, 0x2f, 0x20, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x0a, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4d, 0x49, 0x4e, 0x5f, 0x57, 0x49, 0x44, 0x54, 0x48, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x75, 0x5f, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x66, 0x20, 0x2f, 0x20, 0x72, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x20, 0x2a, 0x20, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x65, 0x63, 0x34, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x76, 0x28, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x78, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x78, 0x2e, 0x78, 0x2c, 0x20, 0x74, 0x2e, 0x78, 0x29, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x78, 0x2e, 0x79, 0x2c, 0x20, 0x74, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x78, 0x2e, 0x7a, 0x2c, 0x20, 0x78, 0x2e, 0x77, 0x20, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x73, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x70, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x65, 0x6e, 0x64, 0x56, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x20, 0x3d, 0x20, 0x28, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x3f, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3a, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x20, 0x77, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x3d, 0x20, 0x28, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x77, 0x20, 0x29, 0x20, 0x2f, 0x20, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x30, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5b, 0x31, 0x5d, 0x5b, 0x31, 0x5d, 0x20, 0x29, 0x20, 0x29, 0x3b, 0x0a, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3c, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x7c, 0x7c, 0x20, 0x75, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x20, 0x3e, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x76, 0x73, 0x20, 0x2b, 0x20, 0x76, 0x70, 0x29, 0x20, 0x2a, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x73, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x2e, 0x78, 0x20, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x2c, 0x20, 0x73, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x2e, 0x79, 0x20, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x20, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x39, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x2c, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x76, 0x28, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x6f, 0x73, 0x2c, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x2b, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x2b, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x41, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x70, 0x6f, 0x73, 0x30, 0x20, 0x3d, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x6f, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x30, 0x2e, 0x78, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3f, 0x20, 0x64, 0x69, 0x72, 0x2e, 0x78, 0x79, 0x20, 0x3a, 0x20, 0x64, 0x69, 0x72, 0x2e, 0x79, 0x78, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x30, 0x2e, 0x79, 0x20, 0x2d, 0x3d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x76, 0x73, 0x2e, 0x79, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x73, 0x30, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x28, 0x76, 0x73, 0x2e, 0x78, 0x29, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x73, 0x30, 0x20, 0x2d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x5b, 0x30, 0x5d, 0x2e, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x76, 0x28, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4b, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x2b, 0x3d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x32, 0x2e, 0x30, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3c, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x33, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x35, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x36, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x20, 0x2a, 0x3d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x79, 0x20, 0x2a, 0x3d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x2b, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x76, 0x28, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x20, 0x2a, 0x20, 0x67, 0x6c, 0x5f, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x2c, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3c, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x6d, 0x69, 0x6e, 0x4c, 0x69, 0x6e, 0x65, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x72, 0x28, 0x20, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x20, 0x2f, 0x20, 0x75, 0x5f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x20, 0x2b, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x33, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x20, 0x2a, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x32, 0x20, 0x2a, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x34, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x35, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x20, 0x33, 0x2e, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x20, 0x36, 0x2e, 0x30, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x52, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x33, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x57, 0x69, 0x64, 0x74, 0x68, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x20, 0x2a, 0x3d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x79, 0x20, 0x2a, 0x3d, 0x20, 0x75, 0x5f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x53, 0x69, 0x7a, 0x65, 0x2e, 0x79, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x2b, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x2b, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x5b, 0x30, 0x5d, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x50, 0x61, 0x73, 0x73, 0x20, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x73, 0x20, 0x3d, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x70, 0x20, 0x3d, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x2d, 0x76, 0x73, 0x2e, 0x79, 0x2c, 0x20, 0x76, 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x20, 0x76, 0x73, 0x2e, 0x78, 0x20, 0x29, 0x20, 0x3c, 0x20, 0x61, 0x62, 0x73, 0x28, 0x76, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x41, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x20, 0x2d, 0x76, 0x73, 0x2c, 0x20, 0x76, 0x70, 0x2c, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x42, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x20, 0x2d, 0x76, 0x73, 0x2c, 0x20, 0x2d, 0x76, 0x70, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x20, 0x31, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x43, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x20, 0x76, 0x73, 0x2c, 0x20, 0x2d, 0x76, 0x70, 0x2c, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x20, 0x31, 0x2c, 0x20, 0x20, 0x31, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x44, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x20, 0x76, 0x73, 0x2c, 0x20, 0x2d, 0x76, 0x70, 0x2c, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x45, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x20, 0x76, 0x73, 0x2c, 0x20, 0x76, 0x70, 0x2c, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x20, 0x31, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x5f, 0x46, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x75, 0x72, 0x65, 0x2c, 0x20, 0x20, 0x2d, 0x76, 0x73, 0x2c, 0x20, 0x76, 0x70, 0x2c, 0x20, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x20, 0x31, 0x2c, 0x20, 0x20, 0x31, 0x20, 0x29, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x32, 0x28, 0x20, 0x2d, 0x31, 0x2c, 0x20, 0x30, 0x20, 0x29, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x48, 0x4f, 0x4c, 0x45, 0x5f, 0x57, 0x41, 0x4c, 0x4c, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x48, 0x6f, 0x6c, 0x65, 0x57, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x20, 0x7c, 0x7c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x20, 0x53, 0x48, 0x41, 0x44, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x52, 0x4f, 0x4b, 0x45, 0x44, 0x5f, 0x43, 0x49, 0x52, 0x43, 0x4c, 0x45, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x43, 0x69, 0x72, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x28, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x79, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x7a, 0x2c, 0x20, 0x76, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x77, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x50, 0x61, 0x73, 0x73, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x75, 0x67, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x78, 0x65, 0x64, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x75, 0x5f, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_kicad_vert = std::string(reinterpret_cast(glsl_kicad_vert_bytes), 8569); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_kicad_vert.h b/tests/gal-regression/native/generated/glsl_kicad_vert.h new file mode 100644 index 0000000..32a69a8 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_kicad_vert.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from kicad_vert.glsl +#ifndef GLSL_KICAD_VERT_H +#define GLSL_KICAD_VERT_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_kicad_vert; +} +} + +#endif // GLSL_KICAD_VERT_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_base.cpp b/tests/gal-regression/native/generated/glsl_smaa_base.cpp new file mode 100644 index 0000000..316d761 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_base.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_base.glsl +#include +#include "glsl_smaa_base.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_base_bytes[] = { 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, 0x4a, 0x6f, 0x72, 0x67, 0x65, 0x20, 0x4a, 0x69, 0x6d, 0x65, 0x6e, 0x65, 0x7a, 0x20, 0x28, 0x6a, 0x6f, 0x72, 0x67, 0x65, 0x40, 0x69, 0x72, 0x79, 0x6f, 0x6b, 0x75, 0x2e, 0x63, 0x6f, 0x6d, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, 0x4a, 0x6f, 0x73, 0x65, 0x20, 0x49, 0x2e, 0x20, 0x45, 0x63, 0x68, 0x65, 0x76, 0x61, 0x72, 0x72, 0x69, 0x61, 0x20, 0x28, 0x6a, 0x6f, 0x73, 0x65, 0x69, 0x67, 0x6e, 0x61, 0x63, 0x69, 0x6f, 0x65, 0x63, 0x68, 0x65, 0x76, 0x61, 0x72, 0x72, 0x69, 0x61, 0x40, 0x67, 0x6d, 0x61, 0x69, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, 0x42, 0x65, 0x6c, 0x65, 0x6e, 0x20, 0x4d, 0x61, 0x73, 0x69, 0x61, 0x20, 0x28, 0x62, 0x6d, 0x61, 0x73, 0x69, 0x61, 0x40, 0x75, 0x6e, 0x69, 0x7a, 0x61, 0x72, 0x2e, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, 0x46, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x64, 0x6f, 0x20, 0x4e, 0x61, 0x76, 0x61, 0x72, 0x72, 0x6f, 0x20, 0x28, 0x66, 0x65, 0x72, 0x6e, 0x61, 0x6e, 0x64, 0x6e, 0x40, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 0x33, 0x20, 0x44, 0x69, 0x65, 0x67, 0x6f, 0x20, 0x47, 0x75, 0x74, 0x69, 0x65, 0x72, 0x72, 0x65, 0x7a, 0x20, 0x28, 0x64, 0x69, 0x65, 0x67, 0x6f, 0x67, 0x40, 0x75, 0x6e, 0x69, 0x7a, 0x61, 0x72, 0x2e, 0x65, 0x73, 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4d, 0x61, 0x64, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x47, 0x4c, 0x20, 0x32, 0x2e, 0x31, 0x20, 0x28, 0x4b, 0x69, 0x43, 0x61, 0x64, 0x20, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x73, 0x20, 0x32, 0x30, 0x31, 0x36, 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x62, 0x79, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x22, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x75, 0x73, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x2c, 0x20, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x2c, 0x20, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x68, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x75, 0x72, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x6f, 0x20, 0x73, 0x6f, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x75, 0x62, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x20, 0x41, 0x73, 0x20, 0x63, 0x6c, 0x61, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x6e, 0x6f, 0x74, 0x69, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x49, 0x53, 0x20, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x44, 0x20, 0x22, 0x41, 0x53, 0x20, 0x49, 0x53, 0x22, 0x2c, 0x20, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x59, 0x20, 0x4f, 0x46, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x4b, 0x49, 0x4e, 0x44, 0x2c, 0x20, 0x45, 0x58, 0x50, 0x52, 0x45, 0x53, 0x53, 0x20, 0x4f, 0x52, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x4d, 0x50, 0x4c, 0x49, 0x45, 0x44, 0x2c, 0x20, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x42, 0x55, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x20, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x45, 0x44, 0x20, 0x54, 0x4f, 0x20, 0x54, 0x48, 0x45, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 0x54, 0x49, 0x45, 0x53, 0x20, 0x4f, 0x46, 0x20, 0x4d, 0x45, 0x52, 0x43, 0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x46, 0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x20, 0x41, 0x4e, 0x44, 0x20, 0x4e, 0x4f, 0x4e, 0x49, 0x4e, 0x46, 0x52, 0x49, 0x4e, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x2e, 0x20, 0x49, 0x4e, 0x20, 0x4e, 0x4f, 0x20, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x20, 0x53, 0x48, 0x41, 0x4c, 0x4c, 0x20, 0x54, 0x48, 0x45, 0x0a, 0x20, 0x2a, 0x20, 0x41, 0x55, 0x54, 0x48, 0x4f, 0x52, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x53, 0x20, 0x42, 0x45, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x20, 0x46, 0x4f, 0x52, 0x20, 0x41, 0x4e, 0x59, 0x20, 0x43, 0x4c, 0x41, 0x49, 0x4d, 0x2c, 0x20, 0x44, 0x41, 0x4d, 0x41, 0x47, 0x45, 0x53, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x0a, 0x20, 0x2a, 0x20, 0x4c, 0x49, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x2c, 0x20, 0x57, 0x48, 0x45, 0x54, 0x48, 0x45, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x41, 0x4e, 0x20, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x4f, 0x46, 0x20, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x43, 0x54, 0x2c, 0x20, 0x54, 0x4f, 0x52, 0x54, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x57, 0x49, 0x53, 0x45, 0x2c, 0x20, 0x41, 0x52, 0x49, 0x53, 0x49, 0x4e, 0x47, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x4f, 0x55, 0x54, 0x20, 0x4f, 0x46, 0x20, 0x4f, 0x52, 0x20, 0x49, 0x4e, 0x20, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x57, 0x49, 0x54, 0x48, 0x20, 0x54, 0x48, 0x45, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x54, 0x48, 0x45, 0x20, 0x55, 0x53, 0x45, 0x20, 0x4f, 0x52, 0x20, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x20, 0x44, 0x45, 0x41, 0x4c, 0x49, 0x4e, 0x47, 0x53, 0x20, 0x49, 0x4e, 0x20, 0x54, 0x48, 0x45, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4f, 0x46, 0x54, 0x57, 0x41, 0x52, 0x45, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x7c, 0x20, 0x20, 0x20, 0x5c, 0x2f, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x28, 0x2d, 0x2d, 0x2d, 0x2d, 0x20, 0x7c, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x5e, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x5e, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x5c, 0x2f, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x2f, 0x5f, 0x5c, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x2f, 0x5f, 0x5c, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x2d, 0x2d, 0x29, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5c, 0x20, 0x20, 0x20, 0x2f, 0x20, 0x20, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x20, 0x20, 0x5c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x5f, 0x5f, 0x7c, 0x20, 0x20, 0x7c, 0x5f, 0x5f, 0x7c, 0x20, 0x2f, 0x5f, 0x5f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x5f, 0x5f, 0x5c, 0x20, 0x2f, 0x5f, 0x5f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5c, 0x5f, 0x5f, 0x5c, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x45, 0x20, 0x4e, 0x20, 0x48, 0x20, 0x41, 0x20, 0x4e, 0x20, 0x43, 0x20, 0x45, 0x20, 0x44, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x20, 0x55, 0x20, 0x42, 0x20, 0x50, 0x20, 0x49, 0x20, 0x58, 0x20, 0x45, 0x20, 0x4c, 0x20, 0x20, 0x20, 0x4d, 0x20, 0x4f, 0x20, 0x52, 0x20, 0x50, 0x20, 0x48, 0x20, 0x4f, 0x20, 0x4c, 0x20, 0x4f, 0x20, 0x47, 0x20, 0x49, 0x20, 0x43, 0x20, 0x41, 0x20, 0x4c, 0x20, 0x20, 0x20, 0x41, 0x20, 0x4e, 0x20, 0x54, 0x20, 0x49, 0x20, 0x41, 0x20, 0x4c, 0x20, 0x49, 0x20, 0x41, 0x20, 0x53, 0x20, 0x49, 0x20, 0x4e, 0x20, 0x47, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x72, 0x79, 0x6f, 0x6b, 0x75, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6d, 0x61, 0x61, 0x2f, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x48, 0x69, 0x2c, 0x20, 0x77, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x21, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x48, 0x65, 0x72, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x75, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x73, 0x20, 0x66, 0x61, 0x73, 0x74, 0x20, 0x61, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x45, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45, 0x3a, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x70, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x21, 0x20, 0x54, 0x68, 0x65, 0x79, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x7c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x5c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x2a, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x5d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5b, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x5d, 0x20, 0x3c, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2f, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x7c, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x5b, 0x70, 0x61, 0x73, 0x73, 0x5d, 0x20, 0x68, 0x61, 0x73, 0x20, 0x69, 0x74, 0x73, 0x20, 0x6f, 0x77, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x20, 0x52, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x72, 0x69, 0x61, 0x6e, 0x67, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x71, 0x75, 0x61, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x59, 0x6f, 0x75, 0x27, 0x76, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x3a, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x79, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x2f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x74, 0x69, 0x2d, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x2f, 0x73, 0x68, 0x61, 0x72, 0x70, 0x6e, 0x65, 0x73, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x72, 0x61, 0x64, 0x65, 0x6f, 0x66, 0x66, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x65, 0x73, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x73, 0x75, 0x69, 0x74, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x61, 0x72, 0x69, 0x6f, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x2d, 0x20, 0x44, 0x65, 0x70, 0x74, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x73, 0x74, 0x65, 0x73, 0x74, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x2d, 0x20, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x62, 0x75, 0x74, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6d, 0x69, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x2d, 0x20, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x69, 0x76, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x62, 0x75, 0x74, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x61, 0x2d, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x72, 0x73, 0x3a, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x61, 0x64, 0x76, 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x75, 0x73, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x65, 0x61, 0x63, 0x68, 0x0a, 0x20, 0x2a, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x28, 0x64, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x54, 0x32, 0x78, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x65, 0x64, 0x67, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x21, 0x29, 0x2e, 0x20, 0x4f, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x6c, 0x65, 0x74, 0x27, 0x73, 0x20, 0x67, 0x6f, 0x21, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x52, 0x47, 0x42, 0x41, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x7c, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x7c, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x44, 0x58, 0x31, 0x30, 0x20, 0x6f, 0x72, 0x20, 0x44, 0x58, 0x31, 0x31, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x52, 0x47, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4e, 0x56, 0x49, 0x44, 0x49, 0x41, 0x20, 0x47, 0x50, 0x55, 0x73, 0x2c, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x47, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x65, 0x6d, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x62, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x58, 0x62, 0x6f, 0x78, 0x20, 0x33, 0x36, 0x30, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x7c, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x7c, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x6e, 0x27, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x74, 0x61, 0x6e, 0x65, 0x6f, 0x75, 0x73, 0x6c, 0x79, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x32, 0x2e, 0x20, 0x42, 0x6f, 0x74, 0x68, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x20, 0x7c, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x7c, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x65, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x44, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x67, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x21, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x33, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x69, 0x73, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x27, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x27, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x27, 0x20, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x61, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x61, 0x73, 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x44, 0x44, 0x53, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x79, 0x27, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x2b, 0x2b, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x20, 0x27, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x27, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x42, 0x43, 0x35, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x42, 0x43, 0x34, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x6c, 0x79, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x34, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x72, 0x65, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x2d, 0x72, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x47, 0x43, 0x4e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x69, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x36, 0x34, 0x2d, 0x62, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x27, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x6e, 0x65, 0x66, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x68, 0x65, 0x72, 0x65, 0x20, 0x28, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x35, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x52, 0x47, 0x42, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x53, 0x4d, 0x41, 0x41, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x73, 0x73, 0x21, 0x29, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x73, 0x52, 0x47, 0x42, 0x20, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x61, 0x6e, 0x79, 0x77, 0x61, 0x79, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x20, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x3a, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2f, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x65, 0x64, 0x67, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x2a, 0x4e, 0x4f, 0x54, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x73, 0x52, 0x47, 0x42, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x36, 0x2e, 0x20, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x2e, 0x68, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x5f, 0x31, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x28, 0x53, 0x65, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x56, 0x53, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x50, 0x53, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x4f, 0x57, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x25, 0x36, 0x30, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x25, 0x38, 0x30, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x25, 0x39, 0x35, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x55, 0x4c, 0x54, 0x52, 0x41, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x28, 0x25, 0x39, 0x39, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x29, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x38, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x37, 0x32, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x32, 0x38, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x37, 0x32, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x53, 0x4d, 0x41, 0x41, 0x2e, 0x68, 0x22, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x61, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x64, 0x65, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x61, 0x72, 0x64, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x69, 0x74, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x20, 0x27, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x27, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x27, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x27, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x64, 0x64, 0x20, 0x28, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x2e, 0x68, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x4c, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x79, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x37, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x2e, 0x66, 0x78, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x65, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x77, 0x65, 0x20, 0x64, 0x69, 0x64, 0x20, 0x69, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x2d, 0x70, 0x61, 0x73, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x21, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x38, 0x2e, 0x20, 0x49, 0x74, 0x27, 0x73, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x7c, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x7c, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x7c, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x7c, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x7c, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x7c, 0x20, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x6f, 0x62, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x39, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x69, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x28, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x6d, 0x61, 0x73, 0x6b, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x29, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x72, 0x61, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x62, 0x29, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x54, 0x32, 0x78, 0x29, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x75, 0x62, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x49, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x67, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x61, 0x73, 0x20, 0x73, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x44, 0x58, 0x31, 0x30, 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x32, 0x78, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x67, 0x65, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x6c, 0x79, 0x20, 0x73, 0x65, 0x65, 0x20, 0x67, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x77, 0x68, 0x65, 0x72, 0x65, 0x2e, 0x20, 0x42, 0x75, 0x74, 0x20, 0x66, 0x65, 0x61, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x72, 0x79, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x79, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x33, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x61, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6e, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x31, 0x78, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x34, 0x2e, 0x20, 0x41, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x61, 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x73, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x27, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x27, 0x20, 0x6f, 0x66, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x27, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x54, 0x32, 0x78, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x40, 0x53, 0x55, 0x42, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x43, 0x45, 0x53, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x53, 0x23, 0x20, 0x7c, 0x20, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x20, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x30, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x31, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x74, 0x6f, 0x2d, 0x74, 0x6f, 0x70, 0x20, 0x79, 0x20, 0x61, 0x78, 0x69, 0x73, 0x2e, 0x20, 0x53, 0x23, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x72, 0x79, 0x6f, 0x6b, 0x75, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x61, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x2f, 0x31, 0x33, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x2d, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x2d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x2d, 0x69, 0x6e, 0x2d, 0x43, 0x72, 0x79, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x2d, 0x33, 0x2e, 0x70, 0x64, 0x66, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x63, 0x29, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x70, 0x61, 0x74, 0x69, 0x61, 0x6c, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x53, 0x32, 0x78, 0x29, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x31, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x4d, 0x53, 0x41, 0x41, 0x20, 0x32, 0x78, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x4d, 0x53, 0x41, 0x41, 0x20, 0x32, 0x78, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x44, 0x58, 0x31, 0x30, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x65, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20, 0x28, 0x2a, 0x29, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x44, 0x58, 0x31, 0x30, 0x2e, 0x31, 0x3a, 0x20, 0x20, 0x20, 0x44, 0x33, 0x44, 0x31, 0x30, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4e, 0x20, 0x6f, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x44, 0x58, 0x31, 0x31, 0x3a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x33, 0x44, 0x31, 0x31, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x52, 0x44, 0x5f, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x50, 0x41, 0x54, 0x54, 0x45, 0x52, 0x4e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x73, 0x75, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x40, 0x53, 0x55, 0x42, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x43, 0x45, 0x53, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x2a, 0x29, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x44, 0x58, 0x31, 0x30, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x3a, 0x3a, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x4d, 0x53, 0x41, 0x41, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x3a, 0x3a, 0x6d, 0x73, 0x61, 0x61, 0x52, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x20, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x62, 0x79, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x47, 0x50, 0x55, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x69, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x20, 0x41, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x44, 0x58, 0x31, 0x30, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x29, 0x2e, 0x20, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x75, 0x72, 0x70, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x64, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x28, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x68, 0x61, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x66, 0x65, 0x65, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x79, 0x69, 0x65, 0x6c, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x33, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x31, 0x78, 0x20, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x30, 0x2e, 0x35, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x27, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x27, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x54, 0x32, 0x78, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x29, 0x20, 0x49, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x53, 0x32, 0x78, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x28, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x69, 0x73, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x34, 0x78, 0x29, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x31, 0x2e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x34, 0x78, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x53, 0x32, 0x78, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x20, 0x69, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x53, 0x32, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65, 0x2c, 0x20, 0x27, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x27, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x73, 0x65, 0x74, 0x20, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x46, 0x23, 0x20, 0x7c, 0x20, 0x53, 0x23, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x20, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x20, 0x4e, 0x65, 0x74, 0x20, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x30, 0x20, 0x7c, 0x20, 0x20, 0x30, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x20, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x7c, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x35, 0x2c, 0x20, 0x33, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x33, 0x29, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x30, 0x20, 0x7c, 0x20, 0x20, 0x31, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x29, 0x20, 0x7c, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x34, 0x2c, 0x20, 0x36, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x33, 0x29, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x31, 0x20, 0x7c, 0x20, 0x20, 0x32, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x29, 0x20, 0x7c, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x33, 0x2c, 0x20, 0x35, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x34, 0x29, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x31, 0x20, 0x7c, 0x20, 0x20, 0x33, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x20, 0x7c, 0x20, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x2c, 0x20, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x7c, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x36, 0x2c, 0x20, 0x34, 0x2c, 0x20, 0x32, 0x2c, 0x20, 0x34, 0x29, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x61, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x74, 0x6f, 0x2d, 0x74, 0x6f, 0x70, 0x20, 0x79, 0x20, 0x61, 0x78, 0x69, 0x73, 0x2e, 0x20, 0x46, 0x23, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x20, 0x53, 0x23, 0x20, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x20, 0x41, 0x66, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x53, 0x32, 0x78, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x54, 0x32, 0x78, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x73, 0x65, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x20, 0x62, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x65, 0x29, 0x20, 0x49, 0x66, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x61, 0x73, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x67, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x73, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x31, 0x2e, 0x20, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x68, 0x65, 0x61, 0x76, 0x79, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x6f, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x22, 0x6e, 0x6f, 0x20, 0x65, 0x64, 0x67, 0x65, 0x22, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x32, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x74, 0x61, 0x70, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x69, 0x6c, 0x69, 0x6e, 0x67, 0x2c, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x73, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x61, 0x74, 0x27, 0x73, 0x20, 0x69, 0x74, 0x21, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x6d, 0x61, 0x63, 0x72, 0x6f, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x20, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4c, 0x4f, 0x57, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x30, 0x2e, 0x31, 0x35, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x20, 0x34, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x23, 0x65, 0x6c, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x30, 0x2e, 0x31, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x20, 0x38, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x23, 0x65, 0x6c, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x48, 0x49, 0x47, 0x48, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x30, 0x2e, 0x31, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x20, 0x31, 0x36, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x38, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x32, 0x35, 0x0a, 0x23, 0x65, 0x6c, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x54, 0x5f, 0x55, 0x4c, 0x54, 0x52, 0x41, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x20, 0x33, 0x32, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x31, 0x36, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x32, 0x35, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x0a, 0x20, 0x2a, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x5d, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x31, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x30, 0x2e, 0x30, 0x35, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x61, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x6b, 0x69, 0x6c, 0x6c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x27, 0x65, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x32, 0x20, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x6c, 0x6f, 0x77, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x6c, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x32, 0x78, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x30, 0x2e, 0x31, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x50, 0x54, 0x48, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x50, 0x54, 0x48, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x50, 0x54, 0x48, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x28, 0x30, 0x2e, 0x31, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x29, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x73, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x2e, 0x20, 0x53, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x0a, 0x20, 0x2a, 0x20, 0x70, 0x65, 0x72, 0x66, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x69, 0x73, 0x20, 0x36, 0x34, 0x20, 0x28, 0x62, 0x79, 0x20, 0x70, 0x65, 0x72, 0x66, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x61, 0x73, 0x20, 0x67, 0x6f, 0x6f, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x31, 0x31, 0x32, 0x5d, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x20, 0x31, 0x36, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x73, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2e, 0x20, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x6d, 0x70, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x61, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x77, 0x6f, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x32, 0x30, 0x5d, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x2d, 0x65, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x63, 0x68, 0x65, 0x61, 0x70, 0x20, 0x28, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x30, 0x2e, 0x38, 0x78, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x30, 0x2e, 0x39, 0x78, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x31, 0x36, 0x0a, 0x20, 0x2a, 0x20, 0x73, 0x74, 0x65, 0x70, 0x73, 0x29, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x66, 0x69, 0x63, 0x61, 0x6e, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x61, 0x63, 0x74, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x38, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x73, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x73, 0x68, 0x61, 0x72, 0x70, 0x20, 0x63, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x31, 0x30, 0x30, 0x5d, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x20, 0x32, 0x35, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x73, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x62, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x2c, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x20, 0x73, 0x70, 0x75, 0x72, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x73, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x63, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x6f, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x68, 0x69, 0x64, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x70, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x75, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x44, 0x41, 0x50, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x44, 0x41, 0x50, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x20, 0x32, 0x2e, 0x30, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x2a, 0x20, 0x69, 0x6d, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2c, 0x20, 0x62, 0x79, 0x20, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x28, 0x74, 0x68, 0x65, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x64, 0x6f, 0x6f, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x20, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x74, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x69, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x28, 0x73, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x68, 0x69, 0x67, 0x68, 0x65, 0x72, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x77, 0x61, 0x73, 0x20, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x50, 0x6c, 0x61, 0x79, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x45, 0x44, 0x47, 0x45, 0x20, 0x4d, 0x4c, 0x41, 0x41, 0x20, 0x74, 0x65, 0x61, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x4b, 0x69, 0x6c, 0x6c, 0x7a, 0x6f, 0x6e, 0x65, 0x20, 0x33, 0x2c, 0x20, 0x62, 0x79, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x63, 0x63, 0x75, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x72, 0x79, 0x6f, 0x6b, 0x75, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x61, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x2f, 0x30, 0x36, 0x2d, 0x4d, 0x4c, 0x41, 0x41, 0x2d, 0x6f, 0x6e, 0x2d, 0x50, 0x53, 0x33, 0x2e, 0x70, 0x70, 0x74, 0x78, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x30, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x74, 0x0a, 0x20, 0x2a, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x30, 0x2e, 0x30, 0x31, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x48, 0x6f, 0x77, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x65, 0x64, 0x67, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x31, 0x2c, 0x20, 0x35, 0x5d, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x20, 0x32, 0x2e, 0x30, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x48, 0x6f, 0x77, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x64, 0x65, 0x63, 0x72, 0x65, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x31, 0x5d, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x30, 0x2e, 0x34, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x67, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x57, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x72, 0x79, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x20, 0x33, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x65, 0x78, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x0a, 0x20, 0x2a, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x67, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x4d, 0x6f, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x69, 0x72, 0x79, 0x6f, 0x6b, 0x75, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x61, 0x63, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x2f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x2f, 0x31, 0x33, 0x2d, 0x41, 0x6e, 0x74, 0x69, 0x2d, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x2d, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x73, 0x2d, 0x69, 0x6e, 0x2d, 0x43, 0x72, 0x79, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x2d, 0x33, 0x2e, 0x70, 0x64, 0x66, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x79, 0x6f, 0x75, 0x27, 0x6c, 0x6c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70, 0x20, 0x61, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2c, 0x20, 0x73, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x64, 0x65, 0x70, 0x74, 0x68, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x76, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x20, 0x30, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x67, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x72, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x62, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x20, 0x62, 0x79, 0x0a, 0x20, 0x2a, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x68, 0x69, 0x62, 0x69, 0x74, 0x20, 0x67, 0x68, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x2a, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x42, 0x65, 0x68, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x2c, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x74, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x70, 0x65, 0x72, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x73, 0x20, 0x28, 0x6d, 0x65, 0x61, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x29, 0x2e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x3a, 0x20, 0x5b, 0x30, 0x2c, 0x20, 0x38, 0x30, 0x5d, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x20, 0x33, 0x30, 0x2e, 0x30, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4f, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x75, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x79, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x56, 0x53, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x56, 0x53, 0x20, 0x31, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x50, 0x53, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x50, 0x53, 0x20, 0x31, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x61, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x67, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x6e, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x28, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x72, 0x67, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x4e, 0x6f, 0x6e, 0x2d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x0a, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x20, 0x31, 0x36, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x32, 0x30, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x36, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x35, 0x36, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x37, 0x2e, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x36, 0x36, 0x2e, 0x30, 0x2c, 0x20, 0x33, 0x33, 0x2e, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x36, 0x34, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x36, 0x2e, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x20, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x29, 0x20, 0x2f, 0x20, 0x31, 0x30, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x50, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x32, 0x44, 0x6c, 0x6f, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x32, 0x44, 0x6c, 0x6f, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x32, 0x44, 0x6c, 0x6f, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x46, 0x4c, 0x41, 0x54, 0x54, 0x45, 0x4e, 0x20, 0x5b, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x20, 0x5b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x5f, 0x31, 0x29, 0x0a, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x7b, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x47, 0x5f, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x5f, 0x4d, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x3b, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x20, 0x3d, 0x20, 0x43, 0x6c, 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x20, 0x3d, 0x20, 0x43, 0x6c, 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x7d, 0x3b, 0x0a, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x20, 0x7b, 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x4d, 0x49, 0x4e, 0x5f, 0x4d, 0x41, 0x47, 0x5f, 0x4d, 0x49, 0x50, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x3b, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x20, 0x3d, 0x20, 0x43, 0x6c, 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x56, 0x20, 0x3d, 0x20, 0x43, 0x6c, 0x61, 0x6d, 0x70, 0x3b, 0x20, 0x7d, 0x3b, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x46, 0x4c, 0x41, 0x54, 0x54, 0x45, 0x4e, 0x20, 0x5b, 0x66, 0x6c, 0x61, 0x74, 0x74, 0x65, 0x6e, 0x5d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x20, 0x5b, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x5d, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x4d, 0x53, 0x32, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x4d, 0x53, 0x3c, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x2c, 0x20, 0x32, 0x3e, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4c, 0x6f, 0x61, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x28, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x29, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x5f, 0x31, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x2e, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x28, 0x4c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x29, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x32, 0x5f, 0x31, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x20, 0x74, 0x65, 0x78, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x32, 0x5f, 0x31, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x72, 0x67, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x78, 0x29, 0x20, 0x66, 0x6c, 0x6f, 0x6f, 0x72, 0x28, 0x78, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x64, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x72, 0x67, 0x29, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x46, 0x4c, 0x41, 0x54, 0x54, 0x45, 0x4e, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6c, 0x65, 0x72, 0x70, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x74, 0x29, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x74, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x65, 0x28, 0x61, 0x29, 0x20, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x28, 0x61, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x20, 0x66, 0x6d, 0x61, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x0a, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x61, 0x2c, 0x20, 0x62, 0x2c, 0x20, 0x63, 0x29, 0x20, 0x28, 0x61, 0x20, 0x2a, 0x20, 0x62, 0x20, 0x2b, 0x20, 0x63, 0x29, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x65, 0x63, 0x32, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x76, 0x65, 0x63, 0x33, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x65, 0x63, 0x34, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x69, 0x76, 0x65, 0x63, 0x32, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x33, 0x20, 0x69, 0x76, 0x65, 0x63, 0x33, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x34, 0x20, 0x69, 0x76, 0x65, 0x63, 0x34, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x20, 0x62, 0x76, 0x65, 0x63, 0x32, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x20, 0x62, 0x76, 0x65, 0x63, 0x33, 0x0a, 0x23, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x20, 0x62, 0x76, 0x65, 0x63, 0x34, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x5f, 0x31, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x32, 0x5f, 0x31, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x33, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x34, 0x29, 0x20, 0x26, 0x26, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x4c, 0x29, 0x0a, 0x23, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x6d, 0x75, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x48, 0x4c, 0x53, 0x4c, 0x5f, 0x2a, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x47, 0x4c, 0x53, 0x4c, 0x5f, 0x2a, 0x20, 0x6f, 0x72, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x5f, 0x53, 0x4c, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x4d, 0x69, 0x73, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x74, 0x65, 0x78, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x2d, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x2e, 0x67, 0x72, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x50, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x50, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x50, 0x74, 0x6f, 0x70, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x74, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x50, 0x2c, 0x20, 0x50, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x50, 0x74, 0x6f, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x62, 0x79, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x2e, 0x78, 0x78, 0x20, 0x2d, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x2e, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x20, 0x2a, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x20, 0x2a, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x76, 0x65, 0x3a, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x46, 0x4c, 0x41, 0x54, 0x54, 0x45, 0x4e, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x2e, 0x78, 0x29, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x46, 0x4c, 0x41, 0x54, 0x54, 0x45, 0x4e, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x2e, 0x79, 0x29, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x79, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x56, 0x53, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x73, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x32, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x20, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x6e, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x40, 0x50, 0x53, 0x45, 0x55, 0x44, 0x4f, 0x5f, 0x47, 0x41, 0x54, 0x48, 0x45, 0x52, 0x34, 0x29, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x31, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x2c, 0x20, 0x20, 0x31, 0x2e, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x6f, 0x6f, 0x70, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x78, 0x79, 0x79, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x79, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x20, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x56, 0x53, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x50, 0x53, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x73, 0x20, 0x28, 0x46, 0x69, 0x72, 0x73, 0x74, 0x20, 0x50, 0x61, 0x73, 0x73, 0x29, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4c, 0x75, 0x6d, 0x61, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45, 0x3a, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x68, 0x75, 0x73, 0x20, 0x27, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x27, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x52, 0x47, 0x42, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4c, 0x75, 0x6d, 0x61, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x75, 0x6d, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x30, 0x2e, 0x32, 0x31, 0x32, 0x36, 0x2c, 0x20, 0x30, 0x2e, 0x37, 0x31, 0x35, 0x32, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x32, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x74, 0x6f, 0x70, 0x20, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x4c, 0x20, 0x2d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x4c, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x4c, 0x74, 0x6f, 0x70, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x65, 0x64, 0x67, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x4c, 0x20, 0x2d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x4c, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x4c, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x74, 0x6f, 0x70, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x6c, 0x65, 0x66, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x4c, 0x74, 0x6f, 0x70, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x4c, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x4c, 0x74, 0x6f, 0x70, 0x29, 0x20, 0x2d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x4c, 0x6c, 0x65, 0x66, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x2c, 0x20, 0x4c, 0x74, 0x6f, 0x70, 0x74, 0x6f, 0x70, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x44, 0x41, 0x50, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x49, 0x4d, 0x50, 0x4f, 0x52, 0x54, 0x41, 0x4e, 0x54, 0x20, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45, 0x3a, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, 0x20, 0x67, 0x61, 0x6d, 0x6d, 0x61, 0x2d, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x74, 0x68, 0x75, 0x73, 0x20, 0x27, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x27, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x73, 0x52, 0x47, 0x42, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x50, 0x52, 0x45, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x64, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x43, 0x20, 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2e, 0x72, 0x2c, 0x20, 0x74, 0x2e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x2e, 0x62, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x74, 0x6f, 0x70, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x43, 0x20, 0x2d, 0x20, 0x43, 0x74, 0x6f, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2e, 0x72, 0x2c, 0x20, 0x74, 0x2e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x2e, 0x62, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x6e, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x20, 0x65, 0x64, 0x67, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x43, 0x20, 0x2d, 0x20, 0x43, 0x72, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2e, 0x72, 0x2c, 0x20, 0x74, 0x2e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x2e, 0x62, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x43, 0x20, 0x2d, 0x20, 0x43, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2e, 0x72, 0x2c, 0x20, 0x74, 0x2e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x2e, 0x62, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x70, 0x2d, 0x74, 0x6f, 0x70, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x6c, 0x65, 0x66, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x43, 0x20, 0x2d, 0x20, 0x43, 0x6c, 0x65, 0x66, 0x74, 0x6c, 0x65, 0x66, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2e, 0x72, 0x2c, 0x20, 0x74, 0x2e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x2e, 0x62, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x43, 0x74, 0x6f, 0x70, 0x74, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x72, 0x67, 0x62, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x43, 0x20, 0x2d, 0x20, 0x43, 0x74, 0x6f, 0x70, 0x74, 0x6f, 0x70, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x28, 0x74, 0x2e, 0x72, 0x2c, 0x20, 0x74, 0x2e, 0x67, 0x29, 0x2c, 0x20, 0x74, 0x2e, 0x62, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x78, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x20, 0x61, 0x64, 0x61, 0x70, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x78, 0x79, 0x20, 0x2a, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x52, 0x41, 0x53, 0x54, 0x5f, 0x41, 0x44, 0x41, 0x50, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x20, 0x2a, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x44, 0x65, 0x70, 0x74, 0x68, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x70, 0x74, 0x68, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x64, 0x65, 0x70, 0x74, 0x68, 0x54, 0x65, 0x78, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x47, 0x61, 0x74, 0x68, 0x65, 0x72, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x64, 0x65, 0x70, 0x74, 0x68, 0x54, 0x65, 0x78, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x2e, 0x78, 0x78, 0x20, 0x2d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x2e, 0x79, 0x2c, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x75, 0x72, 0x73, 0x2e, 0x7a, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x50, 0x54, 0x48, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x2c, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x44, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x29, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x61, 0x67, 0x42, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x42, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x27, 0x65, 0x27, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x52, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x2b, 0x2d, 0x2d, 0x2d, 0x47, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x7c, 0x20, 0x20, 0x20, 0x78, 0x20, 0x6f, 0x20, 0x52, 0x20, 0x20, 0x20, 0x78, 0x20, 0x20, 0x20, 0x7c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x69, 0x66, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x52, 0x65, 0x64, 0x3a, 0x20, 0x20, 0x20, 0x28, 0x30, 0x2e, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x58, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0x3a, 0x20, 0x28, 0x30, 0x2e, 0x37, 0x35, 0x20, 0x2a, 0x20, 0x31, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x58, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0x2e, 0x37, 0x35, 0x20, 0x6f, 0x72, 0x20, 0x31, 0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x75, 0x6e, 0x70, 0x61, 0x63, 0x6b, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x20, 0x28, 0x6d, 0x61, 0x64, 0x20, 0x2b, 0x20, 0x6d, 0x75, 0x6c, 0x20, 0x2b, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x29, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x6f, 0x6c, 0x66, 0x72, 0x61, 0x6d, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x63, 0x6f, 0x6d, 0x3a, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x78, 0x20, 0x2a, 0x20, 0x61, 0x62, 0x73, 0x28, 0x35, 0x20, 0x2a, 0x20, 0x78, 0x20, 0x2d, 0x20, 0x35, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x37, 0x35, 0x29, 0x29, 0x20, 0x70, 0x6c, 0x6f, 0x74, 0x20, 0x30, 0x20, 0x74, 0x6f, 0x20, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x2a, 0x20, 0x61, 0x62, 0x73, 0x28, 0x35, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x2d, 0x20, 0x35, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x37, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x61, 0x67, 0x42, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x62, 0x20, 0x3d, 0x20, 0x65, 0x2e, 0x72, 0x62, 0x20, 0x2a, 0x20, 0x61, 0x62, 0x73, 0x28, 0x35, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x65, 0x2e, 0x72, 0x62, 0x20, 0x2d, 0x20, 0x35, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x30, 0x2e, 0x37, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x65, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x31, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x20, 0x3c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x77, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x39, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x65, 0x20, 0x40, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x20, 0x3c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x5f, 0x53, 0x54, 0x45, 0x50, 0x53, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x77, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x39, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x28, 0x64, 0x69, 0x72, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x7a, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x32, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x74, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x61, 0x67, 0x42, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x28, 0x65, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x6f, 0x6e, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x2e, 0x67, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x0a, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x27, 0x65, 0x27, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x44, 0x69, 0x61, 0x67, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x29, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x44, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x44, 0x6f, 0x20, 0x69, 0x74, 0x21, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x69, 0x61, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x6e, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x78, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x31, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x78, 0x7a, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x79, 0x77, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x31, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x3e, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x64, 0x2e, 0x79, 0x2c, 0x20, 0x2d, 0x64, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x2e, 0x79, 0x78, 0x77, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x44, 0x69, 0x61, 0x67, 0x42, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x28, 0x63, 0x2e, 0x78, 0x79, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x6f, 0x6e, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x64, 0x2e, 0x79, 0x2c, 0x20, 0x2d, 0x64, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x63, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x63, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x63, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x63, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x2d, 0x31, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x63, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x63, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x63, 0x2e, 0x79, 0x77, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x64, 0x69, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x28, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x39, 0x2c, 0x20, 0x64, 0x2e, 0x7a, 0x77, 0x29, 0x29, 0x2c, 0x20, 0x63, 0x63, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x44, 0x69, 0x61, 0x67, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x63, 0x63, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x78, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x79, 0x77, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x44, 0x69, 0x61, 0x67, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x65, 0x6e, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x39, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x79, 0x77, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x2b, 0x20, 0x31, 0x20, 0x3e, 0x20, 0x33, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x2d, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x2d, 0x64, 0x2e, 0x78, 0x2c, 0x20, 0x64, 0x2e, 0x79, 0x2c, 0x20, 0x64, 0x2e, 0x79, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x2e, 0x78, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x2d, 0x31, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x2e, 0x79, 0x20, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x30, 0x2c, 0x20, 0x2d, 0x31, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x2e, 0x7a, 0x77, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x67, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x63, 0x63, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x63, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x63, 0x2e, 0x79, 0x77, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x64, 0x69, 0x64, 0x6e, 0x27, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x28, 0x73, 0x74, 0x65, 0x70, 0x28, 0x30, 0x2e, 0x39, 0x2c, 0x20, 0x64, 0x2e, 0x7a, 0x77, 0x29, 0x29, 0x2c, 0x20, 0x63, 0x63, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x44, 0x69, 0x61, 0x67, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x63, 0x63, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x77, 0x29, 0x2e, 0x67, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x2f, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x77, 0x65, 0x20, 0x61, 0x64, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x0a, 0x20, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x28, 0x73, 0x65, 0x65, 0x0a, 0x20, 0x2a, 0x20, 0x40, 0x50, 0x53, 0x45, 0x55, 0x44, 0x4f, 0x5f, 0x47, 0x41, 0x54, 0x48, 0x45, 0x52, 0x34, 0x29, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x64, 0x64, 0x73, 0x20, 0x30, 0x2c, 0x20, 0x31, 0x20, 0x6f, 0x72, 0x20, 0x32, 0x2c, 0x20, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x0a, 0x20, 0x2a, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x66, 0x6c, 0x69, 0x70, 0x70, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x61, 0x73, 0x65, 0x73, 0x20, 0x74, 0x61, 0x6b, 0x69, 0x6e, 0x67, 0x20, 0x68, 0x61, 0x6c, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x6c, 0x79, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x2d, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x20, 0x2b, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x20, 0x30, 0x2e, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x28, 0x57, 0x65, 0x20, 0x75, 0x73, 0x65, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x2a, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x2a, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x41, 0x43, 0x4b, 0x45, 0x44, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x62, 0x69, 0x61, 0x73, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x32, 0x6e, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x2e, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x58, 0x4c, 0x65, 0x66, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x50, 0x53, 0x45, 0x55, 0x44, 0x4f, 0x5f, 0x47, 0x41, 0x54, 0x48, 0x45, 0x52, 0x34, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x62, 0x79, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x74, 0x65, 0x78, 0x20, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x65, 0x64, 0x67, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x75, 0x73, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x72, 0x6f, 0x77, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x20, 0x64, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x75, 0x72, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2a, 0x2f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x3e, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x67, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x38, 0x32, 0x38, 0x31, 0x20, 0x26, 0x26, 0x20, 0x2f, 0x2f, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x4f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x33, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x6f, 0x6e, 0x2d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x28, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x2c, 0x20, 0x2d, 0x30, 0x2e, 0x31, 0x32, 0x35, 0x29, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x77, 0x65, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x65, 0x64, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x65, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x62, 0x79, 0x20, 0x31, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x6c, 0x79, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x44, 0x69, 0x73, 0x61, 0x6d, 0x62, 0x69, 0x67, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2b, 0x3d, 0x20, 0x32, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x55, 0x6e, 0x64, 0x6f, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x73, 0x74, 0x65, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2d, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x29, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x58, 0x52, 0x69, 0x67, 0x68, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x67, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x38, 0x32, 0x38, 0x31, 0x20, 0x26, 0x26, 0x20, 0x2f, 0x2f, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x4f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x32, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x2c, 0x20, 0x33, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x59, 0x55, 0x70, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3e, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x38, 0x32, 0x38, 0x31, 0x20, 0x26, 0x26, 0x20, 0x2f, 0x2f, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x4f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x72, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x33, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x79, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x59, 0x44, 0x6f, 0x77, 0x6e, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x26, 0x26, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x38, 0x32, 0x38, 0x31, 0x20, 0x26, 0x26, 0x20, 0x2f, 0x2f, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x64, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x4f, 0x72, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x32, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x28, 0x32, 0x35, 0x35, 0x2e, 0x30, 0x20, 0x2f, 0x20, 0x31, 0x32, 0x37, 0x2e, 0x30, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x65, 0x2e, 0x67, 0x72, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x2c, 0x20, 0x33, 0x2e, 0x32, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x2d, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x79, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2a, 0x2a, 0x0a, 0x20, 0x2a, 0x20, 0x4f, 0x6b, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2e, 0x20, 0x53, 0x6f, 0x2c, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x0a, 0x20, 0x2a, 0x20, 0x61, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x73, 0x69, 0x64, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x3f, 0x0a, 0x20, 0x2a, 0x2f, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x69, 0x73, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x31, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x32, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x62, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x53, 0x54, 0x41, 0x4e, 0x43, 0x45, 0x29, 0x2c, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x34, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x65, 0x31, 0x2c, 0x20, 0x65, 0x32, 0x29, 0x29, 0x2c, 0x20, 0x64, 0x69, 0x73, 0x74, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x69, 0x61, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x65, 0x78, 0x65, 0x6c, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x50, 0x49, 0x58, 0x45, 0x4c, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4d, 0x6f, 0x76, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x62, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x49, 0x5a, 0x45, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x44, 0x6f, 0x20, 0x69, 0x74, 0x21, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x41, 0x52, 0x45, 0x41, 0x54, 0x45, 0x58, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, 0x54, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x43, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x20, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x64, 0x2e, 0x79, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x29, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2f, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x79, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x20, 0x31, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x31, 0x2c, 0x20, 0x20, 0x31, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x2d, 0x32, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x31, 0x2c, 0x20, 0x2d, 0x32, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x2a, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x65, 0x28, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x7d, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x65, 0x70, 0x28, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x64, 0x2e, 0x79, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x43, 0x4f, 0x52, 0x4e, 0x45, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x29, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x2f, 0x3d, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x78, 0x20, 0x2b, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x52, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x79, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x78, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x20, 0x31, 0x2c, 0x20, 0x31, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x2d, 0x32, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x79, 0x20, 0x2d, 0x3d, 0x20, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x2d, 0x32, 0x2c, 0x20, 0x31, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x2a, 0x3d, 0x20, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x65, 0x28, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x50, 0x61, 0x73, 0x73, 0x29, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x4a, 0x75, 0x73, 0x74, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x20, 0x31, 0x78, 0x2c, 0x20, 0x73, 0x65, 0x65, 0x20, 0x40, 0x53, 0x55, 0x42, 0x53, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x44, 0x49, 0x43, 0x45, 0x53, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x61, 0x74, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x44, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x6e, 0x6f, 0x72, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x65, 0x73, 0x74, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x69, 0x73, 0x20, 0x65, 0x6e, 0x6f, 0x75, 0x67, 0x68, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x69, 0x61, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x65, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x20, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x64, 0x69, 0x61, 0x67, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x77, 0x65, 0x20, 0x73, 0x6b, 0x69, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x2f, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x20, 0x3d, 0x3d, 0x20, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x67, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x20, 0x2b, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x67, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x58, 0x4c, 0x65, 0x66, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x79, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x79, 0x20, 0x28, 0x40, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x6f, 0x77, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x2c, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x61, 0x74, 0x20, 0x61, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x20, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x74, 0x20, 0x2d, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x28, 0x73, 0x65, 0x65, 0x20, 0x40, 0x43, 0x52, 0x4f, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x29, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x64, 0x69, 0x73, 0x63, 0x65, 0x72, 0x6e, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x65, 0x64, 0x67, 0x65, 0x20, 0x68, 0x61, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x58, 0x52, 0x69, 0x67, 0x68, 0x74, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x20, 0x28, 0x64, 0x6f, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x6e, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x20, 0x61, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x65, 0x74, 0x69, 0x63, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x29, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x7a, 0x7a, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x78, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x61, 0x20, 0x73, 0x71, 0x72, 0x74, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x79, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x31, 0x2c, 0x20, 0x30, 0x29, 0x29, 0x2e, 0x72, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4f, 0x6b, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x6b, 0x6e, 0x6f, 0x77, 0x20, 0x68, 0x6f, 0x77, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x61, 0x72, 0x65, 0x61, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x64, 0x2c, 0x20, 0x65, 0x31, 0x2c, 0x20, 0x65, 0x32, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x78, 0x20, 0x63, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x72, 0x67, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x7a, 0x79, 0x2c, 0x20, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x21, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x41, 0x47, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x2e, 0x72, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x30, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x6b, 0x69, 0x70, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x2e, 0x72, 0x20, 0x3e, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x20, 0x7b, 0x20, 0x2f, 0x2f, 0x20, 0x45, 0x64, 0x67, 0x65, 0x20, 0x61, 0x74, 0x20, 0x77, 0x65, 0x73, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x64, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x59, 0x55, 0x70, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x2e, 0x78, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x20, 0x2d, 0x20, 0x30, 0x2e, 0x32, 0x35, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x79, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x31, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x59, 0x44, 0x6f, 0x77, 0x6e, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x31, 0x5d, 0x2e, 0x7a, 0x77, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x32, 0x5d, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x7a, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x28, 0x6d, 0x61, 0x64, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x77, 0x77, 0x2c, 0x20, 0x64, 0x2c, 0x20, 0x2d, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x79, 0x79, 0x29, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x20, 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x20, 0x61, 0x20, 0x73, 0x71, 0x72, 0x74, 0x2c, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x73, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x63, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x65, 0x32, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x7a, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x31, 0x29, 0x29, 0x2e, 0x67, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x72, 0x65, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x62, 0x61, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x41, 0x72, 0x65, 0x61, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x73, 0x71, 0x72, 0x74, 0x5f, 0x64, 0x2c, 0x20, 0x65, 0x31, 0x2c, 0x20, 0x65, 0x32, 0x2c, 0x20, 0x73, 0x75, 0x62, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x78, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x69, 0x78, 0x20, 0x63, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x43, 0x6f, 0x72, 0x6e, 0x65, 0x72, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x50, 0x61, 0x73, 0x73, 0x32, 0x44, 0x28, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x2e, 0x62, 0x61, 0x2c, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x78, 0x79, 0x78, 0x7a, 0x2c, 0x20, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x20, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x54, 0x68, 0x69, 0x72, 0x64, 0x20, 0x50, 0x61, 0x73, 0x73, 0x29, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x61, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x78, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2e, 0x78, 0x79, 0x29, 0x2e, 0x61, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x69, 0x67, 0x68, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2e, 0x7a, 0x77, 0x29, 0x2e, 0x67, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x6f, 0x70, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x2e, 0x77, 0x7a, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x78, 0x7a, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x42, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x20, 0x2f, 0x20, 0x4c, 0x65, 0x66, 0x74, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x49, 0x73, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x67, 0x72, 0x65, 0x61, 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x61, 0x6e, 0x20, 0x30, 0x2e, 0x30, 0x3f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x42, 0x52, 0x41, 0x4e, 0x43, 0x48, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x28, 0x61, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x20, 0x3c, 0x20, 0x31, 0x65, 0x2d, 0x35, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x35, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x6c, 0x20, 0x68, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x61, 0x2e, 0x78, 0x2c, 0x20, 0x61, 0x2e, 0x7a, 0x29, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x61, 0x2e, 0x79, 0x2c, 0x20, 0x61, 0x2e, 0x77, 0x29, 0x3b, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x3e, 0x20, 0x6d, 0x61, 0x78, 0x28, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x61, 0x2e, 0x79, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x61, 0x2e, 0x77, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x2e, 0x79, 0x77, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x28, 0x68, 0x2c, 0x20, 0x68, 0x2c, 0x20, 0x68, 0x2c, 0x20, 0x68, 0x29, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x61, 0x2e, 0x78, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x2c, 0x20, 0x61, 0x2e, 0x7a, 0x2c, 0x20, 0x30, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4d, 0x6f, 0x76, 0x63, 0x28, 0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x28, 0x68, 0x2c, 0x20, 0x68, 0x29, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x61, 0x2e, 0x78, 0x7a, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x2f, 0x3d, 0x20, 0x64, 0x6f, 0x74, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x28, 0x31, 0x2e, 0x30, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x64, 0x28, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x2c, 0x20, 0x2d, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x2e, 0x78, 0x79, 0x29, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x57, 0x65, 0x20, 0x65, 0x78, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x20, 0x62, 0x69, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x6f, 0x73, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x73, 0x74, 0x61, 0x67, 0x65, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x78, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x78, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x79, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x5a, 0x65, 0x72, 0x6f, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x2e, 0x7a, 0x77, 0x29, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x61, 0x20, 0x3d, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x35, 0x2e, 0x30, 0x20, 0x2a, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x29, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x6c, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x20, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x73, 0x73, 0x29, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2c, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x54, 0x65, 0x78, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x69, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x56, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6c, 0x75, 0x72, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x2d, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x56, 0x45, 0x4c, 0x4f, 0x43, 0x49, 0x54, 0x59, 0x28, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x2e, 0x72, 0x67, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x46, 0x65, 0x74, 0x63, 0x68, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x52, 0x65, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, 0x74, 0x63, 0x68, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x2b, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x74, 0x74, 0x65, 0x6e, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x6c, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x61, 0x62, 0x73, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2e, 0x61, 0x20, 0x2d, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x2e, 0x61, 0x20, 0x2a, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x2e, 0x61, 0x29, 0x20, 0x2f, 0x20, 0x35, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x20, 0x3d, 0x20, 0x30, 0x2e, 0x35, 0x20, 0x2a, 0x20, 0x73, 0x61, 0x74, 0x75, 0x72, 0x61, 0x74, 0x65, 0x28, 0x31, 0x2e, 0x30, 0x20, 0x2d, 0x20, 0x73, 0x71, 0x72, 0x74, 0x28, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x29, 0x20, 0x2a, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x52, 0x45, 0x50, 0x52, 0x4f, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x45, 0x49, 0x47, 0x48, 0x54, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x29, 0x3b, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x20, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x65, 0x72, 0x70, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x2c, 0x20, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4a, 0x75, 0x73, 0x74, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x73, 0x3a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x28, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x65, 0x72, 0x70, 0x28, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x2c, 0x20, 0x30, 0x2e, 0x35, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x7d, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x2f, 0x2f, 0x20, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x20, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x50, 0x69, 0x78, 0x65, 0x6c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x50, 0x61, 0x73, 0x73, 0x29, 0x0a, 0x0a, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4c, 0x6f, 0x61, 0x64, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x65, 0x50, 0x53, 0x28, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x30, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x31, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x4d, 0x53, 0x32, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x4d, 0x53, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x74, 0x32, 0x28, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x30, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4c, 0x6f, 0x61, 0x64, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x4d, 0x53, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x30, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x31, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4c, 0x6f, 0x61, 0x64, 0x28, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x4d, 0x53, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x31, 0x29, 0x3b, 0x0a, 0x7d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x0a, 0x0a, 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x5f, 0x49, 0x4e, 0x43, 0x4c, 0x55, 0x44, 0x45, 0x5f, 0x50, 0x53, 0x0a, 0x00 }; + +std::string glsl_smaa_base = std::string(reinterpret_cast(glsl_smaa_base_bytes), 55040); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_base.h b/tests/gal-regression/native/generated/glsl_smaa_base.h new file mode 100644 index 0000000..5dec2d2 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_base.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_base.glsl +#ifndef GLSL_SMAA_BASE_H +#define GLSL_SMAA_BASE_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_base; +} +} + +#endif // GLSL_SMAA_BASE_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.cpp new file mode 100644 index 0000000..7da1b97 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_1_frag_color.glsl +#include +#include "glsl_smaa_pass_1_frag_color.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_1_frag_color_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_1_frag_color = std::string(reinterpret_cast(glsl_smaa_pass_1_frag_color_bytes), 170); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.h b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.h new file mode 100644 index 0000000..c8ceb15 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_color.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_1_frag_color.glsl +#ifndef GLSL_SMAA_PASS_1_FRAG_COLOR_H +#define GLSL_SMAA_PASS_1_FRAG_COLOR_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_1_frag_color; +} +} + +#endif // GLSL_SMAA_PASS_1_FRAG_COLOR_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.cpp new file mode 100644 index 0000000..d1113a8 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_1_frag_luma.glsl +#include +#include "glsl_smaa_pass_1_frag_luma.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_1_frag_luma_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2e, 0x78, 0x79, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4c, 0x75, 0x6d, 0x61, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x29, 0x2e, 0x78, 0x79, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_1_frag_luma = std::string(reinterpret_cast(glsl_smaa_pass_1_frag_luma_bytes), 169); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.h b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.h new file mode 100644 index 0000000..5c50a4c --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_1_frag_luma.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_1_frag_luma.glsl +#ifndef GLSL_SMAA_PASS_1_FRAG_LUMA_H +#define GLSL_SMAA_PASS_1_FRAG_LUMA_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_1_frag_luma; +} +} + +#endif // GLSL_SMAA_PASS_1_FRAG_LUMA_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.cpp new file mode 100644 index 0000000..f04c7b2 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_1_vert.glsl +#include +#include "glsl_smaa_pass_1_vert.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_1_vert_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x73, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x45, 0x64, 0x67, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x53, 0x28, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x20, 0x20, 0x3d, 0x20, 0x66, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x29, 0x3b, 0x0a, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_1_vert = std::string(reinterpret_cast(glsl_smaa_pass_1_vert_bytes), 179); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.h b/tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.h new file mode 100644 index 0000000..56cf670 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_1_vert.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_1_vert.glsl +#ifndef GLSL_SMAA_PASS_1_VERT_H +#define GLSL_SMAA_PASS_1_VERT_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_1_vert; +} +} + +#endif // GLSL_SMAA_PASS_1_VERT_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.cpp new file mode 100644 index 0000000..e8c330e --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_2_frag.glsl +#include +#include "glsl_smaa_pass_2_frag.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_2_frag_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x53, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x65, 0x64, 0x67, 0x65, 0x73, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x61, 0x72, 0x65, 0x61, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, 0x30, 0x2e, 0x2c, 0x30, 0x2e, 0x2c, 0x30, 0x2e, 0x2c, 0x30, 0x2e, 0x29, 0x29, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_2_frag = std::string(reinterpret_cast(glsl_smaa_pass_2_frag_bytes), 299); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.h b/tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.h new file mode 100644 index 0000000..a619faf --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_2_frag.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_2_frag.glsl +#ifndef GLSL_SMAA_PASS_2_FRAG_H +#define GLSL_SMAA_PASS_2_FRAG_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_2_frag; +} +} + +#endif // GLSL_SMAA_PASS_2_FRAG_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.cpp new file mode 100644 index 0000000..668bfba --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_2_vert.glsl +#include +#include "glsl_smaa_pass_2_vert.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_2_vert_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5b, 0x33, 0x5d, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x73, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x53, 0x28, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x70, 0x69, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x29, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_2_vert = std::string(reinterpret_cast(glsl_smaa_pass_2_vert_bytes), 222); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.h b/tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.h new file mode 100644 index 0000000..b55e825 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_2_vert.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_2_vert.glsl +#ifndef GLSL_SMAA_PASS_2_VERT_H +#define GLSL_SMAA_PASS_2_VERT_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_2_vert; +} +} + +#endif // GLSL_SMAA_PASS_2_VERT_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.cpp new file mode 100644 index 0000000..8b1206f --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_3_frag.glsl +#include +#include "glsl_smaa_pass_3_frag.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_3_frag_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x50, 0x53, 0x28, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x2c, 0x20, 0x62, 0x6c, 0x65, 0x6e, 0x64, 0x54, 0x65, 0x78, 0x29, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_3_frag = std::string(reinterpret_cast(glsl_smaa_pass_3_frag_bytes), 201); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.h b/tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.h new file mode 100644 index 0000000..840c65e --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_3_frag.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_3_frag.glsl +#ifndef GLSL_SMAA_PASS_3_FRAG_H +#define GLSL_SMAA_PASS_3_FRAG_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_3_frag; +} +} + +#endif // GLSL_SMAA_PASS_3_FRAG_H diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.cpp b/tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.cpp new file mode 100644 index 0000000..2aaeb53 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.cpp @@ -0,0 +1,13 @@ +// Auto-generated from smaa_pass_3_vert.glsl +#include +#include "glsl_smaa_pass_3_vert.h" + +namespace KIGFX { +namespace BUILTIN_SHADERS { + +static unsigned char glsl_smaa_pass_3_vert_bytes[] = { 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x3b, 0x0a, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x20, 0x3d, 0x20, 0x67, 0x6c, 0x5f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x54, 0x65, 0x78, 0x43, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x2e, 0x73, 0x74, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x4d, 0x41, 0x41, 0x4e, 0x65, 0x69, 0x67, 0x68, 0x62, 0x6f, 0x72, 0x68, 0x6f, 0x6f, 0x64, 0x42, 0x6c, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x56, 0x53, 0x28, 0x20, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x28, 0x29, 0x3b, 0x0a, 0x7d, 0x00 }; + +std::string glsl_smaa_pass_3_vert = std::string(reinterpret_cast(glsl_smaa_pass_3_vert_bytes), 181); + +} +} diff --git a/tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.h b/tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.h new file mode 100644 index 0000000..e38f637 --- /dev/null +++ b/tests/gal-regression/native/generated/glsl_smaa_pass_3_vert.h @@ -0,0 +1,13 @@ +// Auto-generated shader header from smaa_pass_3_vert.glsl +#ifndef GLSL_SMAA_PASS_3_VERT_H +#define GLSL_SMAA_PASS_3_VERT_H + +#include + +namespace KIGFX { +namespace BUILTIN_SHADERS { + extern std::string glsl_smaa_pass_3_vert; +} +} + +#endif // GLSL_SMAA_PASS_3_VERT_H diff --git a/tests/gal-regression/native/kicad_stubs.cpp b/tests/gal-regression/native/kicad_stubs.cpp new file mode 100644 index 0000000..6912650 --- /dev/null +++ b/tests/gal-regression/native/kicad_stubs.cpp @@ -0,0 +1,269 @@ +/** + * KiCad stubs implementation for native GAL test build + * + * Provides implementations for symbols declared in KiCad headers + * but not included in the GAL source files we compile. + */ + +#include +#include +#include +#include + +// Forward-declared types in pgm_base.h need complete definitions +// before we can implement PGM_BASE constructor/destructor +class SETTINGS_MANAGER {}; +class LIBRARY_MANAGER {}; +class BACKGROUND_JOBS_MONITOR {}; +class NOTIFICATIONS_MANAGER {}; + +// Include KiCad headers +#include +#include +#include // For GL_CONTEXT_MANAGER definition + +//============================================================================= +// PGM_BASE minimal implementation +// Note: We can't inherit from PGM_BASE as GetGLContextManager isn't virtual. +// Instead we define our own simple singleton that returns a GL_CONTEXT_MANAGER. +//============================================================================= + +// The real Pgm() needs to return a PGM_BASE reference. +// PGM_BASE has GetGLContextManager() which GAL uses. + +// Create a minimal subclass with the functionality we need +class PGM_BASE_TEST : public PGM_BASE { +public: + PGM_BASE_TEST() : PGM_BASE() {} + + // Implement required pure virtual + void MacOpenFile(const wxString& aFileName) override {} +}; + +static PGM_BASE_TEST* s_pgmInstance = nullptr; + +PGM_BASE& Pgm() { + if (!s_pgmInstance) { + s_pgmInstance = new PGM_BASE_TEST(); + } + return *s_pgmInstance; +} + +//============================================================================= +// ADVANCED_CFG singleton +//============================================================================= + +const ADVANCED_CFG& ADVANCED_CFG::GetCfg() { + static ADVANCED_CFG instance; + return instance; +} + +//============================================================================= +// Build version +//============================================================================= + +const char* GetBuildVersion() { + return "8.0.0-test"; +} + +//============================================================================= +// Additional stub symbols needed for linking +//============================================================================= + +#include +#include + +namespace UTIL { +namespace DETAIL { + +OBSERVABLE_BASE::OBSERVABLE_BASE() {} +OBSERVABLE_BASE::~OBSERVABLE_BASE() {} +void OBSERVABLE_BASE::on_observers_empty() {} +void OBSERVABLE_BASE::enter_iteration() {} +void OBSERVABLE_BASE::leave_iteration() {} +void OBSERVABLE_BASE::add_observer(void*) {} +void OBSERVABLE_BASE::remove_observer(void*) {} + +} // namespace DETAIL +} // namespace UTIL + +// KIFONT stubs - only define symbols not already inline in headers +#include + +namespace KIFONT { + +FONT* FONT::GetFont(const wxString&, bool, bool, const std::vector*, bool) { + return nullptr; +} + +// Note: FONT::Draw methods are inline in the header, don't redefine them + +const METRICS& METRICS::Default() { + static METRICS m; + return m; +} + +void OUTLINE_GLYPH::Triangulate(std::function) const {} + +} // namespace KIFONT + +// SHAPE_POLY_SET stub +#include + +bool SHAPE_POLY_SET::IsTriangulationUpToDate() const { + return false; +} + +// KIID niluuid +#include + +KIID niluuid; + +// Include environment.h for ENV_VAR_MAP typedef +#include + +// PGM_BASE virtual methods that need implementations +wxApp& PGM_BASE::App() { + return *wxTheApp; +} + +COMMON_SETTINGS* PGM_BASE::GetCommonSettings() const { + return nullptr; +} + +const wxString& PGM_BASE::GetExecutablePath() const { + static wxString empty; + return empty; +} + +ENV_VAR_MAP& PGM_BASE::GetLocalEnvVariables() const { + static ENV_VAR_MAP empty; + return empty; +} + +bool PGM_BASE::SetLanguage(wxString&, bool) { return false; } +const wxString& PGM_BASE::GetTextEditor(bool) { static wxString s; return s; } +void PGM_BASE::SetTextEditor(const wxString&) {} +wxString PGM_BASE::GetLanguageTag() { return wxString(); } +void PGM_BASE::SetLanguagePath() {} +void PGM_BASE::ReadPdfBrowserInfos() {} +bool PGM_BASE::SetLocalEnvVariable(const wxString&, const wxString&) { return false; } +void PGM_BASE::SetLocalEnvVariables() {} +void PGM_BASE::WritePdfBrowserInfos() {} +void PGM_BASE::SetLanguageIdentifier(int) {} +const wxString PGM_BASE::AskUserForPreferredEditor(const wxString&) { return wxString(); } + +PGM_BASE::PGM_BASE() { + m_singleton.Init(); // Initialize GL_CONTEXT_MANAGER +} +PGM_BASE::~PGM_BASE() {} + +//============================================================================= +// Additional linker stubs +//============================================================================= + +// UI dialog stubs +void DisplayError(wxWindow*, const wxString&) {} +void DisplayErrorMessage(wxWindow*, const wxString&, const wxString&) {} + +// OpenGL info stub +void SetOpenGLInfo(const char*, const char*, const char*) {} + +// Math logging stub +void kimathLogOverflow(double, const char*) {} + +// Arc geometry stub +#include +int GetArcToSegmentCount(int aRadius, int aArcError, const EDA_ANGLE& aArcAngle) { + // Simple approximation: 1 segment per 10 degrees + double degrees = std::abs(aArcAngle.AsDegrees()); + return std::max(1, (int)(degrees / 10.0)); +} + +// Bezier curve stub +#include +void BEZIER_POLY::GetPoly(std::vector& aOutput, double aMinSegLen) { + // Return just start and end points + if (!m_ctrlPts.empty()) { + aOutput.push_back(m_ctrlPts.front()); + aOutput.push_back(m_ctrlPts.back()); + } +} + +// DPI scaling stub +#include +double DPI_SCALING::GetDefaultScaleFactor() { return 1.0; } + +// Advanced config constructor +ADVANCED_CFG::ADVANCED_CFG() { + // Initialize m_ScreenDPI - KiCad default is 91 + m_ScreenDPI = 91; +} + +// Cursor store stub +#include +const WX_CURSOR_TYPE CURSOR_STORE::GetCursor(KICURSOR aCursor, bool aHiDPI) { + return wxCursor(wxCURSOR_ARROW); +} + +// Singleton init/destructor +#include +void KICAD_SINGLETON::Init() { + m_GLContextManager = new GL_CONTEXT_MANAGER(); + // Skip thread pool for now +} +KICAD_SINGLETON::~KICAD_SINGLETON() { + delete m_GLContextManager; + m_GLContextManager = nullptr; +} + +// TEXT_ATTRIBUTES constructor +#include +TEXT_ATTRIBUTES::TEXT_ATTRIBUTES(KIFONT::FONT* aFont) {} + +// KIID constructors +KIID::KIID() {} +KIID::KIID(int aValue) {} + +// UTF8 stubs +#include +UTF8::UTF8(const wxString& s) : m_s(s.ToUTF8().data()) {} +int UTF8::uni_forward(const unsigned char* aSequence, unsigned* aResult) { + if (aSequence && *aSequence) { + if (aResult) *aResult = (unsigned)*aSequence; + return 1; + } + if (aResult) *aResult = 0; + return 0; +} + +// UTIL::LINK stubs +namespace UTIL { +LINK::LINK() : token_(nullptr), observer_(nullptr) {} +LINK::LINK(std::shared_ptr token, void* observer) + : token_(token), observer_(observer) {} +LINK::LINK(LINK&& other) : token_(std::move(other.token_)), observer_(other.observer_) { + other.observer_ = nullptr; +} +LINK::~LINK() {} +LINK& LINK::operator=(LINK&& other) { + token_ = std::move(other.token_); + observer_ = other.observer_; + other.observer_ = nullptr; + return *this; +} +void LINK::reset() { token_.reset(); observer_ = nullptr; } +LINK::operator bool() const { return token_ != nullptr; } +} + +// VC_SETTINGS::Reset stub +#include +namespace KIGFX { +void VC_SETTINGS::Reset() {} +} + +// KIFONT::FONT::Draw stub (the version with cursor position) +namespace KIFONT { +void FONT::Draw(KIGFX::GAL*, const wxString&, const VECTOR2I&, const VECTOR2I&, + const TEXT_ATTRIBUTES&, const METRICS&) const {} +} // namespace KIFONT diff --git a/tests/gal-regression/native/kicad_stubs.h b/tests/gal-regression/native/kicad_stubs.h new file mode 100644 index 0000000..a58a5e0 --- /dev/null +++ b/tests/gal-regression/native/kicad_stubs.h @@ -0,0 +1,27 @@ +/** + * KiCad stubs for native GAL test build + * + * This header ONLY provides includes - no type definitions. + * Implementations of missing symbols are in kicad_stubs.cpp. + */ + +#ifndef KICAD_STUBS_H +#define KICAD_STUBS_H + +// GLEW must come before any OpenGL headers (including wx/glcanvas.h) +#include + +// System wxWidgets +#include +#include + +// Profiler macros - no-op +#ifndef PROF_TIMER +#define PROF_TIMER(name) +#endif + +#ifndef PROF_END +#define PROF_END(name) +#endif + +#endif // KICAD_STUBS_H diff --git a/tests/gal-regression/native/stb_image_write.h b/tests/gal-regression/native/stb_image_write.h new file mode 100644 index 0000000..e4b32ed --- /dev/null +++ b/tests/gal-regression/native/stb_image_write.h @@ -0,0 +1,1724 @@ +/* stb_image_write - v1.16 - public domain - http://nothings.org/stb + writes out PNG/BMP/TGA/JPEG/HDR images to C stdio - Sean Barrett 2010-2015 + no warranty implied; use at your own risk + + Before #including, + + #define STB_IMAGE_WRITE_IMPLEMENTATION + + in the file that you want to have the implementation. + + Will probably not work correctly with strict-aliasing optimizations. + +ABOUT: + + This header file is a library for writing images to C stdio or a callback. + + The PNG output is not optimal; it is 20-50% larger than the file + written by a decent optimizing implementation; though providing a custom + zlib compress function (see STBIW_ZLIB_COMPRESS) can mitigate that. + This library is designed for source code compactness and simplicity, + not optimal image file size or run-time performance. + +BUILDING: + + You can #define STBIW_ASSERT(x) before the #include to avoid using assert.h. + You can #define STBIW_MALLOC(), STBIW_REALLOC(), and STBIW_FREE() to replace + malloc,realloc,free. + You can #define STBIW_MEMMOVE() to replace memmove() + You can #define STBIW_ZLIB_COMPRESS to use a custom zlib-style compress function + for PNG compression (instead of the builtin one), it must have the following signature: + unsigned char * my_compress(unsigned char *data, int data_len, int *out_len, int quality); + The returned data will be freed with STBIW_FREE() (free() by default), + so it must be heap allocated with STBIW_MALLOC() (malloc() by default), + +UNICODE: + + If compiling for Windows and you wish to use Unicode filenames, compile + with + #define STBIW_WINDOWS_UTF8 + and pass utf8-encoded filenames. Call stbiw_convert_wchar_to_utf8 to convert + Windows wchar_t filenames to utf8. + +USAGE: + + There are five functions, one for each image file format: + + int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); + int stbi_write_jpg(char const *filename, int w, int h, int comp, const void *data, int quality); + int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); + + void stbi_flip_vertically_on_write(int flag); // flag is non-zero to flip data vertically + + There are also five equivalent functions that use an arbitrary write function. You are + expected to open/close your file-equivalent before and after calling these: + + int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); + int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); + int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); + int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + + where the callback is: + void stbi_write_func(void *context, void *data, int size); + + You can configure it with these global variables: + int stbi_write_tga_with_rle; // defaults to true; set to 0 to disable RLE + int stbi_write_png_compression_level; // defaults to 8; set to higher for more compression + int stbi_write_force_png_filter; // defaults to -1; set to 0..5 to force a filter mode + + + You can define STBI_WRITE_NO_STDIO to disable the file variant of these + functions, so the library will not use stdio.h at all. However, this will + also disable HDR writing, because it requires stdio for formatted output. + + Each function returns 0 on failure and non-0 on success. + + The functions create an image file defined by the parameters. The image + is a rectangle of pixels stored from left-to-right, top-to-bottom. + Each pixel contains 'comp' channels of data stored interleaved with 8-bits + per channel, in the following order: 1=Y, 2=YA, 3=RGB, 4=RGBA. (Y is + monochrome color.) The rectangle is 'w' pixels wide and 'h' pixels tall. + The *data pointer points to the first byte of the top-left-most pixel. + For PNG, "stride_in_bytes" is the distance in bytes from the first byte of + a row of pixels to the first byte of the next row of pixels. + + PNG creates output files with the same number of components as the input. + The BMP format expands Y to RGB in the file format and does not + output alpha. + + PNG supports writing rectangles of data even when the bytes storing rows of + data are not consecutive in memory (e.g. sub-rectangles of a larger image), + by supplying the stride between the beginning of adjacent rows. The other + formats do not. (Thus you cannot write a native-format BMP through the BMP + writer, both because it is in BGR order and because it may have padding + at the end of the line.) + + PNG allows you to set the deflate compression level by setting the global + variable 'stbi_write_png_compression_level' (it defaults to 8). + + HDR expects linear float data. Since the format is always 32-bit rgb(e) + data, alpha (if provided) is discarded, and for monochrome data it is + replicated across all three channels. + + TGA supports RLE or non-RLE compressed data. To use non-RLE-compressed + data, set the global variable 'stbi_write_tga_with_rle' to 0. + + JPEG does ignore alpha channels in input data; quality is between 1 and 100. + Higher quality looks better but results in a bigger image. + JPEG baseline (no JPEG progressive). + +CREDITS: + + + Sean Barrett - PNG/BMP/TGA + Baldur Karlsson - HDR + Jean-Sebastien Guay - TGA monochrome + Tim Kelsey - misc enhancements + Alan Hickman - TGA RLE + Emmanuel Julien - initial file IO callback implementation + Jon Olick - original jo_jpeg.cpp code + Daniel Gibson - integrate JPEG, allow external zlib + Aarni Koskela - allow choosing PNG filter + + bugfixes: + github:Chribba + Guillaume Chereau + github:jry2 + github:romigrou + Sergio Gonzalez + Jonas Karlsson + Filip Wasil + Thatcher Ulrich + github:poppolopoppo + Patrick Boettcher + github:xeekworx + Cap Petschulat + Simon Rodriguez + Ivan Tikhonov + github:ignotion + Adam Schackart + Andrew Kensler + +LICENSE + + See end of file for license information. + +*/ + +#ifndef INCLUDE_STB_IMAGE_WRITE_H +#define INCLUDE_STB_IMAGE_WRITE_H + +#include + +// if STB_IMAGE_WRITE_STATIC causes problems, try defining STBIWDEF to 'inline' or 'static inline' +#ifndef STBIWDEF +#ifdef STB_IMAGE_WRITE_STATIC +#define STBIWDEF static +#else +#ifdef __cplusplus +#define STBIWDEF extern "C" +#else +#define STBIWDEF extern +#endif +#endif +#endif + +#ifndef STB_IMAGE_WRITE_STATIC // C++ forbids static forward declarations +STBIWDEF int stbi_write_tga_with_rle; +STBIWDEF int stbi_write_png_compression_level; +STBIWDEF int stbi_write_force_png_filter; +#endif + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga(char const *filename, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr(char const *filename, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality); + +#ifdef STBIW_WINDOWS_UTF8 +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif +#endif + +typedef void stbi_write_func(void *context, void *data, int size); + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data, int stride_in_bytes); +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const void *data); +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, int h, int comp, const float *data); +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality); + +STBIWDEF void stbi_flip_vertically_on_write(int flip_boolean); + +#endif//INCLUDE_STB_IMAGE_WRITE_H + +#ifdef STB_IMAGE_WRITE_IMPLEMENTATION + +#ifdef _WIN32 + #ifndef _CRT_SECURE_NO_WARNINGS + #define _CRT_SECURE_NO_WARNINGS + #endif + #ifndef _CRT_NONSTDC_NO_DEPRECATE + #define _CRT_NONSTDC_NO_DEPRECATE + #endif +#endif + +#ifndef STBI_WRITE_NO_STDIO +#include +#endif // STBI_WRITE_NO_STDIO + +#include +#include +#include +#include + +#if defined(STBIW_MALLOC) && defined(STBIW_FREE) && (defined(STBIW_REALLOC) || defined(STBIW_REALLOC_SIZED)) +// ok +#elif !defined(STBIW_MALLOC) && !defined(STBIW_FREE) && !defined(STBIW_REALLOC) && !defined(STBIW_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBIW_MALLOC, STBIW_FREE, and STBIW_REALLOC (or STBIW_REALLOC_SIZED)." +#endif + +#ifndef STBIW_MALLOC +#define STBIW_MALLOC(sz) malloc(sz) +#define STBIW_REALLOC(p,newsz) realloc(p,newsz) +#define STBIW_FREE(p) free(p) +#endif + +#ifndef STBIW_REALLOC_SIZED +#define STBIW_REALLOC_SIZED(p,oldsz,newsz) STBIW_REALLOC(p,newsz) +#endif + + +#ifndef STBIW_MEMMOVE +#define STBIW_MEMMOVE(a,b,sz) memmove(a,b,sz) +#endif + + +#ifndef STBIW_ASSERT +#include +#define STBIW_ASSERT(x) assert(x) +#endif + +#define STBIW_UCHAR(x) (unsigned char) ((x) & 0xff) + +#ifdef STB_IMAGE_WRITE_STATIC +static int stbi_write_png_compression_level = 8; +static int stbi_write_tga_with_rle = 1; +static int stbi_write_force_png_filter = -1; +#else +int stbi_write_png_compression_level = 8; +int stbi_write_tga_with_rle = 1; +int stbi_write_force_png_filter = -1; +#endif + +static int stbi__flip_vertically_on_write = 0; + +STBIWDEF void stbi_flip_vertically_on_write(int flag) +{ + stbi__flip_vertically_on_write = flag; +} + +typedef struct +{ + stbi_write_func *func; + void *context; + unsigned char buffer[64]; + int buf_used; +} stbi__write_context; + +// initialize a callback-based context +static void stbi__start_write_callbacks(stbi__write_context *s, stbi_write_func *c, void *context) +{ + s->func = c; + s->context = context; +} + +#ifndef STBI_WRITE_NO_STDIO + +static void stbi__stdio_write(void *context, void *data, int size) +{ + fwrite(data,1,size,(FILE*) context); +} + +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) +#ifdef __cplusplus +#define STBIW_EXTERN extern "C" +#else +#define STBIW_EXTERN extern +#endif +STBIW_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBIW_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); + +STBIWDEF int stbiw_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbiw__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBIW_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + +static int stbi__start_write_file(stbi__write_context *s, const char *filename) +{ + FILE *f = stbiw__fopen(filename, "wb"); + stbi__start_write_callbacks(s, stbi__stdio_write, (void *) f); + return f != NULL; +} + +static void stbi__end_write_file(stbi__write_context *s) +{ + fclose((FILE *)s->context); +} + +#endif // !STBI_WRITE_NO_STDIO + +typedef unsigned int stbiw_uint32; +typedef int stb_image_write_test[sizeof(stbiw_uint32)==4 ? 1 : -1]; + +static void stbiw__writefv(stbi__write_context *s, const char *fmt, va_list v) +{ + while (*fmt) { + switch (*fmt++) { + case ' ': break; + case '1': { unsigned char x = STBIW_UCHAR(va_arg(v, int)); + s->func(s->context,&x,1); + break; } + case '2': { int x = va_arg(v,int); + unsigned char b[2]; + b[0] = STBIW_UCHAR(x); + b[1] = STBIW_UCHAR(x>>8); + s->func(s->context,b,2); + break; } + case '4': { stbiw_uint32 x = va_arg(v,int); + unsigned char b[4]; + b[0]=STBIW_UCHAR(x); + b[1]=STBIW_UCHAR(x>>8); + b[2]=STBIW_UCHAR(x>>16); + b[3]=STBIW_UCHAR(x>>24); + s->func(s->context,b,4); + break; } + default: + STBIW_ASSERT(0); + return; + } + } +} + +static void stbiw__writef(stbi__write_context *s, const char *fmt, ...) +{ + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); +} + +static void stbiw__write_flush(stbi__write_context *s) +{ + if (s->buf_used) { + s->func(s->context, &s->buffer, s->buf_used); + s->buf_used = 0; + } +} + +static void stbiw__putc(stbi__write_context *s, unsigned char c) +{ + s->func(s->context, &c, 1); +} + +static void stbiw__write1(stbi__write_context *s, unsigned char a) +{ + if ((size_t)s->buf_used + 1 > sizeof(s->buffer)) + stbiw__write_flush(s); + s->buffer[s->buf_used++] = a; +} + +static void stbiw__write3(stbi__write_context *s, unsigned char a, unsigned char b, unsigned char c) +{ + int n; + if ((size_t)s->buf_used + 3 > sizeof(s->buffer)) + stbiw__write_flush(s); + n = s->buf_used; + s->buf_used = n+3; + s->buffer[n+0] = a; + s->buffer[n+1] = b; + s->buffer[n+2] = c; +} + +static void stbiw__write_pixel(stbi__write_context *s, int rgb_dir, int comp, int write_alpha, int expand_mono, unsigned char *d) +{ + unsigned char bg[3] = { 255, 0, 255}, px[3]; + int k; + + if (write_alpha < 0) + stbiw__write1(s, d[comp - 1]); + + switch (comp) { + case 2: // 2 pixels = mono + alpha, alpha is written separately, so same as 1-channel case + case 1: + if (expand_mono) + stbiw__write3(s, d[0], d[0], d[0]); // monochrome bmp + else + stbiw__write1(s, d[0]); // monochrome TGA + break; + case 4: + if (!write_alpha) { + // composite against pink background + for (k = 0; k < 3; ++k) + px[k] = bg[k] + ((d[k] - bg[k]) * d[3]) / 255; + stbiw__write3(s, px[1 - rgb_dir], px[1], px[1 + rgb_dir]); + break; + } + /* FALLTHROUGH */ + case 3: + stbiw__write3(s, d[1 - rgb_dir], d[1], d[1 + rgb_dir]); + break; + } + if (write_alpha > 0) + stbiw__write1(s, d[comp - 1]); +} + +static void stbiw__write_pixels(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, void *data, int write_alpha, int scanline_pad, int expand_mono) +{ + stbiw_uint32 zero = 0; + int i,j, j_end; + + if (y <= 0) + return; + + if (stbi__flip_vertically_on_write) + vdir *= -1; + + if (vdir < 0) { + j_end = -1; j = y-1; + } else { + j_end = y; j = 0; + } + + for (; j != j_end; j += vdir) { + for (i=0; i < x; ++i) { + unsigned char *d = (unsigned char *) data + (j*x+i)*comp; + stbiw__write_pixel(s, rgb_dir, comp, write_alpha, expand_mono, d); + } + stbiw__write_flush(s); + s->func(s->context, &zero, scanline_pad); + } +} + +static int stbiw__outfile(stbi__write_context *s, int rgb_dir, int vdir, int x, int y, int comp, int expand_mono, void *data, int alpha, int pad, const char *fmt, ...) +{ + if (y < 0 || x < 0) { + return 0; + } else { + va_list v; + va_start(v, fmt); + stbiw__writefv(s, fmt, v); + va_end(v); + stbiw__write_pixels(s,rgb_dir,vdir,x,y,comp,data,alpha,pad, expand_mono); + return 1; + } +} + +static int stbi_write_bmp_core(stbi__write_context *s, int x, int y, int comp, const void *data) +{ + if (comp != 4) { + // write RGB bitmap + int pad = (-x*3) & 3; + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *) data,0,pad, + "11 4 22 4" "4 44 22 444444", + 'B', 'M', 14+40+(x*3+pad)*y, 0,0, 14+40, // file header + 40, x,y, 1,24, 0,0,0,0,0,0); // bitmap header + } else { + // RGBA bitmaps need a v4 header + // use BI_BITFIELDS mode with 32bpp and alpha mask + // (straight BI_RGB with alpha mask doesn't work in most readers) + return stbiw__outfile(s,-1,-1,x,y,comp,1,(void *)data,1,0, + "11 4 22 4" "4 44 22 444444 4444 4 444 444 444 444", + 'B', 'M', 14+108+x*y*4, 0, 0, 14+108, // file header + 108, x,y, 1,32, 3,0,0,0,0,0, 0xff0000,0xff00,0xff,0xff000000u, 0, 0,0,0, 0,0,0, 0,0,0, 0,0,0); // bitmap V4 header + } +} + +STBIWDEF int stbi_write_bmp_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_bmp_core(&s, x, y, comp, data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_bmp(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_bmp_core(&s, x, y, comp, data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif //!STBI_WRITE_NO_STDIO + +static int stbi_write_tga_core(stbi__write_context *s, int x, int y, int comp, void *data) +{ + int has_alpha = (comp == 2 || comp == 4); + int colorbytes = has_alpha ? comp-1 : comp; + int format = colorbytes < 2 ? 3 : 2; // 3 color channels (RGB/RGBA) = 2, 1 color channel (Y/YA) = 3 + + if (y < 0 || x < 0) + return 0; + + if (!stbi_write_tga_with_rle) { + return stbiw__outfile(s, -1, -1, x, y, comp, 0, (void *) data, has_alpha, 0, + "111 221 2222 11", 0, 0, format, 0, 0, 0, 0, 0, x, y, (colorbytes + has_alpha) * 8, has_alpha * 8); + } else { + int i,j,k; + int jend, jdir; + + stbiw__writef(s, "111 221 2222 11", 0,0,format+8, 0,0,0, 0,0,x,y, (colorbytes + has_alpha) * 8, has_alpha * 8); + + if (stbi__flip_vertically_on_write) { + j = 0; + jend = y; + jdir = 1; + } else { + j = y-1; + jend = -1; + jdir = -1; + } + for (; j != jend; j += jdir) { + unsigned char *row = (unsigned char *) data + j * x * comp; + int len; + + for (i = 0; i < x; i += len) { + unsigned char *begin = row + i * comp; + int diff = 1; + len = 1; + + if (i < x - 1) { + ++len; + diff = memcmp(begin, row + (i + 1) * comp, comp); + if (diff) { + const unsigned char *prev = begin; + for (k = i + 2; k < x && len < 128; ++k) { + if (memcmp(prev, row + k * comp, comp)) { + prev += comp; + ++len; + } else { + --len; + break; + } + } + } else { + for (k = i + 2; k < x && len < 128; ++k) { + if (!memcmp(begin, row + k * comp, comp)) { + ++len; + } else { + break; + } + } + } + } + + if (diff) { + unsigned char header = STBIW_UCHAR(len - 1); + stbiw__write1(s, header); + for (k = 0; k < len; ++k) { + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin + k * comp); + } + } else { + unsigned char header = STBIW_UCHAR(len - 129); + stbiw__write1(s, header); + stbiw__write_pixel(s, -1, comp, has_alpha, 0, begin); + } + } + } + stbiw__write_flush(s); + } + return 1; +} + +STBIWDEF int stbi_write_tga_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_tga_core(&s, x, y, comp, (void *) data); +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_tga(char const *filename, int x, int y, int comp, const void *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_tga_core(&s, x, y, comp, (void *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR writer +// by Baldur Karlsson + +#define stbiw__max(a, b) ((a) > (b) ? (a) : (b)) + +#ifndef STBI_WRITE_NO_STDIO + +static void stbiw__linear_to_rgbe(unsigned char *rgbe, float *linear) +{ + int exponent; + float maxcomp = stbiw__max(linear[0], stbiw__max(linear[1], linear[2])); + + if (maxcomp < 1e-32f) { + rgbe[0] = rgbe[1] = rgbe[2] = rgbe[3] = 0; + } else { + float normalize = (float) frexp(maxcomp, &exponent) * 256.0f/maxcomp; + + rgbe[0] = (unsigned char)(linear[0] * normalize); + rgbe[1] = (unsigned char)(linear[1] * normalize); + rgbe[2] = (unsigned char)(linear[2] * normalize); + rgbe[3] = (unsigned char)(exponent + 128); + } +} + +static void stbiw__write_run_data(stbi__write_context *s, int length, unsigned char databyte) +{ + unsigned char lengthbyte = STBIW_UCHAR(length+128); + STBIW_ASSERT(length+128 <= 255); + s->func(s->context, &lengthbyte, 1); + s->func(s->context, &databyte, 1); +} + +static void stbiw__write_dump_data(stbi__write_context *s, int length, unsigned char *data) +{ + unsigned char lengthbyte = STBIW_UCHAR(length); + STBIW_ASSERT(length <= 128); // inconsistent with spec but consistent with official code + s->func(s->context, &lengthbyte, 1); + s->func(s->context, data, length); +} + +static void stbiw__write_hdr_scanline(stbi__write_context *s, int width, int ncomp, unsigned char *scratch, float *scanline) +{ + unsigned char scanlineheader[4] = { 2, 2, 0, 0 }; + unsigned char rgbe[4]; + float linear[3]; + int x; + + scanlineheader[2] = (width&0xff00)>>8; + scanlineheader[3] = (width&0x00ff); + + /* skip RLE for images too small or large */ + if (width < 8 || width >= 32768) { + for (x=0; x < width; x++) { + switch (ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + s->func(s->context, rgbe, 4); + } + } else { + int c,r; + /* encode into scratch buffer */ + for (x=0; x < width; x++) { + switch(ncomp) { + case 4: /* fallthrough */ + case 3: linear[2] = scanline[x*ncomp + 2]; + linear[1] = scanline[x*ncomp + 1]; + linear[0] = scanline[x*ncomp + 0]; + break; + default: + linear[0] = linear[1] = linear[2] = scanline[x*ncomp + 0]; + break; + } + stbiw__linear_to_rgbe(rgbe, linear); + scratch[x + width*0] = rgbe[0]; + scratch[x + width*1] = rgbe[1]; + scratch[x + width*2] = rgbe[2]; + scratch[x + width*3] = rgbe[3]; + } + + s->func(s->context, scanlineheader, 4); + + /* RLE each component separately */ + for (c=0; c < 4; c++) { + unsigned char *comp = &scratch[width*c]; + + x = 0; + while (x < width) { + // find first run + r = x; + while (r+2 < width) { + if (comp[r] == comp[r+1] && comp[r] == comp[r+2]) + break; + ++r; + } + if (r+2 >= width) + r = width; + // dump up to first run + while (x < r) { + int len = r-x; + if (len > 128) len = 128; + stbiw__write_dump_data(s, len, &comp[x]); + x += len; + } + // if there's a run, output it + if (r+2 < width) { // same test as what we break out of in search loop, so only true if we break'd + // find next byte after run + while (r < width && comp[r] == comp[x]) + ++r; + // output run up to r + while (x < r) { + int len = r-x; + if (len > 127) len = 127; + stbiw__write_run_data(s, len, comp[x]); + x += len; + } + } + } + } + } +} + +static int stbi_write_hdr_core(stbi__write_context *s, int x, int y, int comp, float *data) +{ + if (y <= 0 || x <= 0 || data == NULL) + return 0; + else { + // Each component is stored separately. Allocate scratch space for full output scanline. + unsigned char *scratch = (unsigned char *) STBIW_MALLOC(x*4); + int i, len; + char buffer[128]; + char header[] = "#?RADIANCE\n# Written by stb_image_write.h\nFORMAT=32-bit_rle_rgbe\n"; + s->func(s->context, header, sizeof(header)-1); + +#ifdef __STDC_LIB_EXT1__ + len = sprintf_s(buffer, sizeof(buffer), "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#else + len = sprintf(buffer, "EXPOSURE= 1.0000000000000\n\n-Y %d +X %d\n", y, x); +#endif + s->func(s->context, buffer, len); + + for(i=0; i < y; i++) + stbiw__write_hdr_scanline(s, x, comp, scratch, data + comp*x*(stbi__flip_vertically_on_write ? y-1-i : i)); + STBIW_FREE(scratch); + return 1; + } +} + +STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_hdr_core(&s, x, y, comp, (float *) data); +} + +STBIWDEF int stbi_write_hdr(char const *filename, int x, int y, int comp, const float *data) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_hdr_core(&s, x, y, comp, (float *) data); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif // STBI_WRITE_NO_STDIO + + +////////////////////////////////////////////////////////////////////////////// +// +// PNG writer +// + +#ifndef STBIW_ZLIB_COMPRESS +// stretchy buffer; stbiw__sbpush() == vector<>::push_back() -- stbiw__sbcount() == vector<>::size() +#define stbiw__sbraw(a) ((int *) (void *) (a) - 2) +#define stbiw__sbm(a) stbiw__sbraw(a)[0] +#define stbiw__sbn(a) stbiw__sbraw(a)[1] + +#define stbiw__sbneedgrow(a,n) ((a)==0 || stbiw__sbn(a)+n >= stbiw__sbm(a)) +#define stbiw__sbmaybegrow(a,n) (stbiw__sbneedgrow(a,(n)) ? stbiw__sbgrow(a,n) : 0) +#define stbiw__sbgrow(a,n) stbiw__sbgrowf((void **) &(a), (n), sizeof(*(a))) + +#define stbiw__sbpush(a, v) (stbiw__sbmaybegrow(a,1), (a)[stbiw__sbn(a)++] = (v)) +#define stbiw__sbcount(a) ((a) ? stbiw__sbn(a) : 0) +#define stbiw__sbfree(a) ((a) ? STBIW_FREE(stbiw__sbraw(a)),0 : 0) + +static void *stbiw__sbgrowf(void **arr, int increment, int itemsize) +{ + int m = *arr ? 2*stbiw__sbm(*arr)+increment : increment+1; + void *p = STBIW_REALLOC_SIZED(*arr ? stbiw__sbraw(*arr) : 0, *arr ? (stbiw__sbm(*arr)*itemsize + sizeof(int)*2) : 0, itemsize * m + sizeof(int)*2); + STBIW_ASSERT(p); + if (p) { + if (!*arr) ((int *) p)[1] = 0; + *arr = (void *) ((int *) p + 2); + stbiw__sbm(*arr) = m; + } + return *arr; +} + +static unsigned char *stbiw__zlib_flushf(unsigned char *data, unsigned int *bitbuffer, int *bitcount) +{ + while (*bitcount >= 8) { + stbiw__sbpush(data, STBIW_UCHAR(*bitbuffer)); + *bitbuffer >>= 8; + *bitcount -= 8; + } + return data; +} + +static int stbiw__zlib_bitrev(int code, int codebits) +{ + int res=0; + while (codebits--) { + res = (res << 1) | (code & 1); + code >>= 1; + } + return res; +} + +static unsigned int stbiw__zlib_countm(unsigned char *a, unsigned char *b, int limit) +{ + int i; + for (i=0; i < limit && i < 258; ++i) + if (a[i] != b[i]) break; + return i; +} + +static unsigned int stbiw__zhash(unsigned char *data) +{ + stbiw_uint32 hash = data[0] + (data[1] << 8) + (data[2] << 16); + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + return hash; +} + +#define stbiw__zlib_flush() (out = stbiw__zlib_flushf(out, &bitbuf, &bitcount)) +#define stbiw__zlib_add(code,codebits) \ + (bitbuf |= (code) << bitcount, bitcount += (codebits), stbiw__zlib_flush()) +#define stbiw__zlib_huffa(b,c) stbiw__zlib_add(stbiw__zlib_bitrev(b,c),c) +// default huffman tables +#define stbiw__zlib_huff1(n) stbiw__zlib_huffa(0x30 + (n), 8) +#define stbiw__zlib_huff2(n) stbiw__zlib_huffa(0x190 + (n)-144, 9) +#define stbiw__zlib_huff3(n) stbiw__zlib_huffa(0 + (n)-256,7) +#define stbiw__zlib_huff4(n) stbiw__zlib_huffa(0xc0 + (n)-280,8) +#define stbiw__zlib_huff(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : (n) <= 255 ? stbiw__zlib_huff2(n) : (n) <= 279 ? stbiw__zlib_huff3(n) : stbiw__zlib_huff4(n)) +#define stbiw__zlib_huffb(n) ((n) <= 143 ? stbiw__zlib_huff1(n) : stbiw__zlib_huff2(n)) + +#define stbiw__ZHASH 16384 + +#endif // STBIW_ZLIB_COMPRESS + +STBIWDEF unsigned char * stbi_zlib_compress(unsigned char *data, int data_len, int *out_len, int quality) +{ +#ifdef STBIW_ZLIB_COMPRESS + // user provided a zlib compress implementation, use that + return STBIW_ZLIB_COMPRESS(data, data_len, out_len, quality); +#else // use builtin + static unsigned short lengthc[] = { 3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258, 259 }; + static unsigned char lengtheb[]= { 0,0,0,0,0,0,0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; + static unsigned short distc[] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577, 32768 }; + static unsigned char disteb[] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 }; + unsigned int bitbuf=0; + int i,j, bitcount=0; + unsigned char *out = NULL; + unsigned char ***hash_table = (unsigned char***) STBIW_MALLOC(stbiw__ZHASH * sizeof(unsigned char**)); + if (hash_table == NULL) + return NULL; + if (quality < 5) quality = 5; + + stbiw__sbpush(out, 0x78); // DEFLATE 32K window + stbiw__sbpush(out, 0x5e); // FLEVEL = 1 + stbiw__zlib_add(1,1); // BFINAL = 1 + stbiw__zlib_add(1,2); // BTYPE = 1 -- fixed huffman + + for (i=0; i < stbiw__ZHASH; ++i) + hash_table[i] = NULL; + + i=0; + while (i < data_len-3) { + // hash next 3 bytes of data to be compressed + int h = stbiw__zhash(data+i)&(stbiw__ZHASH-1), best=3; + unsigned char *bestloc = 0; + unsigned char **hlist = hash_table[h]; + int n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32768) { // if entry lies within window + int d = stbiw__zlib_countm(hlist[j], data+i, data_len-i); + if (d >= best) { best=d; bestloc=hlist[j]; } + } + } + // when hash table entry is too long, delete half the entries + if (hash_table[h] && stbiw__sbn(hash_table[h]) == 2*quality) { + STBIW_MEMMOVE(hash_table[h], hash_table[h]+quality, sizeof(hash_table[h][0])*quality); + stbiw__sbn(hash_table[h]) = quality; + } + stbiw__sbpush(hash_table[h],data+i); + + if (bestloc) { + // "lazy matching" - check match at *next* byte, and if it's better, do cur byte as literal + h = stbiw__zhash(data+i+1)&(stbiw__ZHASH-1); + hlist = hash_table[h]; + n = stbiw__sbcount(hlist); + for (j=0; j < n; ++j) { + if (hlist[j]-data > i-32767) { + int e = stbiw__zlib_countm(hlist[j], data+i+1, data_len-i-1); + if (e > best) { // if next match is better, bail on current match + bestloc = NULL; + break; + } + } + } + } + + if (bestloc) { + int d = (int) (data+i - bestloc); // distance back + STBIW_ASSERT(d <= 32767 && best <= 258); + for (j=0; best > lengthc[j+1]-1; ++j); + stbiw__zlib_huff(j+257); + if (lengtheb[j]) stbiw__zlib_add(best - lengthc[j], lengtheb[j]); + for (j=0; d > distc[j+1]-1; ++j); + stbiw__zlib_add(stbiw__zlib_bitrev(j,5),5); + if (disteb[j]) stbiw__zlib_add(d - distc[j], disteb[j]); + i += best; + } else { + stbiw__zlib_huffb(data[i]); + ++i; + } + } + // write out final bytes + for (;i < data_len; ++i) + stbiw__zlib_huffb(data[i]); + stbiw__zlib_huff(256); // end of block + // pad with 0 bits to byte boundary + while (bitcount) + stbiw__zlib_add(0,1); + + for (i=0; i < stbiw__ZHASH; ++i) + (void) stbiw__sbfree(hash_table[i]); + STBIW_FREE(hash_table); + + // store uncompressed instead if compression was worse + if (stbiw__sbn(out) > data_len + 2 + ((data_len+32766)/32767)*5) { + stbiw__sbn(out) = 2; // truncate to DEFLATE 32K window and FLEVEL = 1 + for (j = 0; j < data_len;) { + int blocklen = data_len - j; + if (blocklen > 32767) blocklen = 32767; + stbiw__sbpush(out, data_len - j == blocklen); // BFINAL = ?, BTYPE = 0 -- no compression + stbiw__sbpush(out, STBIW_UCHAR(blocklen)); // LEN + stbiw__sbpush(out, STBIW_UCHAR(blocklen >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(~blocklen)); // NLEN + stbiw__sbpush(out, STBIW_UCHAR(~blocklen >> 8)); + memcpy(out+stbiw__sbn(out), data+j, blocklen); + stbiw__sbn(out) += blocklen; + j += blocklen; + } + } + + { + // compute adler32 on input + unsigned int s1=1, s2=0; + int blocklen = (int) (data_len % 5552); + j=0; + while (j < data_len) { + for (i=0; i < blocklen; ++i) { s1 += data[j+i]; s2 += s1; } + s1 %= 65521; s2 %= 65521; + j += blocklen; + blocklen = 5552; + } + stbiw__sbpush(out, STBIW_UCHAR(s2 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s2)); + stbiw__sbpush(out, STBIW_UCHAR(s1 >> 8)); + stbiw__sbpush(out, STBIW_UCHAR(s1)); + } + *out_len = stbiw__sbn(out); + // make returned pointer freeable + STBIW_MEMMOVE(stbiw__sbraw(out), out, *out_len); + return (unsigned char *) stbiw__sbraw(out); +#endif // STBIW_ZLIB_COMPRESS +} + +static unsigned int stbiw__crc32(unsigned char *buffer, int len) +{ +#ifdef STBIW_CRC32 + return STBIW_CRC32(buffer, len); +#else + static unsigned int crc_table[256] = + { + 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, + 0x0eDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, + 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, + 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, + 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, + 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, + 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, + 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, + 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, + 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, + 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, + 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, + 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, + 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, + 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, + 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, + 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, + 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, + 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, + 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, + 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, + 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, + 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, + 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, + 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, + 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, + 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, + 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, + 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, + 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, + 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, + 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D + }; + + unsigned int crc = ~0u; + int i; + for (i=0; i < len; ++i) + crc = (crc >> 8) ^ crc_table[buffer[i] ^ (crc & 0xff)]; + return ~crc; +#endif +} + +#define stbiw__wpng4(o,a,b,c,d) ((o)[0]=STBIW_UCHAR(a),(o)[1]=STBIW_UCHAR(b),(o)[2]=STBIW_UCHAR(c),(o)[3]=STBIW_UCHAR(d),(o)+=4) +#define stbiw__wp32(data,v) stbiw__wpng4(data, (v)>>24,(v)>>16,(v)>>8,(v)); +#define stbiw__wptag(data,s) stbiw__wpng4(data, s[0],s[1],s[2],s[3]) + +static void stbiw__wpcrc(unsigned char **data, int len) +{ + unsigned int crc = stbiw__crc32(*data - len - 4, len+4); + stbiw__wp32(*data, crc); +} + +static unsigned char stbiw__paeth(int a, int b, int c) +{ + int p = a + b - c, pa = abs(p-a), pb = abs(p-b), pc = abs(p-c); + if (pa <= pb && pa <= pc) return STBIW_UCHAR(a); + if (pb <= pc) return STBIW_UCHAR(b); + return STBIW_UCHAR(c); +} + +// @OPTIMIZE: provide an option that always forces left-predict or paeth predict +static void stbiw__encode_png_line(unsigned char *pixels, int stride_bytes, int width, int height, int y, int n, int filter_type, signed char *line_buffer) +{ + static int mapping[] = { 0,1,2,3,4 }; + static int firstmap[] = { 0,1,0,5,6 }; + int *mymap = (y != 0) ? mapping : firstmap; + int i; + int type = mymap[filter_type]; + unsigned char *z = pixels + stride_bytes * (stbi__flip_vertically_on_write ? height-1-y : y); + int signed_stride = stbi__flip_vertically_on_write ? -stride_bytes : stride_bytes; + + if (type==0) { + memcpy(line_buffer, z, width*n); + return; + } + + // first loop isn't optimized since it's just one pixel + for (i = 0; i < n; ++i) { + switch (type) { + case 1: line_buffer[i] = z[i]; break; + case 2: line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: line_buffer[i] = z[i] - (z[i-signed_stride]>>1); break; + case 4: line_buffer[i] = (signed char) (z[i] - stbiw__paeth(0,z[i-signed_stride],0)); break; + case 5: line_buffer[i] = z[i]; break; + case 6: line_buffer[i] = z[i]; break; + } + } + switch (type) { + case 1: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-n]; break; + case 2: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - z[i-signed_stride]; break; + case 3: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - ((z[i-n] + z[i-signed_stride])>>1); break; + case 4: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], z[i-signed_stride], z[i-signed_stride-n]); break; + case 5: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - (z[i-n]>>1); break; + case 6: for (i=n; i < width*n; ++i) line_buffer[i] = z[i] - stbiw__paeth(z[i-n], 0,0); break; + } +} + +STBIWDEF unsigned char *stbi_write_png_to_mem(const unsigned char *pixels, int stride_bytes, int x, int y, int n, int *out_len) +{ + int force_filter = stbi_write_force_png_filter; + int ctype[5] = { -1, 0, 4, 2, 6 }; + unsigned char sig[8] = { 137,80,78,71,13,10,26,10 }; + unsigned char *out,*o, *filt, *zlib; + signed char *line_buffer; + int j,zlen; + + if (stride_bytes == 0) + stride_bytes = x * n; + + if (force_filter >= 5) { + force_filter = -1; + } + + filt = (unsigned char *) STBIW_MALLOC((x*n+1) * y); if (!filt) return 0; + line_buffer = (signed char *) STBIW_MALLOC(x * n); if (!line_buffer) { STBIW_FREE(filt); return 0; } + for (j=0; j < y; ++j) { + int filter_type; + if (force_filter > -1) { + filter_type = force_filter; + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, force_filter, line_buffer); + } else { // Estimate the best filter by running through all of them: + int best_filter = 0, best_filter_val = 0x7fffffff, est, i; + for (filter_type = 0; filter_type < 5; filter_type++) { + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, filter_type, line_buffer); + + // Estimate the entropy of the line using this filter; the less, the better. + est = 0; + for (i = 0; i < x*n; ++i) { + est += abs((signed char) line_buffer[i]); + } + if (est < best_filter_val) { + best_filter_val = est; + best_filter = filter_type; + } + } + if (filter_type != best_filter) { // If the last iteration already got us the best filter, don't redo it + stbiw__encode_png_line((unsigned char*)(pixels), stride_bytes, x, y, j, n, best_filter, line_buffer); + filter_type = best_filter; + } + } + // when we get here, filter_type contains the filter type, and line_buffer contains the data + filt[j*(x*n+1)] = (unsigned char) filter_type; + STBIW_MEMMOVE(filt+j*(x*n+1)+1, line_buffer, x*n); + } + STBIW_FREE(line_buffer); + zlib = stbi_zlib_compress(filt, y*( x*n+1), &zlen, stbi_write_png_compression_level); + STBIW_FREE(filt); + if (!zlib) return 0; + + // each tag requires 12 bytes of overhead + out = (unsigned char *) STBIW_MALLOC(8 + 12+13 + 12+zlen + 12); + if (!out) return 0; + *out_len = 8 + 12+13 + 12+zlen + 12; + + o=out; + STBIW_MEMMOVE(o,sig,8); o+= 8; + stbiw__wp32(o, 13); // header length + stbiw__wptag(o, "IHDR"); + stbiw__wp32(o, x); + stbiw__wp32(o, y); + *o++ = 8; + *o++ = STBIW_UCHAR(ctype[n]); + *o++ = 0; + *o++ = 0; + *o++ = 0; + stbiw__wpcrc(&o,13); + + stbiw__wp32(o, zlen); + stbiw__wptag(o, "IDAT"); + STBIW_MEMMOVE(o, zlib, zlen); + o += zlen; + STBIW_FREE(zlib); + stbiw__wpcrc(&o, zlen); + + stbiw__wp32(o,0); + stbiw__wptag(o, "IEND"); + stbiw__wpcrc(&o,0); + + STBIW_ASSERT(o == out + *out_len); + + return out; +} + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_png(char const *filename, int x, int y, int comp, const void *data, int stride_bytes) +{ + FILE *f; + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + + f = stbiw__fopen(filename, "wb"); + if (!f) { STBIW_FREE(png); return 0; } + fwrite(png, 1, len, f); + fclose(f); + STBIW_FREE(png); + return 1; +} +#endif + +STBIWDEF int stbi_write_png_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int stride_bytes) +{ + int len; + unsigned char *png = stbi_write_png_to_mem((const unsigned char *) data, stride_bytes, x, y, comp, &len); + if (png == NULL) return 0; + func(context, png, len); + STBIW_FREE(png); + return 1; +} + + +/* *************************************************************************** + * + * JPEG writer + * + * This is based on Jon Olick's jo_jpeg.cpp: + * public domain Simple, Minimalistic JPEG writer - http://www.jonolick.com/code.html + */ + +static const unsigned char stbiw__jpg_ZigZag[] = { 0,1,5,6,14,15,27,28,2,4,7,13,16,26,29,42,3,8,12,17,25,30,41,43,9,11,18, + 24,31,40,44,53,10,19,23,32,39,45,52,54,20,22,33,38,46,51,55,60,21,34,37,47,50,56,59,61,35,36,48,49,57,58,62,63 }; + +static void stbiw__jpg_writeBits(stbi__write_context *s, int *bitBufP, int *bitCntP, const unsigned short *bs) { + int bitBuf = *bitBufP, bitCnt = *bitCntP; + bitCnt += bs[1]; + bitBuf |= bs[0] << (24 - bitCnt); + while(bitCnt >= 8) { + unsigned char c = (bitBuf >> 16) & 255; + stbiw__putc(s, c); + if(c == 255) { + stbiw__putc(s, 0); + } + bitBuf <<= 8; + bitCnt -= 8; + } + *bitBufP = bitBuf; + *bitCntP = bitCnt; +} + +static void stbiw__jpg_DCT(float *d0p, float *d1p, float *d2p, float *d3p, float *d4p, float *d5p, float *d6p, float *d7p) { + float d0 = *d0p, d1 = *d1p, d2 = *d2p, d3 = *d3p, d4 = *d4p, d5 = *d5p, d6 = *d6p, d7 = *d7p; + float z1, z2, z3, z4, z5, z11, z13; + + float tmp0 = d0 + d7; + float tmp7 = d0 - d7; + float tmp1 = d1 + d6; + float tmp6 = d1 - d6; + float tmp2 = d2 + d5; + float tmp5 = d2 - d5; + float tmp3 = d3 + d4; + float tmp4 = d3 - d4; + + // Even part + float tmp10 = tmp0 + tmp3; // phase 2 + float tmp13 = tmp0 - tmp3; + float tmp11 = tmp1 + tmp2; + float tmp12 = tmp1 - tmp2; + + d0 = tmp10 + tmp11; // phase 3 + d4 = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * 0.707106781f; // c4 + d2 = tmp13 + z1; // phase 5 + d6 = tmp13 - z1; + + // Odd part + tmp10 = tmp4 + tmp5; // phase 2 + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + // The rotator is modified from fig 4-8 to avoid extra negations. + z5 = (tmp10 - tmp12) * 0.382683433f; // c6 + z2 = tmp10 * 0.541196100f + z5; // c2-c6 + z4 = tmp12 * 1.306562965f + z5; // c2+c6 + z3 = tmp11 * 0.707106781f; // c4 + + z11 = tmp7 + z3; // phase 5 + z13 = tmp7 - z3; + + *d5p = z13 + z2; // phase 6 + *d3p = z13 - z2; + *d1p = z11 + z4; + *d7p = z11 - z4; + + *d0p = d0; *d2p = d2; *d4p = d4; *d6p = d6; +} + +static void stbiw__jpg_calcBits(int val, unsigned short bits[2]) { + int tmp1 = val < 0 ? -val : val; + val = val < 0 ? val-1 : val; + bits[1] = 1; + while(tmp1 >>= 1) { + ++bits[1]; + } + bits[0] = val & ((1<0)&&(DU[end0pos]==0); --end0pos) { + } + // end0pos = first element in reverse order !=0 + if(end0pos == 0) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + return DU[0]; + } + for(i = 1; i <= end0pos; ++i) { + int startpos = i; + int nrzeroes; + unsigned short bits[2]; + for (; DU[i]==0 && i<=end0pos; ++i) { + } + nrzeroes = i-startpos; + if ( nrzeroes >= 16 ) { + int lng = nrzeroes>>4; + int nrmarker; + for (nrmarker=1; nrmarker <= lng; ++nrmarker) + stbiw__jpg_writeBits(s, bitBuf, bitCnt, M16zeroes); + nrzeroes &= 15; + } + stbiw__jpg_calcBits(DU[i], bits); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, HTAC[(nrzeroes<<4)+bits[1]]); + stbiw__jpg_writeBits(s, bitBuf, bitCnt, bits); + } + if(end0pos != 63) { + stbiw__jpg_writeBits(s, bitBuf, bitCnt, EOB); + } + return DU[0]; +} + +static int stbi_write_jpg_core(stbi__write_context *s, int width, int height, int comp, const void* data, int quality) { + // Constants that don't pollute global namespace + static const unsigned char std_dc_luminance_nrcodes[] = {0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0}; + static const unsigned char std_dc_luminance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_luminance_nrcodes[] = {0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d}; + static const unsigned char std_ac_luminance_values[] = { + 0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08, + 0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28, + 0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59, + 0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89, + 0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6, + 0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2, + 0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + static const unsigned char std_dc_chrominance_nrcodes[] = {0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0}; + static const unsigned char std_dc_chrominance_values[] = {0,1,2,3,4,5,6,7,8,9,10,11}; + static const unsigned char std_ac_chrominance_nrcodes[] = {0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77}; + static const unsigned char std_ac_chrominance_values[] = { + 0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91, + 0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26, + 0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58, + 0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4, + 0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda, + 0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa + }; + // Huffman tables + static const unsigned short YDC_HT[256][2] = { {0,2},{2,3},{3,3},{4,3},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9}}; + static const unsigned short UVDC_HT[256][2] = { {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9},{1022,10},{2046,11}}; + static const unsigned short YAC_HT[256][2] = { + {10,4},{0,2},{1,2},{4,3},{11,4},{26,5},{120,7},{248,8},{1014,10},{65410,16},{65411,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {12,4},{27,5},{121,7},{502,9},{2038,11},{65412,16},{65413,16},{65414,16},{65415,16},{65416,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {28,5},{249,8},{1015,10},{4084,12},{65417,16},{65418,16},{65419,16},{65420,16},{65421,16},{65422,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{503,9},{4085,12},{65423,16},{65424,16},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1016,10},{65430,16},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2039,11},{65438,16},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {123,7},{4086,12},{65446,16},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {250,8},{4087,12},{65454,16},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{32704,15},{65462,16},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65470,16},{65471,16},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65479,16},{65480,16},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1017,10},{65488,16},{65489,16},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{65497,16},{65498,16},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2040,11},{65506,16},{65507,16},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {65515,16},{65516,16},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65525,16},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const unsigned short UVAC_HT[256][2] = { + {0,2},{1,2},{4,3},{10,4},{24,5},{25,5},{56,6},{120,7},{500,9},{1014,10},{4084,12},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {11,4},{57,6},{246,8},{501,9},{2038,11},{4085,12},{65416,16},{65417,16},{65418,16},{65419,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {26,5},{247,8},{1015,10},{4086,12},{32706,15},{65420,16},{65421,16},{65422,16},{65423,16},{65424,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {27,5},{248,8},{1016,10},{4087,12},{65425,16},{65426,16},{65427,16},{65428,16},{65429,16},{65430,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {58,6},{502,9},{65431,16},{65432,16},{65433,16},{65434,16},{65435,16},{65436,16},{65437,16},{65438,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {59,6},{1017,10},{65439,16},{65440,16},{65441,16},{65442,16},{65443,16},{65444,16},{65445,16},{65446,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {121,7},{2039,11},{65447,16},{65448,16},{65449,16},{65450,16},{65451,16},{65452,16},{65453,16},{65454,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {122,7},{2040,11},{65455,16},{65456,16},{65457,16},{65458,16},{65459,16},{65460,16},{65461,16},{65462,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {249,8},{65463,16},{65464,16},{65465,16},{65466,16},{65467,16},{65468,16},{65469,16},{65470,16},{65471,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {503,9},{65472,16},{65473,16},{65474,16},{65475,16},{65476,16},{65477,16},{65478,16},{65479,16},{65480,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {504,9},{65481,16},{65482,16},{65483,16},{65484,16},{65485,16},{65486,16},{65487,16},{65488,16},{65489,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {505,9},{65490,16},{65491,16},{65492,16},{65493,16},{65494,16},{65495,16},{65496,16},{65497,16},{65498,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {506,9},{65499,16},{65500,16},{65501,16},{65502,16},{65503,16},{65504,16},{65505,16},{65506,16},{65507,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {2041,11},{65508,16},{65509,16},{65510,16},{65511,16},{65512,16},{65513,16},{65514,16},{65515,16},{65516,16},{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}, + {16352,14},{65517,16},{65518,16},{65519,16},{65520,16},{65521,16},{65522,16},{65523,16},{65524,16},{65525,16},{0,0},{0,0},{0,0},{0,0},{0,0}, + {1018,10},{32707,15},{65526,16},{65527,16},{65528,16},{65529,16},{65530,16},{65531,16},{65532,16},{65533,16},{65534,16},{0,0},{0,0},{0,0},{0,0},{0,0} + }; + static const int YQT[] = {16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22, + 37,56,68,109,103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; + static const int UVQT[] = {17,18,24,47,99,99,99,99,18,21,26,66,99,99,99,99,24,26,56,99,99,99,99,99,47,66,99,99,99,99,99,99, + 99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99}; + static const float aasf[] = { 1.0f * 2.828427125f, 1.387039845f * 2.828427125f, 1.306562965f * 2.828427125f, 1.175875602f * 2.828427125f, + 1.0f * 2.828427125f, 0.785694958f * 2.828427125f, 0.541196100f * 2.828427125f, 0.275899379f * 2.828427125f }; + + int row, col, i, k, subsample; + float fdtbl_Y[64], fdtbl_UV[64]; + unsigned char YTable[64], UVTable[64]; + + if(!data || !width || !height || comp > 4 || comp < 1) { + return 0; + } + + quality = quality ? quality : 90; + subsample = quality <= 90 ? 1 : 0; + quality = quality < 1 ? 1 : quality > 100 ? 100 : quality; + quality = quality < 50 ? 5000 / quality : 200 - quality * 2; + + for(i = 0; i < 64; ++i) { + int uvti, yti = (YQT[i]*quality+50)/100; + YTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (yti < 1 ? 1 : yti > 255 ? 255 : yti); + uvti = (UVQT[i]*quality+50)/100; + UVTable[stbiw__jpg_ZigZag[i]] = (unsigned char) (uvti < 1 ? 1 : uvti > 255 ? 255 : uvti); + } + + for(row = 0, k = 0; row < 8; ++row) { + for(col = 0; col < 8; ++col, ++k) { + fdtbl_Y[k] = 1 / (YTable [stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + fdtbl_UV[k] = 1 / (UVTable[stbiw__jpg_ZigZag[k]] * aasf[row] * aasf[col]); + } + } + + // Write Headers + { + static const unsigned char head0[] = { 0xFF,0xD8,0xFF,0xE0,0,0x10,'J','F','I','F',0,1,1,0,0,1,0,1,0,0,0xFF,0xDB,0,0x84,0 }; + static const unsigned char head2[] = { 0xFF,0xDA,0,0xC,3,1,0,2,0x11,3,0x11,0,0x3F,0 }; + const unsigned char head1[] = { 0xFF,0xC0,0,0x11,8,(unsigned char)(height>>8),STBIW_UCHAR(height),(unsigned char)(width>>8),STBIW_UCHAR(width), + 3,1,(unsigned char)(subsample?0x22:0x11),0,2,0x11,1,3,0x11,1,0xFF,0xC4,0x01,0xA2,0 }; + s->func(s->context, (void*)head0, sizeof(head0)); + s->func(s->context, (void*)YTable, sizeof(YTable)); + stbiw__putc(s, 1); + s->func(s->context, UVTable, sizeof(UVTable)); + s->func(s->context, (void*)head1, sizeof(head1)); + s->func(s->context, (void*)(std_dc_luminance_nrcodes+1), sizeof(std_dc_luminance_nrcodes)-1); + s->func(s->context, (void*)std_dc_luminance_values, sizeof(std_dc_luminance_values)); + stbiw__putc(s, 0x10); // HTYACinfo + s->func(s->context, (void*)(std_ac_luminance_nrcodes+1), sizeof(std_ac_luminance_nrcodes)-1); + s->func(s->context, (void*)std_ac_luminance_values, sizeof(std_ac_luminance_values)); + stbiw__putc(s, 1); // HTUDCinfo + s->func(s->context, (void*)(std_dc_chrominance_nrcodes+1), sizeof(std_dc_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_dc_chrominance_values, sizeof(std_dc_chrominance_values)); + stbiw__putc(s, 0x11); // HTUACinfo + s->func(s->context, (void*)(std_ac_chrominance_nrcodes+1), sizeof(std_ac_chrominance_nrcodes)-1); + s->func(s->context, (void*)std_ac_chrominance_values, sizeof(std_ac_chrominance_values)); + s->func(s->context, (void*)head2, sizeof(head2)); + } + + // Encode 8x8 macroblocks + { + static const unsigned short fillBits[] = {0x7F, 7}; + int DCY=0, DCU=0, DCV=0; + int bitBuf=0, bitCnt=0; + // comp == 2 is grey+alpha (alpha is ignored) + int ofsG = comp > 2 ? 1 : 0, ofsB = comp > 2 ? 2 : 0; + const unsigned char *dataR = (const unsigned char *)data; + const unsigned char *dataG = dataR + ofsG; + const unsigned char *dataB = dataR + ofsB; + int x, y, pos; + if(subsample) { + for(y = 0; y < height; y += 16) { + for(x = 0; x < width; x += 16) { + float Y[256], U[256], V[256]; + for(row = y, pos = 0; row < y+16; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+16; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+0, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+8, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+128, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y+136, 16, fdtbl_Y, DCY, YDC_HT, YAC_HT); + + // subsample U,V + { + float subU[64], subV[64]; + int yy, xx; + for(yy = 0, pos = 0; yy < 8; ++yy) { + for(xx = 0; xx < 8; ++xx, ++pos) { + int j = yy*32+xx*2; + subU[pos] = (U[j+0] + U[j+1] + U[j+16] + U[j+17]) * 0.25f; + subV[pos] = (V[j+0] + V[j+1] + V[j+16] + V[j+17]) * 0.25f; + } + } + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subU, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, subV, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + } else { + for(y = 0; y < height; y += 8) { + for(x = 0; x < width; x += 8) { + float Y[64], U[64], V[64]; + for(row = y, pos = 0; row < y+8; ++row) { + // row >= height => use last input row + int clamped_row = (row < height) ? row : height - 1; + int base_p = (stbi__flip_vertically_on_write ? (height-1-clamped_row) : clamped_row)*width*comp; + for(col = x; col < x+8; ++col, ++pos) { + // if col >= width => use pixel from last input column + int p = base_p + ((col < width) ? col : (width-1))*comp; + float r = dataR[p], g = dataG[p], b = dataB[p]; + Y[pos]= +0.29900f*r + 0.58700f*g + 0.11400f*b - 128; + U[pos]= -0.16874f*r - 0.33126f*g + 0.50000f*b; + V[pos]= +0.50000f*r - 0.41869f*g - 0.08131f*b; + } + } + + DCY = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, Y, 8, fdtbl_Y, DCY, YDC_HT, YAC_HT); + DCU = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, U, 8, fdtbl_UV, DCU, UVDC_HT, UVAC_HT); + DCV = stbiw__jpg_processDU(s, &bitBuf, &bitCnt, V, 8, fdtbl_UV, DCV, UVDC_HT, UVAC_HT); + } + } + } + + // Do the bit alignment of the EOI marker + stbiw__jpg_writeBits(s, &bitBuf, &bitCnt, fillBits); + } + + // EOI + stbiw__putc(s, 0xFF); + stbiw__putc(s, 0xD9); + + return 1; +} + +STBIWDEF int stbi_write_jpg_to_func(stbi_write_func *func, void *context, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + stbi__start_write_callbacks(&s, func, context); + return stbi_write_jpg_core(&s, x, y, comp, (void *) data, quality); +} + + +#ifndef STBI_WRITE_NO_STDIO +STBIWDEF int stbi_write_jpg(char const *filename, int x, int y, int comp, const void *data, int quality) +{ + stbi__write_context s = { 0 }; + if (stbi__start_write_file(&s,filename)) { + int r = stbi_write_jpg_core(&s, x, y, comp, data, quality); + stbi__end_write_file(&s); + return r; + } else + return 0; +} +#endif + +#endif // STB_IMAGE_WRITE_IMPLEMENTATION + +/* Revision history + 1.16 (2021-07-11) + make Deflate code emit uncompressed blocks when it would otherwise expand + support writing BMPs with alpha channel + 1.15 (2020-07-13) unknown + 1.14 (2020-02-02) updated JPEG writer to downsample chroma channels + 1.13 + 1.12 + 1.11 (2019-08-11) + + 1.10 (2019-02-07) + support utf8 filenames in Windows; fix warnings and platform ifdefs + 1.09 (2018-02-11) + fix typo in zlib quality API, improve STB_I_W_STATIC in C++ + 1.08 (2018-01-29) + add stbi__flip_vertically_on_write, external zlib, zlib quality, choose PNG filter + 1.07 (2017-07-24) + doc fix + 1.06 (2017-07-23) + writing JPEG (using Jon Olick's code) + 1.05 ??? + 1.04 (2017-03-03) + monochrome BMP expansion + 1.03 ??? + 1.02 (2016-04-02) + avoid allocating large structures on the stack + 1.01 (2016-01-16) + STBIW_REALLOC_SIZED: support allocators with no realloc support + avoid race-condition in crc initialization + minor compile issues + 1.00 (2015-09-14) + installable file IO function + 0.99 (2015-09-13) + warning fixes; TGA rle support + 0.98 (2015-04-08) + added STBIW_MALLOC, STBIW_ASSERT etc + 0.97 (2015-01-18) + fixed HDR asserts, rewrote HDR rle logic + 0.96 (2015-01-17) + add HDR output + fix monochrome BMP + 0.95 (2014-08-17) + add monochrome TGA output + 0.94 (2014-05-31) + rename private functions to avoid conflicts with stb_image.h + 0.93 (2014-05-27) + warning fixes + 0.92 (2010-08-01) + casts to unsigned char to fix warnings + 0.91 (2010-07-17) + first public release + 0.90 first internal release +*/ + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/tests/gal-regression/native/trace_helpers.h b/tests/gal-regression/native/trace_helpers.h new file mode 100644 index 0000000..fb21a50 --- /dev/null +++ b/tests/gal-regression/native/trace_helpers.h @@ -0,0 +1,66 @@ +// Stub trace_helpers.h for native GAL test +// Provides simplified TRACE_MANAGER that doesn't use wxWidgets macros + +#ifndef TRACE_HELPERS_H_STUB +#define TRACE_HELPERS_H_STUB + +#include +#include +#include + +// Forward declaration +class wxArrayString; + +// Trace channel names (extern declarations) +extern const wxString traceGalProfile; +extern const wxString traceOpenGL; +extern const wxString traceGalCachedContainer; +extern const wxString traceShader; + +// Definitions +inline const wxString traceGalProfile = "KICAD_GAL_PROFILE"; +inline const wxString traceOpenGL = "KICAD_OPENGL"; +inline const wxString traceGalCachedContainer = "KICAD_GAL_CACHED_CONTAINER"; +inline const wxString traceShader = "KICAD_SHADER"; + +// TRACE_MANAGER - simplified stub +class TRACE_MANAGER { +public: + TRACE_MANAGER() : m_globalTraceEnabled(false), m_printAllTraces(false) {} + ~TRACE_MANAGER() {} + + static TRACE_MANAGER& Instance() { + static TRACE_MANAGER instance; + return instance; + } + + // Trace methods - variadic template version + template + void Trace(const wxString&, Args...) { + // No-op - tracing disabled for test + } + + // wxWidgets-style methods for compatibility + void DoTrace(const wxString&, const char*, ...) {} + void DoTraceUtf8(const wxString&, const char*, ...) {} + + bool IsTraceEnabled(const wxString&) const { + return false; // Always disabled for test + } + +private: + std::map m_enabledTraces; + bool m_globalTraceEnabled; + bool m_printAllTraces; +}; + +// KI_TRACE macro - no-op since IsTraceEnabled always returns false +#define KI_TRACE(aWhat, ...) \ + if (TRACE_MANAGER::Instance().IsTraceEnabled(aWhat)) { \ + TRACE_MANAGER::Instance().Trace(aWhat, __VA_ARGS__); \ + } + +// Dump function stub +inline wxString dump(const wxArrayString&) { return wxString(); } + +#endif // TRACE_HELPERS_H_STUB diff --git a/tests/gal-regression/scenarios/gal_test_scenarios.cpp b/tests/gal-regression/scenarios/gal_test_scenarios.cpp new file mode 100644 index 0000000..b673b5e --- /dev/null +++ b/tests/gal-regression/scenarios/gal_test_scenarios.cpp @@ -0,0 +1,567 @@ +/** + * GAL Test Scenarios Implementation + * + * Uses KiCad's GAL API to render test patterns. + * These serve as baselines for WEBGL_GAL visual regression testing. + */ + +#include "gal_test_scenarios.h" +#include "kicad_stubs.h" // For COLOR4D, VECTOR2D, EDA_ANGLE + +// Include GAL header for the actual class definition +#include + +#include +#include +#include + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +namespace GALTest { + +// Import KIGFX types +using KIGFX::COLOR4D; +using KIGFX::GAL; + +// Scenario names +static const char* SCENARIO_NAMES[] = { + "basic-lines", + "line-widths", + "circles", + "arcs", + "rectangles", + "polygons", + "alpha-blending", + "transforms", + "grid-cursor", + "segments", + "complex-scene" +}; + +static const int SCENARIO_COUNT = sizeof(SCENARIO_NAMES) / sizeof(SCENARIO_NAMES[0]); + +int GetScenarioCount() { + return SCENARIO_COUNT; +} + +const char* GetScenarioName(int index) { + if (index >= 0 && index < SCENARIO_COUNT) { + return SCENARIO_NAMES[index]; + } + return "unknown"; +} + +//============================================================================= +// Scenario Implementations using GAL API +//============================================================================= + +// Scenario 0: Basic lines +static void RenderBasicLines(KIGFX::GAL* gal, int width, int height) { + double cx = width / 2.0; + double cy = height / 2.0; + double len = std::min(width, height) * 0.35; + + gal->SetLineWidth(1.0); + gal->SetIsFill(false); + gal->SetIsStroke(true); + + // Horizontal line (red) + gal->SetStrokeColor(COLOR4D(1.0, 0.2, 0.2, 1.0)); + gal->DrawLine(VECTOR2D(cx - len, cy), VECTOR2D(cx + len, cy)); + + // Vertical line (green) + gal->SetStrokeColor(COLOR4D(0.2, 1.0, 0.2, 1.0)); + gal->DrawLine(VECTOR2D(cx, cy - len), VECTOR2D(cx, cy + len)); + + // Diagonal lines (blue, yellow) + gal->SetStrokeColor(COLOR4D(0.2, 0.2, 1.0, 1.0)); + gal->DrawLine(VECTOR2D(cx - len, cy - len), VECTOR2D(cx + len, cy + len)); + + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 0.2, 1.0)); + gal->DrawLine(VECTOR2D(cx - len, cy + len), VECTOR2D(cx + len, cy - len)); + + // Radial lines (white) + gal->SetStrokeColor(COLOR4D(0.8, 0.8, 0.8, 1.0)); + for (int i = 0; i < 8; i++) { + double angle = M_PI * i / 8; + double x = cos(angle) * len * 0.8; + double y = sin(angle) * len * 0.8; + gal->DrawLine(VECTOR2D(cx + x * 0.3, cy + y * 0.3), VECTOR2D(cx + x, cy + y)); + } +} + +// Scenario 1: Line widths +static void RenderLineWidths(KIGFX::GAL* gal, int width, int height) { + double widths[] = {0.5, 1.0, 2.0, 3.0, 5.0, 8.0, 12.0}; + int count = sizeof(widths) / sizeof(widths[0]); + + double margin = 50.0; + double spacing = (height - 2 * margin) / (count + 1); + + gal->SetIsFill(false); + gal->SetIsStroke(true); + + for (int i = 0; i < count; i++) { + double y = margin + (i + 1) * spacing; + + // Color gradient + double t = (double)i / (count - 1); + gal->SetStrokeColor(COLOR4D(1.0 - t * 0.5, 0.3 + t * 0.4, 0.2 + t * 0.6, 1.0)); + gal->SetLineWidth(widths[i]); + gal->DrawLine(VECTOR2D(margin, y), VECTOR2D(width - margin, y)); + } +} + +// Scenario 2: Circles +static void RenderCircles(KIGFX::GAL* gal, int width, int height) { + double cx = width / 2.0; + double cy = height / 2.0; + + // Filled circles + gal->SetIsFill(true); + gal->SetIsStroke(false); + + gal->SetFillColor(COLOR4D(0.8, 0.2, 0.2, 0.8)); + gal->DrawCircle(VECTOR2D(cx - 150, cy - 100), 60); + + gal->SetFillColor(COLOR4D(0.2, 0.8, 0.2, 0.8)); + gal->DrawCircle(VECTOR2D(cx, cy - 100), 80); + + gal->SetFillColor(COLOR4D(0.2, 0.2, 0.8, 0.8)); + gal->DrawCircle(VECTOR2D(cx + 150, cy - 100), 50); + + // Stroked circles + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetLineWidth(2.0); + + gal->SetStrokeColor(COLOR4D(1.0, 0.5, 0.0, 1.0)); + gal->DrawCircle(VECTOR2D(cx - 150, cy + 100), 70); + + gal->SetStrokeColor(COLOR4D(0.0, 1.0, 1.0, 1.0)); + gal->DrawCircle(VECTOR2D(cx, cy + 100), 90); + + gal->SetStrokeColor(COLOR4D(1.0, 0.0, 1.0, 1.0)); + gal->DrawCircle(VECTOR2D(cx + 150, cy + 100), 55); + + // Concentric circles + gal->SetStrokeColor(COLOR4D(0.6, 0.6, 0.6, 1.0)); + gal->SetLineWidth(1.0); + for (double r = 20; r <= 200; r += 30) { + gal->DrawCircle(VECTOR2D(cx, cy), r); + } +} + +// Scenario 3: Arcs +static void RenderArcs(KIGFX::GAL* gal, int width, int height) { + double cx = width / 2.0; + double cy = height / 2.0; + double radius = std::min(width, height) * 0.25; + + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetLineWidth(3.0); + + // 90 degree arcs in each quadrant + gal->SetStrokeColor(COLOR4D(1.0, 0.3, 0.3, 1.0)); + gal->DrawArc(VECTOR2D(cx, cy), radius, + EDA_ANGLE(0, DEGREES_T), EDA_ANGLE(90, DEGREES_T)); + + gal->SetStrokeColor(COLOR4D(0.3, 1.0, 0.3, 1.0)); + gal->DrawArc(VECTOR2D(cx, cy), radius, + EDA_ANGLE(90, DEGREES_T), EDA_ANGLE(90, DEGREES_T)); + + gal->SetStrokeColor(COLOR4D(0.3, 0.3, 1.0, 1.0)); + gal->DrawArc(VECTOR2D(cx, cy), radius, + EDA_ANGLE(180, DEGREES_T), EDA_ANGLE(90, DEGREES_T)); + + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 0.3, 1.0)); + gal->DrawArc(VECTOR2D(cx, cy), radius, + EDA_ANGLE(270, DEGREES_T), EDA_ANGLE(90, DEGREES_T)); + + // Inner arcs + gal->SetLineWidth(2.0); + gal->SetStrokeColor(COLOR4D(0.8, 0.5, 0.8, 1.0)); + gal->DrawArc(VECTOR2D(cx, cy), radius * 0.6, + EDA_ANGLE(30, DEGREES_T), EDA_ANGLE(120, DEGREES_T)); + + gal->SetStrokeColor(COLOR4D(0.5, 0.8, 0.8, 1.0)); + gal->DrawArc(VECTOR2D(cx, cy), radius * 0.6, + EDA_ANGLE(210, DEGREES_T), EDA_ANGLE(120, DEGREES_T)); +} + +// Scenario 4: Rectangles +static void RenderRectangles(KIGFX::GAL* gal, int width, int height) { + double margin = 50.0; + + // Filled rectangles + gal->SetIsFill(true); + gal->SetIsStroke(false); + + gal->SetFillColor(COLOR4D(0.8, 0.2, 0.2, 0.9)); + gal->DrawRectangle(VECTOR2D(margin, margin), VECTOR2D(margin + 120, margin + 80)); + + gal->SetFillColor(COLOR4D(0.2, 0.8, 0.2, 0.9)); + gal->DrawRectangle(VECTOR2D(margin + 140, margin), VECTOR2D(margin + 240, margin + 100)); + + gal->SetFillColor(COLOR4D(0.2, 0.2, 0.8, 0.9)); + gal->DrawRectangle(VECTOR2D(margin + 260, margin), VECTOR2D(margin + 340, margin + 120)); + + // Stroked rectangles + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetLineWidth(2.0); + + gal->SetStrokeColor(COLOR4D(1.0, 0.5, 0.0, 1.0)); + gal->DrawRectangle(VECTOR2D(margin, height - margin - 100), + VECTOR2D(margin + 150, height - margin - 20)); + + gal->SetStrokeColor(COLOR4D(0.0, 1.0, 1.0, 1.0)); + gal->DrawRectangle(VECTOR2D(margin + 170, height - margin - 110), + VECTOR2D(margin + 280, height - margin - 20)); + + gal->SetStrokeColor(COLOR4D(1.0, 0.0, 1.0, 1.0)); + gal->DrawRectangle(VECTOR2D(margin + 300, height - margin - 90), + VECTOR2D(margin + 390, height - margin - 20)); + + // Nested rectangles + gal->SetLineWidth(1.0); + double cx = width / 2.0; + double cy = height / 2.0; + for (int i = 0; i < 6; i++) { + double t = (double)i / 5; + gal->SetStrokeColor(COLOR4D(t, 0.5, 1.0 - t, 1.0)); + double size = 30 + i * 25; + gal->DrawRectangle(VECTOR2D(cx - size, cy - size * 0.6), + VECTOR2D(cx + size, cy + size * 0.6)); + } +} + +// Scenario 5: Polygons +static void RenderPolygons(KIGFX::GAL* gal, int width, int height) { + double cx = width / 2.0; + double cy = height / 2.0; + + // Triangle (filled) + gal->SetIsFill(true); + gal->SetIsStroke(false); + gal->SetFillColor(COLOR4D(1.0, 0.3, 0.3, 0.8)); + + std::deque triangle = { + VECTOR2D(cx - 200, cy - 50), + VECTOR2D(cx - 130, cy - 50), + VECTOR2D(cx - 165, cy - 120) + }; + gal->DrawPolygon(triangle); + + // Square (filled) + gal->SetFillColor(COLOR4D(0.3, 1.0, 0.3, 0.8)); + std::deque square = { + VECTOR2D(cx - 50, cy - 50), + VECTOR2D(cx + 30, cy - 50), + VECTOR2D(cx + 30, cy - 130), + VECTOR2D(cx - 50, cy - 130) + }; + gal->DrawPolygon(square); + + // Pentagon (filled) + gal->SetFillColor(COLOR4D(0.3, 0.3, 1.0, 0.8)); + std::deque pentagon; + for (int i = 0; i < 5; i++) { + double angle = -M_PI / 2 + 2 * M_PI * i / 5; + pentagon.push_back(VECTOR2D(cx + 165 + cos(angle) * 50, cy - 90 + sin(angle) * 50)); + } + gal->DrawPolygon(pentagon); + + // Star (stroked) + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetLineWidth(2.0); + gal->SetStrokeColor(COLOR4D(1.0, 0.8, 0.0, 1.0)); + + std::deque star; + for (int i = 0; i < 10; i++) { + double angle = -M_PI / 2 + M_PI * i / 5; + double r = (i % 2 == 0) ? 60 : 30; + star.push_back(VECTOR2D(cx + cos(angle) * r, cy + 80 + sin(angle) * r)); + } + // Draw as polyline (closed) + std::vector starVec(star.begin(), star.end()); + starVec.push_back(star.front()); // Close the shape + gal->DrawPolyline(starVec); + + // Hexagon (stroked) + gal->SetStrokeColor(COLOR4D(0.8, 0.3, 0.8, 1.0)); + std::deque hexagon; + for (int i = 0; i < 6; i++) { + double angle = M_PI * i / 3; + hexagon.push_back(VECTOR2D(cx - 150 + cos(angle) * 45, cy + 80 + sin(angle) * 45)); + } + std::vector hexVec(hexagon.begin(), hexagon.end()); + hexVec.push_back(hexagon.front()); // Close the shape + gal->DrawPolyline(hexVec); +} + +// Scenario 6: Alpha blending +static void RenderAlphaBlending(KIGFX::GAL* gal, int width, int height) { + double cx = width / 2.0; + double cy = height / 2.0; + + gal->SetIsFill(true); + gal->SetIsStroke(false); + + // Overlapping rectangles with different alphas + gal->SetFillColor(COLOR4D(1.0, 0.0, 0.0, 0.5)); + gal->DrawRectangle(VECTOR2D(cx - 150, cy - 80), VECTOR2D(cx + 30, cy + 40)); + + gal->SetFillColor(COLOR4D(0.0, 1.0, 0.0, 0.5)); + gal->DrawRectangle(VECTOR2D(cx - 60, cy - 80), VECTOR2D(cx + 120, cy + 40)); + + gal->SetFillColor(COLOR4D(0.0, 0.0, 1.0, 0.5)); + gal->DrawRectangle(VECTOR2D(cx - 105, cy - 20), VECTOR2D(cx + 75, cy + 100)); + + // Overlapping circles + gal->SetFillColor(COLOR4D(1.0, 1.0, 0.0, 0.4)); + gal->DrawCircle(VECTOR2D(cx - 180, cy + 100), 60); + + gal->SetFillColor(COLOR4D(0.0, 1.0, 1.0, 0.4)); + gal->DrawCircle(VECTOR2D(cx - 130, cy + 100), 60); + + gal->SetFillColor(COLOR4D(1.0, 0.0, 1.0, 0.4)); + gal->DrawCircle(VECTOR2D(cx - 155, cy + 60), 60); + + // Alpha gradient + for (int i = 0; i < 8; i++) { + double alpha = 0.1 + i * 0.1; + gal->SetFillColor(COLOR4D(0.5, 0.5, 0.5, alpha)); + gal->DrawRectangle(VECTOR2D(cx + 50 + i * 30, cy - 50), + VECTOR2D(cx + 75 + i * 30, cy + 50)); + } +} + +// Scenario 7: Transforms +static void RenderTransforms(KIGFX::GAL* gal, int width, int height) { + double cx = width / 2.0; + double cy = height / 2.0; + + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetLineWidth(2.0); + + // Original (reference) + gal->SetStrokeColor(COLOR4D(0.5, 0.5, 0.5, 1.0)); + gal->DrawRectangle(VECTOR2D(cx - 230, cy - 120), VECTOR2D(cx - 170, cy - 80)); + + // Translated + gal->Save(); + gal->Translate(VECTOR2D(100, 20)); + gal->SetStrokeColor(COLOR4D(1.0, 0.3, 0.3, 1.0)); + gal->DrawRectangle(VECTOR2D(cx - 230, cy - 120), VECTOR2D(cx - 170, cy - 80)); + gal->Restore(); + + // Rotated + gal->Save(); + gal->Translate(VECTOR2D(cx, cy - 80)); + gal->Rotate(30.0 * M_PI / 180.0); + gal->SetStrokeColor(COLOR4D(0.3, 1.0, 0.3, 1.0)); + gal->DrawRectangle(VECTOR2D(-30, -20), VECTOR2D(30, 20)); + gal->Restore(); + + // Scaled + gal->Save(); + gal->Translate(VECTOR2D(cx + 120, cy - 80)); + gal->Scale(VECTOR2D(1.5, 0.8)); + gal->SetStrokeColor(COLOR4D(0.3, 0.3, 1.0, 1.0)); + gal->DrawRectangle(VECTOR2D(-30, -20), VECTOR2D(30, 20)); + gal->Restore(); + + // Combined transforms + gal->Save(); + gal->Translate(VECTOR2D(cx, cy + 80)); + gal->Rotate(45.0 * M_PI / 180.0); + gal->Scale(VECTOR2D(1.2, 1.2)); + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 0.3, 1.0)); + gal->DrawRectangle(VECTOR2D(-40, -25), VECTOR2D(40, 25)); + gal->Restore(); + + // Nested transforms + gal->Save(); + gal->Translate(VECTOR2D(cx - 150, cy + 100)); + gal->SetStrokeColor(COLOR4D(0.8, 0.4, 0.8, 1.0)); + gal->DrawCircle(VECTOR2D(0, 0), 30); + + gal->Save(); + gal->Rotate(60.0 * M_PI / 180.0); + gal->Translate(VECTOR2D(50, 0)); + gal->SetStrokeColor(COLOR4D(0.4, 0.8, 0.8, 1.0)); + gal->DrawCircle(VECTOR2D(0, 0), 20); + gal->Restore(); + + gal->Restore(); +} + +// Scenario 8: Grid and cursor +static void RenderGridCursor(KIGFX::GAL* gal, int width, int height) { + gal->SetIsFill(false); + gal->SetIsStroke(true); + + // Grid + gal->SetStrokeColor(COLOR4D(0.3, 0.3, 0.4, 0.5)); + gal->SetLineWidth(1.0); + + double gridSize = 40.0; + for (double x = gridSize; x < width; x += gridSize) { + gal->DrawLine(VECTOR2D(x, 0), VECTOR2D(x, height)); + } + for (double y = gridSize; y < height; y += gridSize) { + gal->DrawLine(VECTOR2D(0, y), VECTOR2D(width, y)); + } + + // Major grid + gal->SetStrokeColor(COLOR4D(0.4, 0.4, 0.5, 0.7)); + double majorGridSize = 200.0; + gal->SetLineWidth(2.0); + for (double x = majorGridSize; x < width; x += majorGridSize) { + gal->DrawLine(VECTOR2D(x, 0), VECTOR2D(x, height)); + } + for (double y = majorGridSize; y < height; y += majorGridSize) { + gal->DrawLine(VECTOR2D(0, y), VECTOR2D(width, y)); + } + + // Cursor (crosshair) + double cx = width / 2.0; + double cy = height / 2.0; + double cursorSize = 30.0; + + gal->SetLineWidth(2.0); + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 1.0, 1.0)); + gal->DrawLine(VECTOR2D(cx - cursorSize, cy), VECTOR2D(cx + cursorSize, cy)); + gal->DrawLine(VECTOR2D(cx, cy - cursorSize), VECTOR2D(cx, cy + cursorSize)); + + // Cursor circle + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 0.0, 0.8)); + gal->DrawCircle(VECTOR2D(cx, cy), cursorSize * 0.8); +} + +// Scenario 9: Segments (thick lines with round caps) +static void RenderSegments(KIGFX::GAL* gal, int width, int height) { + double margin = 80.0; + + // Horizontal segments with different widths + double widths[] = {5.0, 10.0, 20.0, 30.0}; + int count = sizeof(widths) / sizeof(widths[0]); + + gal->SetIsFill(true); + gal->SetIsStroke(false); + + for (int i = 0; i < count; i++) { + double y = margin + i * 80; + double w = widths[i]; + + gal->SetFillColor(COLOR4D(0.3 + i * 0.2, 0.5, 0.8 - i * 0.15, 1.0)); + + // DrawSegment draws a rounded segment + gal->DrawSegment(VECTOR2D(margin, y), VECTOR2D(width - margin, y), w); + } + + // Diagonal segment + gal->SetFillColor(COLOR4D(1.0, 0.5, 0.2, 1.0)); + gal->DrawSegment(VECTOR2D(margin, height - margin), + VECTOR2D(width / 2.0, height - margin - 150), 15.0); +} + +// Scenario 10: Complex scene (PCB-like) +static void RenderComplexScene(KIGFX::GAL* gal, int width, int height) { + // Use layer depths to ensure proper z-ordering + // Lower depth = closer to camera (drawn on top with GL_LESS) + + // Background "board" - deepest layer + gal->SetLayerDepth(100); + gal->SetIsFill(true); + gal->SetIsStroke(false); + gal->SetFillColor(COLOR4D(0.1, 0.3, 0.1, 1.0)); + gal->DrawRectangle(VECTOR2D(50, 50), VECTOR2D(width - 50, height - 50)); + + // Traces (copper) - middle layer + gal->SetLayerDepth(50); + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetStrokeColor(COLOR4D(0.8, 0.6, 0.2, 1.0)); + gal->SetLineWidth(3.0); + + // Horizontal traces + for (int i = 0; i < 5; i++) { + double y = 100 + i * 100; + gal->DrawLine(VECTOR2D(80, y), VECTOR2D(width - 80, y)); + } + + // Vertical traces + for (int i = 0; i < 6; i++) { + double x = 100 + i * 120; + gal->DrawLine(VECTOR2D(x, 80), VECTOR2D(x, height - 80)); + } + + // Pads (circles) - above traces + gal->SetLayerDepth(30); + gal->SetIsFill(true); + gal->SetIsStroke(false); + gal->SetFillColor(COLOR4D(0.9, 0.7, 0.3, 1.0)); + for (int i = 0; i < 5; i++) { + for (int j = 0; j < 6; j++) { + double x = 100 + j * 120; + double y = 100 + i * 100; + gal->DrawCircle(VECTOR2D(x, y), 15); + } + } + + // Holes - above pads + gal->SetLayerDepth(20); + gal->SetFillColor(COLOR4D(0.1, 0.1, 0.1, 1.0)); + for (int i = 0; i < 5; i++) { + for (int j = 0; j < 6; j++) { + double x = 100 + j * 120; + double y = 100 + i * 100; + gal->DrawCircle(VECTOR2D(x, y), 5); + } + } + + // Component outline - top layer + gal->SetLayerDepth(10); + gal->SetIsFill(false); + gal->SetIsStroke(true); + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 0.0, 1.0)); + gal->SetLineWidth(1.0); + gal->DrawRectangle(VECTOR2D(width / 2 - 80, height / 2 - 40), + VECTOR2D(width / 2 + 80, height / 2 + 40)); + + // Reference designator placeholder - topmost + gal->SetLayerDepth(5); + gal->SetStrokeColor(COLOR4D(1.0, 1.0, 1.0, 1.0)); + gal->DrawRectangle(VECTOR2D(width / 2 - 20, height / 2 - 15), + VECTOR2D(width / 2 + 20, height / 2 + 15)); +} + +//============================================================================= +// Main dispatch function +//============================================================================= + +void RenderScenario(KIGFX::GAL* gal, int index, int width, int height) { + switch (index) { + case 0: RenderBasicLines(gal, width, height); break; + case 1: RenderLineWidths(gal, width, height); break; + case 2: RenderCircles(gal, width, height); break; + case 3: RenderArcs(gal, width, height); break; + case 4: RenderRectangles(gal, width, height); break; + case 5: RenderPolygons(gal, width, height); break; + case 6: RenderAlphaBlending(gal, width, height); break; + case 7: RenderTransforms(gal, width, height); break; + case 8: RenderGridCursor(gal, width, height); break; + case 9: RenderSegments(gal, width, height); break; + case 10: RenderComplexScene(gal, width, height); break; + default: break; + } +} + +} // namespace GALTest diff --git a/tests/gal-regression/scenarios/gal_test_scenarios.h b/tests/gal-regression/scenarios/gal_test_scenarios.h new file mode 100644 index 0000000..2a7ee97 --- /dev/null +++ b/tests/gal-regression/scenarios/gal_test_scenarios.h @@ -0,0 +1,40 @@ +/** + * GAL Test Scenarios + * + * Defines test scenarios for visual regression testing of GAL rendering. + * These scenarios use KiCad's GAL API to test the rendering pipeline. + */ + +#ifndef GAL_TEST_SCENARIOS_H +#define GAL_TEST_SCENARIOS_H + +// Forward declaration +namespace KIGFX { + class GAL; +} + +namespace GALTest { + +/** + * Get the number of test scenarios + */ +int GetScenarioCount(); + +/** + * Get the name of a scenario + */ +const char* GetScenarioName(int index); + +/** + * Render a scenario using KiCad's GAL API + * + * @param gal Pointer to the GAL instance (OPENGL_GAL or WEBGL_GAL) + * @param index Scenario index + * @param width Canvas width in logical pixels + * @param height Canvas height in logical pixels + */ +void RenderScenario(KIGFX::GAL* gal, int index, int width, int height); + +} // namespace GALTest + +#endif // GAL_TEST_SCENARIOS_H