// Path: src/main/java/org/firepick/firebom/exception/ProxyResolutionException.java
// public class ProxyResolutionException extends RuntimeException {
//     public ProxyResolutionException(Exception e) {
//         super(e);
//     }
// 
//     public ProxyResolutionException(String message) {
//         super(message);
//     }
// 
//     public ProxyResolutionException(String message, Exception e) {
//         super(message, e);
//     }
// }


import org.firepick.firebom.exception.ProxyResolutionException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
        String[] ulParts = content.split("</ul>");
        List<String> newSourceList = null;
        PartUsage newSourcePartUsage = null;
        List<PartUsage> newRequiredParts = null;
        for (String ulPart : ulParts) {
            if (ulPart.contains("@Source")) {
                newSourceList = parseListItemStrings(ulPart);
                if (newSourceList.size() == 0) {
                    throw new ProxyResolutionException("Html page has no @Sources tag");
                }
                String primarySource = newSourceList.get(0);
                URL sourceUrl = parseLink(primarySource);
                Part sourcePart = PartFactory.getInstance().createPart(sourceUrl);
                Double quantity = parseQuantity(primarySource, null);
                if (quantity != null) {
                    // Package Unit Override
                    // ======================
                    // If source package units are specified, they apply to the source, which may not have the ability to
                    // specify the package units. Using the source package unit override automatically forces a
                    // package unit of 1 for THIS part. This convention permits the simplest specification of required parts
                    // (i.e., per single source unit).
                    newSourcePartUsage = new PartUsage(sourcePart, quantity);
                    this.setPackageUnits(1d);
                } else {
                    newSourcePartUsage = new PartUsage(sourcePart, 1);
                }
            } else if (ulPart.contains("@Require")) {
                List<String> requiredItems = parseListItemStrings(ulPart);
                newRequiredParts = new ArrayList<PartUsage>();
                for (String required : requiredItems) {
// Path: src/main/java/org/firepick/firebom/exception/ProxyResolutionException.java
// public class ProxyResolutionException extends RuntimeException {
//     public ProxyResolutionException(Exception e) {
//         super(e);
//     }
// 
//     public ProxyResolutionException(String message) {
//         super(message);
//     }
// 
//     public ProxyResolutionException(String message, Exception e) {
//         super(message, e);
//     }
// }


// Path: src/main/java/org/firepick/firebom/part/HtmlPart.java
import org.firepick.firebom.exception.ProxyResolutionException;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

        String[] ulParts = content.split("</ul>");
        List<String> newSourceList = null;
        PartUsage newSourcePartUsage = null;
        List<PartUsage> newRequiredParts = null;
        for (String ulPart : ulParts) {
            if (ulPart.contains("@Source")) {
                newSourceList = parseListItemStrings(ulPart);
                if (newSourceList.size() == 0) {
                    throw new ProxyResolutionException("Html page has no @Sources tag");
                }
                String primarySource = newSourceList.get(0);
                URL sourceUrl = parseLink(primarySource);
                Part sourcePart = PartFactory.getInstance().createPart(sourceUrl);
                Double quantity = parseQuantity(primarySource, null);
                if (quantity != null) {
                    // Package Unit Override
                    // ======================
                    // If source package units are specified, they apply to the source, which may not have the ability to
                    // specify the package units. Using the source package unit override automatically forces a
                    // package unit of 1 for THIS part. This convention permits the simplest specification of required parts
                    // (i.e., per single source unit).
                    newSourcePartUsage = new PartUsage(sourcePart, quantity);
                    this.setPackageUnits(1d);
                } else {
                    newSourcePartUsage = new PartUsage(sourcePart, 1);
                }
            } else if (ulPart.contains("@Require")) {
                List<String> requiredItems = parseListItemStrings(ulPart);
                newRequiredParts = new ArrayList<PartUsage>();
                for (String required : requiredItems) {
                    try {