////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You under the Apache License, Version 2.0
//  (the "License"); you may not use this file except in compliance with
//  the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package {
import flash.display.Sprite;
public class flex_skins extends Sprite
{
	public function flex_skins(){}

private var assets:Array = [
Application_backgroundImage,
ProgressBar_trackSkin,
Menu_branchDisabledIcon,
Menu_branchIcon,
Menu_checkDisabledIcon,
Menu_checkIcon,
Menu_radioDisabledIcon,
Menu_radioIcon,
Menu_separatorSkin,
DateChooser_todayIndicatorSkin,
DividedBox_dividerSkin,
DividedBox_horizontalCursor,
DividedBox_verticalCursor,
DragManager_linkCursor,
DragManager_moveCursor,
DragManager_rejectCursor,
DragManager_copyCursor,
FormItem_indicatorSkin,
ProgressBar_trackSkin,
ProgressBar_barSkin,
ProgressBar_indeterminateSkin,
PopUpButton_skin,
DateChooser_rollOverIndicatorSkin,
DateChooser_selectionIndicatorSkin,
SWFLoader_brokenImageSkin,
MenuBar_backgroundSkin,
ToolTip_borderSkin,
DragManager_defaultDragImageSkin,
Panel_controlBarBackgroundSkin,
Button_skin,
AccordionHeader_skin,
RadioButton_icon,
CheckBox_icon,
TabBar$tab_skin,
NumericStepper_upArrowSkin,
NumericStepper_downArrowSkin,
VScrollBar_trackSkin,
VScrollBar_upArrowSkin,
VScrollBar_downArrowSkin,
VScrollBar_thumbSkin,
VScrollBar_thumbIcon,
HScrollBar_trackSkin,
HScrollBar_downArrowSkin,
HScrollBar_upArrowSkin,
ComboBox_skin,
ButtonBar$firstButton_skin,
ButtonBar$button_skin,
ButtonBar$lastButton_skin,
DateChooser_prevMonthSkin,
DateChooser_nextMonthSkin,
DateChooser_nextYearSkin,
DateChooser_prevYearSkin,
MenuBar_itemSkin,
ColorPicker_skin,
Slider_trackSkin,
Slider_trackHighlightSkin,
Slider_thumbSkin,
DataGrid_headerBackgroundSkin,
Tree_disclosureClosedIcon,
Tree_disclosureOpenIcon,
Tree_folderClosedIcon,
Tree_folderOpenIcon,
Tree_defaultLeafIcon,
DataGrid_sortArrowSkin,
DataGrid_stretchCursor,
HScrollBar_thumbSkin,
HScrollBar_thumbIcon,
DateField_upSkin,
DateField_overSkin,
DateField_downSkin,
DateFiled_disabledSkin,
Panel_closeButtonUpSkin,
Panel_closeButtonOverSkin,
Panel_closeButtonDownSkin,
Panel_closeButtonDisabledSkin,
VSlider_thumbSkin,
ComboBox_editableUpSkin,
ComboBox_editableOverSkin,
ComboBox_editableDownSkin,
ComboBox_editableDisabledSkin,
Title_backgroundSkin,
CursorManager_busyCursor,
TabBar$firstTab_skin,
Title_secondary_backgroundSkin
];
}
}
