CINXE.COM
Open Textbook Library
<!DOCTYPE html> <html class='h-100' lang='en' prefix='og: http://ogp.me/ns#'> <head> <script nonce="adb4e241dc09530648f9c0d7713a4866"> //<![CDATA[ (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;var n=d.querySelector('[nonce]');n&&j.setAttribute('nonce',n.nonce||n.getAttribute('nonce'));f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-KVLSPNJ'); //]]> </script> <script type="text/javascript" nonce="adb4e241dc09530648f9c0d7713a4866">window.NREUM||(NREUM={});NREUM.info={"beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net","licenseKey":"870b502a95","applicationID":"175895155","transactionName":"JlcNEUJcXg9UShZHSQxWAkpAUlUGQhdKXFYS","queueTime":0,"applicationTime":27,"agent":""}</script> <script type="text/javascript" nonce="adb4e241dc09530648f9c0d7713a4866">(window.NREUM||(NREUM={})).init={ajax:{deny_list:["bam.nr-data.net"]}};(window.NREUM||(NREUM={})).loader_config={licenseKey:"870b502a95",applicationID:"175895155"};;/*! For license information please see nr-loader-rum-1.274.0.min.js.LICENSE.txt */ (()=>{var e,t,r={8122:(e,t,r)=>{"use strict";r.d(t,{a:()=>i});var n=r(944);function i(e,t){try{if(!e||"object"!=typeof e)return(0,n.R)(3);if(!t||"object"!=typeof t)return(0,n.R)(4);const r=Object.create(Object.getPrototypeOf(t),Object.getOwnPropertyDescriptors(t)),o=0===Object.keys(r).length?e:r;for(let a in o)if(void 0!==e[a])try{if(null===e[a]){r[a]=null;continue}Array.isArray(e[a])&&Array.isArray(t[a])?r[a]=Array.from(new Set([...e[a],...t[a]])):"object"==typeof e[a]&&"object"==typeof t[a]?r[a]=i(e[a],t[a]):r[a]=e[a]}catch(e){(0,n.R)(1,e)}return r}catch(e){(0,n.R)(2,e)}}},2555:(e,t,r)=>{"use strict";r.d(t,{Vp:()=>c,fn:()=>s,x1:()=>u});var n=r(384),i=r(8122);const o={beacon:n.NT.beacon,errorBeacon:n.NT.errorBeacon,licenseKey:void 0,applicationID:void 0,sa:void 0,queueTime:void 0,applicationTime:void 0,ttGuid:void 0,user:void 0,account:void 0,product:void 0,extra:void 0,jsAttributes:{},userAttributes:void 0,atts:void 0,transactionName:void 0,tNamePlain:void 0},a={};function s(e){try{const t=c(e);return!!t.licenseKey&&!!t.errorBeacon&&!!t.applicationID}catch(e){return!1}}function c(e){if(!e)throw new Error("All info objects require an agent identifier!");if(!a[e])throw new Error("Info for ".concat(e," was never set"));return a[e]}function u(e,t){if(!e)throw new Error("All info objects require an agent identifier!");a[e]=(0,i.a)(t,o);const r=(0,n.nY)(e);r&&(r.info=a[e])}},9417:(e,t,r)=>{"use strict";r.d(t,{D0:()=>g,gD:()=>h,xN:()=>p});var n=r(993);const i=e=>{if(!e||"string"!=typeof e)return!1;try{document.createDocumentFragment().querySelector(e)}catch{return!1}return!0};var o=r(2614),a=r(944),s=r(384),c=r(8122);const u="[data-nr-mask]",d=()=>{const e={mask_selector:"*",block_selector:"[data-nr-block]",mask_input_options:{color:!1,date:!1,"datetime-local":!1,email:!1,month:!1,number:!1,range:!1,search:!1,tel:!1,text:!1,time:!1,url:!1,week:!1,textarea:!1,select:!1,password:!0}};return{ajax:{deny_list:void 0,block_internal:!0,enabled:!0,harvestTimeSeconds:10,autoStart:!0},distributed_tracing:{enabled:void 0,exclude_newrelic_header:void 0,cors_use_newrelic_header:void 0,cors_use_tracecontext_headers:void 0,allowed_origins:void 0},feature_flags:[],generic_events:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},harvest:{tooManyRequestsDelay:60},jserrors:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},logging:{enabled:!0,harvestTimeSeconds:10,autoStart:!0,level:n.p_.INFO},metrics:{enabled:!0,autoStart:!0},obfuscate:void 0,page_action:{enabled:!0},page_view_event:{enabled:!0,autoStart:!0},page_view_timing:{enabled:!0,harvestTimeSeconds:30,autoStart:!0},performance:{capture_marks:!1,capture_measures:!1},privacy:{cookies_enabled:!0},proxy:{assets:void 0,beacon:void 0},session:{expiresMs:o.wk,inactiveMs:o.BB},session_replay:{autoStart:!0,enabled:!1,harvestTimeSeconds:60,preload:!1,sampling_rate:10,error_sampling_rate:100,collect_fonts:!1,inline_images:!1,fix_stylesheets:!0,mask_all_inputs:!0,get mask_text_selector(){return e.mask_selector},set mask_text_selector(t){i(t)?e.mask_selector="".concat(t,",").concat(u):""===t||null===t?e.mask_selector=u:(0,a.R)(5,t)},get block_class(){return"nr-block"},get ignore_class(){return"nr-ignore"},get mask_text_class(){return"nr-mask"},get block_selector(){return e.block_selector},set block_selector(t){i(t)?e.block_selector+=",".concat(t):""!==t&&(0,a.R)(6,t)},get mask_input_options(){return e.mask_input_options},set mask_input_options(t){t&&"object"==typeof t?e.mask_input_options={...t,password:!0}:(0,a.R)(7,t)}},session_trace:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},soft_navigations:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},spa:{enabled:!0,harvestTimeSeconds:10,autoStart:!0},ssl:void 0,user_actions:{enabled:!0}}},l={},f="All configuration objects require an agent identifier!";function g(e){if(!e)throw new Error(f);if(!l[e])throw new Error("Configuration for ".concat(e," was never set"));return l[e]}function p(e,t){if(!e)throw new Error(f);l[e]=(0,c.a)(t,d());const r=(0,s.nY)(e);r&&(r.init=l[e])}function h(e,t){if(!e)throw new Error(f);var r=g(e);if(r){for(var n=t.split("."),i=0;i<n.length-1;i++)if("object"!=typeof(r=r[n[i]]))return;r=r[n[n.length-1]]}return r}},3371:(e,t,r)=>{"use strict";r.d(t,{V:()=>f,f:()=>l});var n=r(8122),i=r(384),o=r(6154),a=r(9324);let s=0;const c={buildEnv:a.F3,distMethod:a.Xs,version:a.xv,originTime:o.WN},u={customTransaction:void 0,disabled:!1,isolatedBacklog:!1,loaderType:void 0,maxBytes:3e4,onerror:void 0,ptid:void 0,releaseIds:{},appMetadata:{},session:void 0,denyList:void 0,timeKeeper:void 0,obfuscator:void 0},d={};function l(e){if(!e)throw new Error("All runtime objects require an agent identifier!");if(!d[e])throw new Error("Runtime for ".concat(e," was never set"));return d[e]}function f(e,t){if(!e)throw new Error("All runtime objects require an agent identifier!");d[e]={...(0,n.a)(t,u),...c},Object.hasOwnProperty.call(d[e],"harvestCount")||Object.defineProperty(d[e],"harvestCount",{get:()=>++s});const r=(0,i.nY)(e);r&&(r.runtime=d[e])}},9324:(e,t,r)=>{"use strict";r.d(t,{F3:()=>i,Xs:()=>o,xv:()=>n});const n="1.274.0",i="PROD",o="CDN"},6154:(e,t,r)=>{"use strict";r.d(t,{OF:()=>c,RI:()=>i,WN:()=>d,bv:()=>o,gm:()=>a,mw:()=>s,sb:()=>u});var n=r(1863);const i="undefined"!=typeof window&&!!window.document,o="undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self.navigator instanceof WorkerNavigator||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis.navigator instanceof WorkerNavigator),a=i?window:"undefined"!=typeof WorkerGlobalScope&&("undefined"!=typeof self&&self instanceof WorkerGlobalScope&&self||"undefined"!=typeof globalThis&&globalThis instanceof WorkerGlobalScope&&globalThis),s=Boolean("hidden"===a?.document?.visibilityState),c=/iPad|iPhone|iPod/.test(a.navigator?.userAgent),u=c&&"undefined"==typeof SharedWorker,d=((()=>{const e=a.navigator?.userAgent?.match(/Firefox[/\s](\d+\.\d+)/);Array.isArray(e)&&e.length>=2&&e[1]})(),Date.now()-(0,n.t)())},1687:(e,t,r)=>{"use strict";r.d(t,{Ak:()=>c,Ze:()=>l,x3:()=>u});var n=r(7836),i=r(3606),o=r(860),a=r(2646);const s={};function c(e,t){const r={staged:!1,priority:o.P3[t]||0};d(e),s[e].get(t)||s[e].set(t,r)}function u(e,t){e&&s[e]&&(s[e].get(t)&&s[e].delete(t),g(e,t,!1),s[e].size&&f(e))}function d(e){if(!e)throw new Error("agentIdentifier required");s[e]||(s[e]=new Map)}function l(e="",t="feature",r=!1){if(d(e),!e||!s[e].get(t)||r)return g(e,t);s[e].get(t).staged=!0,f(e)}function f(e){const t=Array.from(s[e]);t.every((([e,t])=>t.staged))&&(t.sort(((e,t)=>e[1].priority-t[1].priority)),t.forEach((([t])=>{s[e].delete(t),g(e,t)})))}function g(e,t,r=!0){const o=e?n.ee.get(e):n.ee,s=i.i.handlers;if(!o.aborted&&o.backlog&&s){if(r){const e=o.backlog[t],r=s[t];if(r){for(let t=0;e&&t<e.length;++t)p(e[t],r);Object.entries(r).forEach((([e,t])=>{Object.values(t||{}).forEach((t=>{t[0]?.on&&t[0]?.context()instanceof a.y&&t[0].on(e,t[1])}))}))}}o.isolatedBacklog||delete s[t],o.backlog[t]=null,o.emit("drain-"+t,[])}}function p(e,t){var r=e[1];Object.values(t[r]||{}).forEach((t=>{var r=e[0];if(t[0]===r){var n=t[1],i=e[3],o=e[2];n.apply(i,o)}}))}},7836:(e,t,r)=>{"use strict";r.d(t,{P:()=>c,ee:()=>u});var n=r(384),i=r(8990),o=r(3371),a=r(2646),s=r(5607);const c="nr@context:".concat(s.W),u=function e(t,r){var n={},s={},d={},l=!1;try{l=16===r.length&&(0,o.f)(r).isolatedBacklog}catch(e){}var f={on:p,addEventListener:p,removeEventListener:function(e,t){var r=n[e];if(!r)return;for(var i=0;i<r.length;i++)r[i]===t&&r.splice(i,1)},emit:function(e,r,n,i,o){!1!==o&&(o=!0);if(u.aborted&&!i)return;t&&o&&t.emit(e,r,n);for(var a=g(n),c=h(e),d=c.length,l=0;l<d;l++)c[l].apply(a,r);var p=m()[s[e]];p&&p.push([f,e,r,a]);return a},get:v,listeners:h,context:g,buffer:function(e,t){const r=m();if(t=t||"feature",f.aborted)return;Object.entries(e||{}).forEach((([e,n])=>{s[n]=t,t in r||(r[t]=[])}))},abort:function(){f._aborted=!0,Object.keys(f.backlog).forEach((e=>{delete f.backlog[e]}))},isBuffering:function(e){return!!m()[s[e]]},debugId:r,backlog:l?{}:t&&"object"==typeof t.backlog?t.backlog:{},isolatedBacklog:l};return Object.defineProperty(f,"aborted",{get:()=>{let e=f._aborted||!1;return e||(t&&(e=t.aborted),e)}}),f;function g(e){return e&&e instanceof a.y?e:e?(0,i.I)(e,c,(()=>new a.y(c))):new a.y(c)}function p(e,t){n[e]=h(e).concat(t)}function h(e){return n[e]||[]}function v(t){return d[t]=d[t]||e(f,t)}function m(){return f.backlog}}(void 0,"globalEE"),d=(0,n.Zm)();d.ee||(d.ee=u)},2646:(e,t,r)=>{"use strict";r.d(t,{y:()=>n});class n{constructor(e){this.contextId=e}}},9908:(e,t,r)=>{"use strict";r.d(t,{d:()=>n,p:()=>i});var n=r(7836).ee.get("handle");function i(e,t,r,i,o){o?(o.buffer([e],i),o.emit(e,t,r)):(n.buffer([e],i),n.emit(e,t,r))}},3606:(e,t,r)=>{"use strict";r.d(t,{i:()=>o});var n=r(9908);o.on=a;var i=o.handlers={};function o(e,t,r,o){a(o||n.d,i,e,t,r)}function a(e,t,r,i,o){o||(o="feature"),e||(e=n.d);var a=t[o]=t[o]||{};(a[r]=a[r]||[]).push([e,i])}},3878:(e,t,r)=>{"use strict";function n(e,t){return{capture:e,passive:!1,signal:t}}function i(e,t,r=!1,i){window.addEventListener(e,t,n(r,i))}function o(e,t,r=!1,i){document.addEventListener(e,t,n(r,i))}r.d(t,{DD:()=>o,jT:()=>n,sp:()=>i})},5607:(e,t,r)=>{"use strict";r.d(t,{W:()=>n});const n=(0,r(9566).bz)()},9566:(e,t,r)=>{"use strict";r.d(t,{LA:()=>s,bz:()=>a});var n=r(6154);const i="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx";function o(e,t){return e?15&e[t]:16*Math.random()|0}function a(){const e=n.gm?.crypto||n.gm?.msCrypto;let t,r=0;return e&&e.getRandomValues&&(t=e.getRandomValues(new Uint8Array(30))),i.split("").map((e=>"x"===e?o(t,r++).toString(16):"y"===e?(3&o()|8).toString(16):e)).join("")}function s(e){const t=n.gm?.crypto||n.gm?.msCrypto;let r,i=0;t&&t.getRandomValues&&(r=t.getRandomValues(new Uint8Array(e)));const a=[];for(var s=0;s<e;s++)a.push(o(r,i++).toString(16));return a.join("")}},2614:(e,t,r)=>{"use strict";r.d(t,{BB:()=>a,H3:()=>n,g:()=>u,iL:()=>c,tS:()=>s,uh:()=>i,wk:()=>o});const n="NRBA",i="SESSION",o=144e5,a=18e5,s={STARTED:"session-started",PAUSE:"session-pause",RESET:"session-reset",RESUME:"session-resume",UPDATE:"session-update"},c={SAME_TAB:"same-tab",CROSS_TAB:"cross-tab"},u={OFF:0,FULL:1,ERROR:2}},1863:(e,t,r)=>{"use strict";function n(){return Math.floor(performance.now())}r.d(t,{t:()=>n})},944:(e,t,r)=>{"use strict";function n(e,t){"function"==typeof console.debug&&console.debug("New Relic Warning: https://github.com/newrelic/newrelic-browser-agent/blob/main/docs/warning-codes.md#".concat(e),t)}r.d(t,{R:()=>n})},5284:(e,t,r)=>{"use strict";r.d(t,{t:()=>c,B:()=>s});var n=r(7836),i=r(6154);const o="newrelic";const a=new Set,s={};function c(e,t){const r=n.ee.get(t);s[t]??={},e&&"object"==typeof e&&(a.has(t)||(r.emit("rumresp",[e]),s[t]=e,a.add(t),function(e={}){try{i.gm.dispatchEvent(new CustomEvent(o,{detail:e}))}catch(e){}}({loaded:!0})))}},8990:(e,t,r)=>{"use strict";r.d(t,{I:()=>i});var n=Object.prototype.hasOwnProperty;function i(e,t,r){if(n.call(e,t))return e[t];var i=r();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(e,t,{value:i,writable:!0,enumerable:!1}),i}catch(e){}return e[t]=i,i}},6389:(e,t,r)=>{"use strict";function n(e,t=500,r={}){const n=r?.leading||!1;let i;return(...r)=>{n&&void 0===i&&(e.apply(this,r),i=setTimeout((()=>{i=clearTimeout(i)}),t)),n||(clearTimeout(i),i=setTimeout((()=>{e.apply(this,r)}),t))}}function i(e){let t=!1;return(...r)=>{t||(t=!0,e.apply(this,r))}}r.d(t,{J:()=>i,s:()=>n})},5289:(e,t,r)=>{"use strict";r.d(t,{GG:()=>o,sB:()=>a});var n=r(3878);function i(){return"undefined"==typeof document||"complete"===document.readyState}function o(e,t){if(i())return e();(0,n.sp)("load",e,t)}function a(e){if(i())return e();(0,n.DD)("DOMContentLoaded",e)}},384:(e,t,r)=>{"use strict";r.d(t,{NT:()=>o,US:()=>d,Zm:()=>a,bQ:()=>c,dV:()=>s,nY:()=>u,pV:()=>l});var n=r(6154),i=r(1863);const o={beacon:"bam.nr-data.net",errorBeacon:"bam.nr-data.net"};function a(){return n.gm.NREUM||(n.gm.NREUM={}),void 0===n.gm.newrelic&&(n.gm.newrelic=n.gm.NREUM),n.gm.NREUM}function s(){let e=a();return e.o||(e.o={ST:n.gm.setTimeout,SI:n.gm.setImmediate,CT:n.gm.clearTimeout,XHR:n.gm.XMLHttpRequest,REQ:n.gm.Request,EV:n.gm.Event,PR:n.gm.Promise,MO:n.gm.MutationObserver,FETCH:n.gm.fetch,WS:n.gm.WebSocket}),e}function c(e,t){let r=a();r.initializedAgents??={},t.initializedAt={ms:(0,i.t)(),date:new Date},r.initializedAgents[e]=t}function u(e){let t=a();return t.initializedAgents?.[e]}function d(e,t){a()[e]=t}function l(){return function(){let e=a();const t=e.info||{};e.info={beacon:o.beacon,errorBeacon:o.errorBeacon,...t}}(),function(){let e=a();const t=e.init||{};e.init={...t}}(),s(),function(){let e=a();const t=e.loader_config||{};e.loader_config={...t}}(),a()}},2843:(e,t,r)=>{"use strict";r.d(t,{u:()=>i});var n=r(3878);function i(e,t=!1,r,i){(0,n.DD)("visibilitychange",(function(){if(t)return void("hidden"===document.visibilityState&&e());e(document.visibilityState)}),r,i)}},3434:(e,t,r)=>{"use strict";r.d(t,{YM:()=>c});var n=r(7836),i=r(5607);const o="nr@original:".concat(i.W);var a=Object.prototype.hasOwnProperty,s=!1;function c(e,t){return e||(e=n.ee),r.inPlace=function(e,t,n,i,o){n||(n="");const a="-"===n.charAt(0);for(let s=0;s<t.length;s++){const c=t[s],u=e[c];d(u)||(e[c]=r(u,a?c+n:n,i,c,o))}},r.flag=o,r;function r(t,r,n,s,c){return d(t)?t:(r||(r=""),nrWrapper[o]=t,function(e,t,r){if(Object.defineProperty&&Object.keys)try{return Object.keys(e).forEach((function(r){Object.defineProperty(t,r,{get:function(){return e[r]},set:function(t){return e[r]=t,t}})})),t}catch(e){u([e],r)}for(var n in e)a.call(e,n)&&(t[n]=e[n])}(t,nrWrapper,e),nrWrapper);function nrWrapper(){var o,a,d,l;try{a=this,o=[...arguments],d="function"==typeof n?n(o,a):n||{}}catch(t){u([t,"",[o,a,s],d],e)}i(r+"start",[o,a,s],d,c);try{return l=t.apply(a,o)}catch(e){throw i(r+"err",[o,a,e],d,c),e}finally{i(r+"end",[o,a,l],d,c)}}}function i(r,n,i,o){if(!s||t){var a=s;s=!0;try{e.emit(r,n,i,t,o)}catch(t){u([t,r,n,i],e)}s=a}}}function u(e,t){t||(t=n.ee);try{t.emit("internal-error",e)}catch(e){}}function d(e){return!(e&&"function"==typeof e&&e.apply&&!e[o])}},993:(e,t,r)=>{"use strict";r.d(t,{ET:()=>o,p_:()=>i});var n=r(860);const i={ERROR:"ERROR",WARN:"WARN",INFO:"INFO",DEBUG:"DEBUG",TRACE:"TRACE"},o="log";n.K7.logging},3969:(e,t,r)=>{"use strict";r.d(t,{TZ:()=>n,XG:()=>s,rs:()=>i,xV:()=>a,z_:()=>o});const n=r(860).K7.metrics,i="sm",o="cm",a="storeSupportabilityMetrics",s="storeEventMetrics"},6630:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewEvent},782:(e,t,r)=>{"use strict";r.d(t,{T:()=>n});const n=r(860).K7.pageViewTiming},6344:(e,t,r)=>{"use strict";r.d(t,{G4:()=>i});var n=r(2614);r(860).K7.sessionReplay;const i={RECORD:"recordReplay",PAUSE:"pauseReplay",REPLAY_RUNNING:"replayRunning",ERROR_DURING_REPLAY:"errorDuringReplay"};n.g.ERROR,n.g.FULL,n.g.OFF},4234:(e,t,r)=>{"use strict";r.d(t,{W:()=>o});var n=r(7836),i=r(1687);class o{constructor(e,t){this.agentIdentifier=e,this.ee=n.ee.get(e),this.featureName=t,this.blocked=!1}deregisterDrain(){(0,i.x3)(this.agentIdentifier,this.featureName)}}},7603:(e,t,r)=>{"use strict";r.d(t,{j:()=>P});var n=r(860),i=r(2555),o=r(3371),a=r(9908),s=r(7836),c=r(1687),u=r(5289),d=r(6154),l=r(944),f=r(3969),g=r(384),p=r(6344);const h=["setErrorHandler","finished","addToTrace","addRelease","addPageAction","setCurrentRouteName","setPageViewName","setCustomAttribute","interaction","noticeError","setUserId","setApplicationVersion","start",p.G4.RECORD,p.G4.PAUSE,"log","wrapLogger"],v=["setErrorHandler","finished","addToTrace","addRelease"];var m=r(1863),b=r(2614),y=r(993);var w=r(2646),A=r(3434);function R(e,t,r,n){if("object"!=typeof t||!t||"string"!=typeof r||!r||"function"!=typeof t[r])return(0,l.R)(29);const i=function(e){return(e||s.ee).get("logger")}(e),o=(0,A.YM)(i),a=new w.y(s.P);return a.level=n.level,a.customAttributes=n.customAttributes,o.inPlace(t,[r],"wrap-logger-",a),i}function E(){const e=(0,g.pV)();h.forEach((t=>{e[t]=(...r)=>function(t,...r){let n=[];return Object.values(e.initializedAgents).forEach((e=>{e&&e.api?e.exposed&&e.api[t]&&n.push(e.api[t](...r)):(0,l.R)(38,t)})),n.length>1?n:n[0]}(t,...r)}))}const x={};function _(e,t,g=!1){t||(0,c.Ak)(e,"api");const h={};var w=s.ee.get(e),A=w.get("tracer");x[e]=b.g.OFF,w.on(p.G4.REPLAY_RUNNING,(t=>{x[e]=t}));var E="api-",_=E+"ixn-";function N(t,r,n,o){const a=(0,i.Vp)(e);return null===r?delete a.jsAttributes[t]:(0,i.x1)(e,{...a,jsAttributes:{...a.jsAttributes,[t]:r}}),j(E,n,!0,o||null===r?"session":void 0)(t,r)}function T(){}h.log=function(e,{customAttributes:t={},level:r=y.p_.INFO}={}){(0,a.p)(f.xV,["API/log/called"],void 0,n.K7.metrics,w),function(e,t,r={},i=y.p_.INFO){(0,a.p)(f.xV,["API/logging/".concat(i.toLowerCase(),"/called")],void 0,n.K7.metrics,e),(0,a.p)(y.ET,[(0,m.t)(),t,r,i],void 0,n.K7.logging,e)}(w,e,t,r)},h.wrapLogger=(e,t,{customAttributes:r={},level:i=y.p_.INFO}={})=>{(0,a.p)(f.xV,["API/wrapLogger/called"],void 0,n.K7.metrics,w),R(w,e,t,{customAttributes:r,level:i})},v.forEach((e=>{h[e]=j(E,e,!0,"api")})),h.addPageAction=j(E,"addPageAction",!0,n.K7.genericEvents),h.setPageViewName=function(t,r){if("string"==typeof t)return"/"!==t.charAt(0)&&(t="/"+t),(0,o.f)(e).customTransaction=(r||"http://custom.transaction")+t,j(E,"setPageViewName",!0)()},h.setCustomAttribute=function(e,t,r=!1){if("string"==typeof e){if(["string","number","boolean"].includes(typeof t)||null===t)return N(e,t,"setCustomAttribute",r);(0,l.R)(40,typeof t)}else(0,l.R)(39,typeof e)},h.setUserId=function(e){if("string"==typeof e||null===e)return N("enduser.id",e,"setUserId",!0);(0,l.R)(41,typeof e)},h.setApplicationVersion=function(e){if("string"==typeof e||null===e)return N("application.version",e,"setApplicationVersion",!1);(0,l.R)(42,typeof e)},h.start=()=>{try{(0,a.p)(f.xV,["API/start/called"],void 0,n.K7.metrics,w),w.emit("manual-start-all")}catch(e){(0,l.R)(23,e)}},h[p.G4.RECORD]=function(){(0,a.p)(f.xV,["API/recordReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.RECORD,[],void 0,n.K7.sessionReplay,w)},h[p.G4.PAUSE]=function(){(0,a.p)(f.xV,["API/pauseReplay/called"],void 0,n.K7.metrics,w),(0,a.p)(p.G4.PAUSE,[],void 0,n.K7.sessionReplay,w)},h.interaction=function(e){return(new T).get("object"==typeof e?e:{})};const S=T.prototype={createTracer:function(e,t){var r={},i=this,o="function"==typeof t;return(0,a.p)(f.xV,["API/createTracer/called"],void 0,n.K7.metrics,w),g||(0,a.p)(_+"tracer",[(0,m.t)(),e,r],i,n.K7.spa,w),function(){if(A.emit((o?"":"no-")+"fn-start",[(0,m.t)(),i,o],r),o)try{return t.apply(this,arguments)}catch(e){const t="string"==typeof e?new Error(e):e;throw A.emit("fn-err",[arguments,this,t],r),t}finally{A.emit("fn-end",[(0,m.t)()],r)}}}};function j(e,t,r,i){return function(){return(0,a.p)(f.xV,["API/"+t+"/called"],void 0,n.K7.metrics,w),i&&(0,a.p)(e+t,[(0,m.t)(),...arguments],r?null:this,i,w),r?void 0:this}}function k(){r.e(296).then(r.bind(r,8778)).then((({setAPI:t})=>{t(e),(0,c.Ze)(e,"api")})).catch((e=>{(0,l.R)(27,e),w.abort()}))}return["actionText","setName","setAttribute","save","ignore","onEnd","getContext","end","get"].forEach((e=>{S[e]=j(_,e,void 0,g?n.K7.softNav:n.K7.spa)})),h.setCurrentRouteName=g?j(_,"routeName",void 0,n.K7.softNav):j(E,"routeName",!0,n.K7.spa),h.noticeError=function(t,r){"string"==typeof t&&(t=new Error(t)),(0,a.p)(f.xV,["API/noticeError/called"],void 0,n.K7.metrics,w),(0,a.p)("err",[t,(0,m.t)(),!1,r,!!x[e]],void 0,n.K7.jserrors,w)},d.RI?(0,u.GG)((()=>k()),!0):k(),h}var N=r(9417),T=r(8122);const S={accountID:void 0,trustKey:void 0,agentID:void 0,licenseKey:void 0,applicationID:void 0,xpid:void 0},j={};var k=r(5284);const I=e=>{const t=e.startsWith("http");e+="/",r.p=t?e:"https://"+e};let O=!1;function P(e,t={},r,n){let{init:a,info:c,loader_config:u,runtime:l={},exposed:f=!0}=t;l.loaderType=r;const p=(0,g.pV)();c||(a=p.init,c=p.info,u=p.loader_config),(0,N.xN)(e.agentIdentifier,a||{}),function(e,t){if(!e)throw new Error("All loader-config objects require an agent identifier!");j[e]=(0,T.a)(t,S);const r=(0,g.nY)(e);r&&(r.loader_config=j[e])}(e.agentIdentifier,u||{}),c.jsAttributes??={},d.bv&&(c.jsAttributes.isWorker=!0),(0,i.x1)(e.agentIdentifier,c);const h=(0,N.D0)(e.agentIdentifier),v=[c.beacon,c.errorBeacon];O||(h.proxy.assets&&(I(h.proxy.assets),v.push(h.proxy.assets)),h.proxy.beacon&&v.push(h.proxy.beacon),E(),(0,g.US)("activatedFeatures",k.B),e.runSoftNavOverSpa&&=!0===h.soft_navigations.enabled&&h.feature_flags.includes("soft_nav")),l.denyList=[...h.ajax.deny_list||[],...h.ajax.block_internal?v:[]],l.ptid=e.agentIdentifier,(0,o.V)(e.agentIdentifier,l),e.ee=s.ee.get(e.agentIdentifier),void 0===e.api&&(e.api=_(e.agentIdentifier,n,e.runSoftNavOverSpa)),void 0===e.exposed&&(e.exposed=f),O=!0}},8374:(e,t,r)=>{r.nc=(()=>{try{return document?.currentScript?.nonce}catch(e){}return""})()},860:(e,t,r)=>{"use strict";r.d(t,{$J:()=>o,K7:()=>n,P3:()=>i});const n={ajax:"ajax",genericEvents:"generic_events",jserrors:"jserrors",logging:"logging",metrics:"metrics",pageAction:"page_action",pageViewEvent:"page_view_event",pageViewTiming:"page_view_timing",sessionReplay:"session_replay",sessionTrace:"session_trace",softNav:"soft_navigations",spa:"spa"},i={[n.pageViewEvent]:1,[n.pageViewTiming]:2,[n.metrics]:3,[n.jserrors]:4,[n.spa]:5,[n.ajax]:6,[n.sessionTrace]:7,[n.softNav]:8,[n.sessionReplay]:9,[n.logging]:10,[n.genericEvents]:11},o={[n.pageViewTiming]:"events",[n.ajax]:"events",[n.spa]:"events",[n.softNav]:"events",[n.metrics]:"jserrors",[n.jserrors]:"jserrors",[n.sessionTrace]:"browser/blobs",[n.sessionReplay]:"browser/blobs",[n.logging]:"browser/logs",[n.genericEvents]:"ins"}}},n={};function i(e){var t=n[e];if(void 0!==t)return t.exports;var o=n[e]={exports:{}};return r[e](o,o.exports,i),o.exports}i.m=r,i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"nr-rum-1.274.0.min.js",i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e={},t="NRBA-1.274.0.PROD:",i.l=(r,n,o,a)=>{if(e[r])e[r].push(n);else{var s,c;if(void 0!==o)for(var u=document.getElementsByTagName("script"),d=0;d<u.length;d++){var l=u[d];if(l.getAttribute("src")==r||l.getAttribute("data-webpack")==t+o){s=l;break}}if(!s){c=!0;var f={296:"sha512-gkYkZDAwQ9PwaDXs2YM+rNIdRej1Ac1mupWobRJ8eahQcXz6/sunGZCKklrzi5kWxhOGRZr2tn0rEKuLTXzfAA=="};(s=document.createElement("script")).charset="utf-8",s.timeout=120,i.nc&&s.setAttribute("nonce",i.nc),s.setAttribute("data-webpack",t+o),s.src=r,0!==s.src.indexOf(window.location.origin+"/")&&(s.crossOrigin="anonymous"),f[a]&&(s.integrity=f[a])}e[r]=[n];var g=(t,n)=>{s.onerror=s.onload=null,clearTimeout(p);var i=e[r];if(delete e[r],s.parentNode&&s.parentNode.removeChild(s),i&&i.forEach((e=>e(n))),t)return t(n)},p=setTimeout(g.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=g.bind(null,s.onerror),s.onload=g.bind(null,s.onload),c&&document.head.appendChild(s)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="https://js-agent.newrelic.com/",(()=>{var e={840:0,374:0};i.f.j=(t,r)=>{var n=i.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[2]);else{var o=new Promise(((r,i)=>n=e[t]=[r,i]));r.push(n[2]=o);var a=i.p+i.u(t),s=new Error;i.l(a,(r=>{if(i.o(e,t)&&(0!==(n=e[t])&&(e[t]=void 0),n)){var o=r&&("load"===r.type?"missing":r.type),a=r&&r.target&&r.target.src;s.message="Loading chunk "+t+" failed.\n("+o+": "+a+")",s.name="ChunkLoadError",s.type=o,s.request=a,n[1](s)}}),"chunk-"+t,t)}};var t=(t,r)=>{var n,o,[a,s,c]=r,u=0;if(a.some((t=>0!==e[t]))){for(n in s)i.o(s,n)&&(i.m[n]=s[n]);if(c)c(i)}for(t&&t(r);u<a.length;u++)o=a[u],i.o(e,o)&&e[o]&&e[o][0](),e[o]=0},r=self["webpackChunk:NRBA-1.274.0.PROD"]=self["webpackChunk:NRBA-1.274.0.PROD"]||[];r.forEach(t.bind(null,0)),r.push=t.bind(null,r.push.bind(r))})(),(()=>{"use strict";i(8374);var e=i(944),t=i(6344),r=i(9566);class n{agentIdentifier;constructor(e=(0,r.LA)(16)){this.agentIdentifier=e}#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}addPageAction(e,t){return this.#e("addPageAction",e,t)}setPageViewName(e,t){return this.#e("setPageViewName",e,t)}setCustomAttribute(e,t,r){return this.#e("setCustomAttribute",e,t,r)}noticeError(e,t){return this.#e("noticeError",e,t)}setUserId(e){return this.#e("setUserId",e)}setApplicationVersion(e){return this.#e("setApplicationVersion",e)}setErrorHandler(e){return this.#e("setErrorHandler",e)}addRelease(e,t){return this.#e("addRelease",e,t)}log(e,t){return this.#e("log",e,t)}}class o extends n{#e(t,...r){if("function"==typeof this.api?.[t])return this.api[t](...r);(0,e.R)(35,t)}start(){return this.#e("start")}finished(e){return this.#e("finished",e)}recordReplay(){return this.#e(t.G4.RECORD)}pauseReplay(){return this.#e(t.G4.PAUSE)}addToTrace(e){return this.#e("addToTrace",e)}setCurrentRouteName(e){return this.#e("setCurrentRouteName",e)}interaction(){return this.#e("interaction")}wrapLogger(e,t,r){return this.#e("wrapLogger",e,t,r)}}var a=i(860),s=i(9417);const c=Object.values(a.K7);function u(e){const t={};return c.forEach((r=>{t[r]=function(e,t){return!0===(0,s.gD)(t,"".concat(e,".enabled"))}(r,e)})),t}var d=i(7603);var l=i(1687),f=i(4234),g=i(5289),p=i(6154),h=i(384);const v=e=>p.RI&&!0===(0,s.gD)(e,"privacy.cookies_enabled");function m(e){return!!(0,h.dV)().o.MO&&v(e)&&!0===(0,s.gD)(e,"session_trace.enabled")}var b=i(6389);class y extends f.W{constructor(e,t,r=!0){super(e.agentIdentifier,t),this.auto=r,this.abortHandler=void 0,this.featAggregate=void 0,this.onAggregateImported=void 0,!1===e.init[this.featureName].autoStart&&(this.auto=!1),this.auto?(0,l.Ak)(e.agentIdentifier,t):this.ee.on("manual-start-all",(0,b.J)((()=>{(0,l.Ak)(e.agentIdentifier,this.featureName),this.auto=!0,this.importAggregator(e)})))}importAggregator(t,r={}){if(this.featAggregate||!this.auto)return;let n;this.onAggregateImported=new Promise((e=>{n=e}));const o=async()=>{let o;try{if(v(this.agentIdentifier)){const{setupAgentSession:e}=await i.e(296).then(i.bind(i,3861));o=e(t)}}catch(t){(0,e.R)(20,t),this.ee.emit("internal-error",[t]),this.featureName===a.K7.sessionReplay&&this.abortHandler?.()}try{if(t.sharedAggregator)await t.sharedAggregator;else{t.sharedAggregator=i.e(296).then(i.bind(i,9337));const{EventAggregator:e}=await t.sharedAggregator;t.sharedAggregator=new e}if(!this.#t(this.featureName,o))return(0,l.Ze)(this.agentIdentifier,this.featureName),void n(!1);const{lazyFeatureLoader:e}=await i.e(296).then(i.bind(i,6103)),{Aggregate:a}=await e(this.featureName,"aggregate");this.featAggregate=new a(t,r),n(!0)}catch(t){(0,e.R)(34,t),this.abortHandler?.(),(0,l.Ze)(this.agentIdentifier,this.featureName,!0),n(!1),this.ee&&this.ee.abort()}};p.RI?(0,g.GG)((()=>o()),!0):o()}#t(e,t){switch(e){case a.K7.sessionReplay:return m(this.agentIdentifier)&&!!t;case a.K7.sessionTrace:return!!t;default:return!0}}}var w=i(6630);class A extends y{static featureName=w.T;constructor(e,t=!0){super(e,w.T,t),this.importAggregator(e)}}var R=i(9908),E=i(2843),x=i(3878),_=i(782),N=i(1863);class T extends y{static featureName=_.T;constructor(e,t=!0){super(e,_.T,t),p.RI&&((0,E.u)((()=>(0,R.p)("docHidden",[(0,N.t)()],void 0,_.T,this.ee)),!0),(0,x.sp)("pagehide",(()=>(0,R.p)("winPagehide",[(0,N.t)()],void 0,_.T,this.ee))),this.importAggregator(e))}}var S=i(3969);class j extends y{static featureName=S.TZ;constructor(e,t=!0){super(e,S.TZ,t),this.importAggregator(e)}}new class extends o{constructor(t,r){super(r),p.gm?(this.features={},(0,h.bQ)(this.agentIdentifier,this),this.desiredFeatures=new Set(t.features||[]),this.desiredFeatures.add(A),this.runSoftNavOverSpa=[...this.desiredFeatures].some((e=>e.featureName===a.K7.softNav)),(0,d.j)(this,t,t.loaderType||"agent"),this.run()):(0,e.R)(21)}get config(){return{info:this.info,init:this.init,loader_config:this.loader_config,runtime:this.runtime}}run(){try{const t=u(this.agentIdentifier),r=[...this.desiredFeatures];r.sort(((e,t)=>a.P3[e.featureName]-a.P3[t.featureName])),r.forEach((r=>{if(!t[r.featureName]&&r.featureName!==a.K7.pageViewEvent)return;if(this.runSoftNavOverSpa&&r.featureName===a.K7.spa)return;if(!this.runSoftNavOverSpa&&r.featureName===a.K7.softNav)return;const n=function(e){switch(e){case a.K7.ajax:return[a.K7.jserrors];case a.K7.sessionTrace:return[a.K7.ajax,a.K7.pageViewEvent];case a.K7.sessionReplay:return[a.K7.sessionTrace];case a.K7.pageViewTiming:return[a.K7.pageViewEvent];default:return[]}}(r.featureName).filter((e=>!(e in this.features)));n.length>0&&(0,e.R)(36,{targetFeature:r.featureName,missingDependencies:n}),this.features[r.featureName]=new r(this)}))}catch(t){(0,e.R)(22,t);for(const e in this.features)this.features[e].abortHandler?.();const r=(0,h.Zm)();delete r.initializedAgents[this.agentIdentifier]?.api,delete r.initializedAgents[this.agentIdentifier]?.features,delete this.sharedAggregator;return r.ee.get(this.agentIdentifier).abort(),!1}}}({features:[A,T,j],loaderType:"lite"})})()})();</script> <title>Open Textbook Library</title> <link rel="icon" type="image/x-icon" href="/assets/common/favicon/favicon-ed8a40d34e5a9e8247d219217486f4cb9e85d1ca4406ca215d4476382f204b88.ico" sizes="32x32" /> <link rel="icon" type="image/svg+xml" href="/assets/common/favicon/icon-416a88d5267dfde0f109a797f499b204eac7d111cb4c168a183816d18ce9e69e.svg" /> <link rel="apple-touch-icon" type="image/x-icon" href="/assets/common/favicon/apple-touch-icon-caa13225b84a915a19a2a7302a081b5e50cd7b1ebd0a11baf999fb33ee3028b7.png" sizes="120x120" /> <link rel="icon" type="image/webp" href="/assets/common/favicon/icon-32x32-4f70f735b1e933f37411290452ab963b64ecf3eacceaf351973328ee783be15c.webp" sizes="32x32" /> <link rel="icon" type="image/webp" href="/assets/common/favicon/icon-16x16-93c4e13c5723087cc0a3b53523c0eea4394736e4d57c964452456f1cf80ff8b8.webp" sizes="16x16" /> <link rel="mask-icon" type="image/x-icon" href="/assets/common/favicon/safari-pinned-tab-2e3bad01e1ef3a89cc405ebd5d00ecb7c7b3fbad3c5f77604985de29a1a65ead.svg" color="#872384" /> <meta content='#ffffff' name='msapplication-TileColor'> <meta content='#ffffff' name='theme-color'> <meta content='text/html; charset=utf-8' http-equiv='Content-Type'> <meta content='width=device-width, initial-scale=1, shrink-to-fit=no' name='viewport'> <link href='/humans.txt' rel='author'> <link href='/opentextbooks/manifest.json' rel='manifest'> <link href='/opentextbooks/search.xml' rel='search' title='Open Textbook Library' type='application/opensearchdescription+xml'> <link href='' rel='canonical'> <meta content='' name='description'> <meta content='open education, open educational resources, OER, open publishing, open textbooks, open textbook library, equity higher education' name='keywords'> <meta content='summary' name='twitter:card'> <meta content='open.umn.edu' property='twitter:domain'> <meta content='https://open.umn.edu/opentextbooks/BookDetail.aspx?bookId=217' property='twitter:url'> <meta content='@OpenEd_Network' name='twitter:site'> <meta content='Open Textbook Library' name='twitter:title'> <meta content='' name='twitter:description'> <meta content='Open Textbook Library' property='og:title'> <meta content='' property='og:description'> <meta content='Open Textbook Library' property='og:site_name'> <meta content='website' property='og:type'> <meta content='https://open.umn.edu/opentextbooks/BookDetail.aspx?bookId=217' property='og:url'> <meta content='en' property='og:locale'> <link rel="stylesheet" href="/assets/library-94defeb3852ea1a8e334eaa4d5280babe427cd59425aba9d722537f83e402128.css" media="all" /> <script src="/assets/jquery-sprockets-a326fca88f48395917a00c74e70d19c96e0e9c14fbee52abe6002b3c1680c887.js" nonce="adb4e241dc09530648f9c0d7713a4866"></script> <script type="importmap" data-turbo-track="reload" nonce="adb4e241dc09530648f9c0d7713a4866">{ "imports": { "@rails/ujs": "/assets/@rails--ujs-23063694f422bce8c2d45e3ca5eb110dd4803f73963cd6e1e91a2e61efdbcf6b.js", "@hotwired/turbo-rails": "/assets/turbo.min-2877f9ffddb547443b76739db3e5740e42cab1e5aa179ad51ea65c82eaefdfc3.js", "@hotwired/stimulus": "/assets/stimulus.min-f671bf854116951263efabde858d175d7d7a84f2325d98c44094ba1cef98c891.js", "@hotwired/stimulus-loading": "/assets/stimulus-loading-45d6f64637db64baf41ed406cbf38233b02a918fba9fc2a68d4a7c86c254aec7.js", "bootstrap": "/assets/bootstrap.bundle.min-ac70e651961e5ac942a12ee453052178637b650d8c4c3fa6c1faa518fcf7d8d7.js", "tinymce": "/assets/tinymce-d9c30c8f3c1ab821bc44810083aa58787a86f3859aed5e9ee442cce6ab445920.js", "chartkick": "/assets/chartkick-ff731bd9001ac916eaffe7ab4ab3dd7044ec26169469fe9c320b2cc207f3f2fe.js", "Chart.bundle": "/assets/Chart.bundle-6c6aa89d071352de0aae10352408e7626dec145655e6b186bab79797eda698ce.js", "leaflet": "/assets/leaflet-3661dc2ea7957c46bf7156dcbc323466e25280a6493e9dfb7c57ac581b470566.js", "bootstrap5-tags": "/assets/bootstrap5-tags-ae1974585defe6bb3e267b37f0fcd146e1ddcea0f402e082b2bdacb099740a37.js", "@stimulus-components/rails-nested-form": "/assets/@stimulus-components--rails-nested-form-6407f1bcc4b7edc1bd8a1e2ab028f50ea52085b1110321a112ecd937e5871efc.js", "sortablejs": "/assets/sortablejs-0c75751e77156a99e62f64a692c783ef5fb1e979f73a2e5315fbe1eba9736be4.js", "jquery": "/assets/jquery-46d8e6fc510a7b9021e6b8520df4918df0ac4bdb547f6219d036a4e459dacd34.js", "jquery-ui": "/assets/jquery-ui-b0026595525ca76dcdb8a93b23809753342b30e112bc25cbb718b8f0a94096ad.js", "bootstrap-datepicker": "/assets/bootstrap-datepicker-5766516499a6147c9fb700fc0b6c4c548dfebb89ff537ae3955384c709262d28.js", "bootstrap-table": "/assets/bootstrap-table-96150a7b3c0b1326aca83a7afaf4aa3891dc5f705681d003e067cf263860ab53.js", "admin": "/assets/admin-3f7d61b433c49682f362cd483be58d2a6afd84942a92bab4af92eed2c327691e.js", "library": "/assets/library-79c4355d2d7422417db5d52c09db2ab5f4bf0f59b278fd04a3a67c8f732b7aca.js", "network": "/assets/network-478e0ffa8d95a27ab68255d342ab610819a9b2ee61894dd02928ca1ffdec1c1d.js", "oen": "/assets/oen-447c7cfcb0cdd23d39482dae52331030b18416635d1e4511cb48c28fe668cdb9.js", "open": "/assets/open-ff6a5f668035c5517d88ff84e4a6a8b207987bd9394db9b7d12b7dfae7a9bfdb.js", "controllers/hw_combobox_controller": "/assets/controllers/hw_combobox_controller-3212fa49e0e085a21b34059d5e6dc096811bd8237d2f9ab94f0ed0cc5482e1e5.js", "hotwire_combobox.esm": "/assets/hotwire_combobox.esm-ec5f0e3e9d2277fbd5e7b36e71bae1904c9c5e584008e07e5c529f27d450712a.js", "hotwire_combobox.umd": "/assets/hotwire_combobox.umd-343a0051b88eaa511b7a973e0c1044e210d9ea23c8bf044b63d989ea1960ac24.js", "hw_combobox/helpers": "/assets/hw_combobox/helpers-f8802ea8745b436166e194c1037ba27085e554cdb7d5885f3a62e09ac82da3bb.js", "hw_combobox/models/combobox": "/assets/hw_combobox/models/combobox-4a26f457b5c7975c9e170f65c2b313069ce605091b4a15ef0ae30f998c89a4ef.js", "hw_combobox/models/combobox/actors": "/assets/hw_combobox/models/combobox/actors-99415cbae080278d3580cff54a2fe2acb934b777a34d5dd8b196f1a477681b30.js", "hw_combobox/models/combobox/announcements": "/assets/hw_combobox/models/combobox/announcements-7a16406d69a478a9856419a471f34c48a5d82332dab2385c4ab10642dacb7cfb.js", "hw_combobox/models/combobox/async_loading": "/assets/hw_combobox/models/combobox/async_loading-f270cec6e79405dfbaf2f052a6f48c7719ee5e954659ea895c5e928f60d0f9ad.js", "hw_combobox/models/combobox/autocomplete": "/assets/hw_combobox/models/combobox/autocomplete-52765ef9caedcead066a18951851b8e28520f02f763d50e67b126763f4d28dad.js", "hw_combobox/models/combobox/base": "/assets/hw_combobox/models/combobox/base-1893a969ef2cf882fd1f269176af73d2eb43c109c74f950bdd9fcf80026ff8ff.js", "hw_combobox/models/combobox/callbacks": "/assets/hw_combobox/models/combobox/callbacks-d5c4a2b9ce0fbd91474af1267bfdf9bf6c209bb068e2dfc53144ce5763ffb049.js", "hw_combobox/models/combobox/dialog": "/assets/hw_combobox/models/combobox/dialog-d1da3750029550148a63720010312d6095a10957a9eb364b27614dbfa86e4856.js", "hw_combobox/models/combobox/events": "/assets/hw_combobox/models/combobox/events-e962abfe7c13530895fb4c731fed296c58343b98fb17684e725f549d4958c38f.js", "hw_combobox/models/combobox/filtering": "/assets/hw_combobox/models/combobox/filtering-a87d38f36c86a20e162174e9742a85328d76cff9f09e0dff21f0862d93c488cc.js", "hw_combobox/models/combobox/form_field": "/assets/hw_combobox/models/combobox/form_field-ef89c3060d855590b202f631cde2777ac0fe0e8609f8c4ab117457b1ff283ecb.js", "hw_combobox/models/combobox/multiselect": "/assets/hw_combobox/models/combobox/multiselect-2141d91e2af952f58d7bb269cd1efcf3599c719c3fac3000a26918393ad78cb0.js", "hw_combobox/models/combobox/navigation": "/assets/hw_combobox/models/combobox/navigation-82e697abc8ce2b22796ff1b2d29f7200571ba307649cfe393b14c259a063084a.js", "hw_combobox/models/combobox/new_options": "/assets/hw_combobox/models/combobox/new_options-01b07242ffae581c2aae8cba7ef00f27c37237a3614e26407ad156e83dbe0dfd.js", "hw_combobox/models/combobox/options": "/assets/hw_combobox/models/combobox/options-63a8530470efde1e26b78720dcae44122bd92786c7291ebe0ef3d0536b525346.js", "hw_combobox/models/combobox/selection": "/assets/hw_combobox/models/combobox/selection-353bc9b77827befdc98d256adf5aa79e6f628c2c47d5243d21edf2d82a3e8b0f.js", "hw_combobox/models/combobox/toggle": "/assets/hw_combobox/models/combobox/toggle-2104ac3b55039b12197cb84a9d430a889a59de1678e85d9f698c431fbe1568bf.js", "hw_combobox/models/combobox/validity": "/assets/hw_combobox/models/combobox/validity-394807dccd9f6a56b28a9577fd413dbb5a6d927204d2165b73211ea530f316cb.js", "hw_combobox/vendor/bodyScrollLock": "/assets/hw_combobox/vendor/bodyScrollLock-d3cc541ef277e24b121e10a2b53d907e36e70b24e99e913b4e97376b9bc46750.js", "hw_combobox/vendor/requestjs": "/assets/hw_combobox/vendor/requestjs-e0fcc958d4df0bf9d7a089ae939178fa0e0943bb90d43cf2357c2c44efc3f0a0.js", "admin/init": "/assets/admin/init-a6f118a830a391127c09148146370bb08e135284a6b0cb4425630f05abf83489.js", "admin/main": "/assets/admin/main-b065184a21ff130a1cc91d0acbcca5c7a95d11269ae20ca2a40bc91f7d4de73a.js", "controllers/admin/calendar_controller": "/assets/controllers/admin/calendar_controller-890169a77656731ba8871468a60c3d530633234f01498e9f14494c045cc3fb04.js", "controllers/admin/check_column_controller": "/assets/controllers/admin/check_column_controller-ed83e912a12545084e2994384bed8ef724d44019f90436aa76c017bab699b32f.js", "controllers/admin/check_subjects_controller": "/assets/controllers/admin/check_subjects_controller-755ab30e9b0e57cb3e16c198936d580a828c2b6e045595d13eaf459896032637.js", "controllers/admin/clipboard_controller": "/assets/controllers/admin/clipboard_controller-11f5ac7556559aa190e5061d46c9ef38c944065806269cec83df5bc9f005165d.js", "controllers/admin/course_controller": "/assets/controllers/admin/course_controller-a651444b1acb7db19d8c34c3794523b2e2fda8e5e6308cd068094f4205610dce.js", "controllers/admin/datepicker_controller": "/assets/controllers/admin/datepicker_controller-ef6a2c39f53afbed11f122ed9de54e1315d1cbbfaea176fd3aa378cec338ef01.js", "controllers/admin/drag_controller": "/assets/controllers/admin/drag_controller-fc5c7347196b85bb7da683e835f73e8a8d74f01e21cffab1c3f3cc7c82b3b6c9.js", "controllers/admin/enrollment_controller": "/assets/controllers/admin/enrollment_controller-c6cd879b5059edcb2593efb3c94cfc6e56310d2bed89973c20db9684bd33d737.js", "controllers/admin/file_upload_controller": "/assets/controllers/admin/file_upload_controller-29e3e8e638c8921f5bf485b81c7bdecf8ec9e06fba7269e4dc3f703bb714fb5f.js", "controllers/admin/form_controller": "/assets/controllers/admin/form_controller-2108c7c9ceb8b7274c159bf5b8a8ae7e4a53da871f69070f7971eff7786de735.js", "controllers/admin/legend_controller": "/assets/controllers/admin/legend_controller-6cf9a89cbf313e47884d057c132f556e2121b548493b9abc63a2bc0a6fc9026b.js", "controllers/admin/membership_controller": "/assets/controllers/admin/membership_controller-34ac2e5af50d5151bc5339e6a8cc86762d97af8d3e186e023f9aa53aac8a313a.js", "controllers/admin/modal_controller": "/assets/controllers/admin/modal_controller-3a91e9596b8365c7465b8f8e8d3a43d9a612f5b390dcfcbb9000df833ece8d2a.js", "controllers/admin/popover_controller": "/assets/controllers/admin/popover_controller-21c81ebfb88654e890239765b059c357e01a201e5b79a5c7955dbaec61bd87d0.js", "controllers/admin/recipient_table_controller": "/assets/controllers/admin/recipient_table_controller-c993df4a32d1cff2975b252fee66e2f303acf81a6c90e6e8d12db0bc2562be97.js", "controllers/admin/remote_button_controller": "/assets/controllers/admin/remote_button_controller-7ffdceac55198e727bba663a5194577bfe87253a95690cd30f4581bfdc0d92b1.js", "controllers/admin/request_form_controller": "/assets/controllers/admin/request_form_controller-064d80130c65f5e483296df1f6ba95f8ff8f5192a575893103f4d6ab7d47d85e.js", "controllers/admin/request_recipient_controller": "/assets/controllers/admin/request_recipient_controller-392abe38c45ceeb8c24c6cebfa4da1a624c28b841c4068d9e413981546b7a98b.js", "controllers/admin/tab_controller": "/assets/controllers/admin/tab_controller-ac376d813e9d66f7e0e324a444ce105ef5a15cc458df03154d97157db405d624.js", "controllers/admin/tab_nav_controller": "/assets/controllers/admin/tab_nav_controller-d4480d3b2c6340e05ca79b140d3ecbac89fc053e3b3f2501994aa9198630498d.js", "controllers/admin/table_controller": "/assets/controllers/admin/table_controller-8a024f8e035e1fd987e3ad6e35779189e6e0ef059435858f5efdea32efd4f1e7.js", "controllers/admin/tag_area_controller": "/assets/controllers/admin/tag_area_controller-0e8f80a556e61d1eff00ba68b2da5d25633724f0bd36dfd30bbabc537a60e25d.js", "controllers/admin/text_area_controller": "/assets/controllers/admin/text_area_controller-31e911f897f0a5fb949e1d26bac96f8f299d3c2eb6212e1771aca801abb494a7.js", "controllers/admin/toggleable_controller": "/assets/controllers/admin/toggleable_controller-c0c018ffc4bbf35a08842a18b85b8464ffe15704619514cb0336c3e1cc772168.js", "controllers/admin/workshop_form_controller": "/assets/controllers/admin/workshop_form_controller-3fb26a32bde11f8eccae5961f8e4108443d88bc30ee192be34561a9e77521606.js", "controllers/application": "/assets/controllers/application-c26a19b82265fa9f902b7c610cde71d410cb8115dad3b8a33b42738b0d8410e4.js", "controllers/common/accordion_controller": "/assets/controllers/common/accordion_controller-1799b76998ab57a34c8ea8482cf33060590a092c3d85a0423a1b7deec1518732.js", "controllers/common/cover_controller": "/assets/controllers/common/cover_controller-f380d23c3c5123d23308154da2f864f57d8a2eaf6e537a3fc3b87ff19b955ca9.js", "controllers/common/infinite_scroll_controller": "/assets/controllers/common/infinite_scroll_controller-060a2736ce4c12b24b43b9c9e4e85b08f7de9a062f3e0c1fd642174ffdbd46d7.js", "controllers/common/preview_controller": "/assets/controllers/common/preview_controller-53949e036b80cfc82ded7291099e9c482c3c6aca528b2ff2e1a627dd2ea4c781.js", "controllers": "/assets/controllers/index-d39facb5faf283cdb9b5c3c6c14659416ecdf89923b020ca45d0836c9ec54b8d.js", "controllers/library/filter_controller": "/assets/controllers/library/filter_controller-64105f492cd91a3a792e5ccff44d6bd0aa60739842b86b7f85c44bd82059ca09.js", "controllers/library/review_controller": "/assets/controllers/library/review_controller-72eb16ffe384ad708950d79e9e71c5af41a455beffc8d370acc4086733ca8516.js", "controllers/oen/map_controller": "/assets/controllers/oen/map_controller-c9e55bc2e25a033985ee5f7147cd5e561762a60d7dac4c915ee7b40da2403f31.js", "controllers/oen/profiles_controller": "/assets/controllers/oen/profiles_controller-2141908b0b99192f213b6d9e8c7bbd95432cce3d8f796e1d61a3fee9bfbecd3a.js", "controllers/oen/sidebar_controller": "/assets/controllers/oen/sidebar_controller-e36d540c6dde575a89ddedd2bc6e543051961c3408343428a7bbd7adcbb1a8ea.js", "common/listeners": "/assets/common/listeners-8476aaa1645a89d7fecb400f70d5e3e558cf43e22575e7413ee250dfe66bd7d8.js", "common/util": "/assets/common/util-2b17d0c1faceb5ac0982743a7213948aaabbb45abdc4854777f43e6dd2b5ce18.js", "library/main": "/assets/library/main-19ed8758309a844c38239b192ef08a6dff41508ad900bf23fb2559df4cedb25c.js", "library/serviceworker-companion": "/assets/library/serviceworker-companion-a2e4650c5b2b226a1196aaa0ef387be305904576dac15d6fe66d255b64f6eaec.js", "network/main": "/assets/network/main-45d96470ead74bd9a97f0d05c2f0e186cb1ae3e0c89677d5e68fd74c1d5adfd1.js" } }</script> <script type="module" nonce="adb4e241dc09530648f9c0d7713a4866">import "library"</script> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="1StjQJvFauf9ygSX0YUioxIso-IFW2YA1FH48zak8MOUGkFhUvmNDqyLtkJb5VIvNROj9umjv315ADq7tvXgrA" /> <meta name="csp-nonce" content="adb4e241dc09530648f9c0d7713a4866" /> </head> <body class='d-flex flex-column h-100'> <noscript> <iframe class='hidden' height='0' src='https://www.googletagmanager.com/ns.html?id=GTM-KVLSPNJ' width='0'></iframe> </noscript> <div id='container'> <a class='skip-to-content-link' href='#main' role='link'>Skip to content</a> <div class='container-sub'> <header> <div class='row'> <div class='col-sm'> <a href='/opentextbooks/'> <picture id="banner"><!-- / %source{srcset: image_path('library/otl_logo_dark.webp'), media: '(prefers-color-scheme: dark)' } --> <img alt="Library Home" title="Open Textbook Library logo" width="1000" height="271" src="/assets/library/otl_logo-ad1fdd548ac7511cb0c15c0c834ce2635fc0ad44d584b6315265de88ddad81a2.webp" /> </picture></a> </div> <search class='col-sm align-self-end'> <form id="search-oer" action="/opentextbooks/textbooks" accept-charset="UTF-8" method="get"><div class='input-group input-group-sm'> <fieldset class="hw-combobox" data-async-id="search" data-controller="hw-combobox" data-hw-combobox-expanded-value="false" data-hw-combobox-name-when-new-value="q" data-hw-combobox-original-name-value="search" data-hw-combobox-autocomplete-value="both" data-hw-combobox-small-viewport-max-width-value="640px" data-hw-combobox-async-src-value="/opentextbooks/textbooks?for_id=search&format=turbo_stream" data-hw-combobox-filterable-attribute-value="data-filterable-as" data-hw-combobox-autocompletable-attribute-value="data-autocompletable-as" data-hw-combobox-selected-class="hw-combobox__option--selected" data-hw-combobox-invalid-class="hw-combobox__input--invalid"> <label class="hw-combobox__label" for="search" hidden="hidden"></label> <input type="hidden" name="search" id="search-hw-hidden-field" data-hw-combobox-target="hiddenField" autocomplete="off" /> <div class="hw-combobox__main__wrapper" data-hw-combobox-target="mainWrapper"> <style nonce="adb4e241dc09530648f9c0d7713a4866"> .hw-combobox__announcer { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .hw_combobox__pagination__wrapper { height: 5px; } </style> <div class="hw-combobox__announcer" aria-live="polite" aria-atomic="true" data-hw-combobox-target="announcer"></div> <input id="search" role="combobox" class="hw-combobox__input" type="text" data-action="focus->hw-combobox#open input->hw-combobox#filterAndSelect keydown->hw-combobox#navigate click@window->hw-combobox#closeOnClickOutside focusin@window->hw-combobox#closeOnFocusOutside turbo:before-stream-render@document->hw-combobox#rerouteListboxStreamToDialog turbo:before-cache@document->hw-combobox#hideChipsForCache turbo:morph-element->hw-combobox#idempotentConnect" data-hw-combobox-target="combobox" data-async-id="search" aria-controls="search-hw-listbox" aria-owns="search-hw-listbox" aria-haspopup="listbox" aria-autocomplete="both" aria-activedescendant="" autocomplete="off" title="Textbook Search" placeholder="Search the Library"> <span class="hw-combobox__handle" data-action="click->hw-combobox#clearOrToggleOnHandleClick" data-hw-combobox-target="handle"></span> <ul id="search-hw-listbox" role="listbox" class="hw-combobox__listbox" hidden="hidden" data-hw-combobox-target="listbox" aria-multiselectable="false"> <li id="search__hw_combobox_pagination__wrapper" class="hw_combobox__pagination__wrapper" data-hw-combobox-target="endOfOptionsStream" aria-hidden="true"> <turbo-frame loading="lazy" id="search__hw_combobox_pagination" src="/opentextbooks/textbooks?for_id=search&format=turbo_stream"></turbo-frame> </li> </ul> <div tabindex="-1" data-hw-combobox-target="dialogFocusTrap"></div> <div class="hw-combobox__dialog__wrapper"> <dialog class="hw-combobox__dialog" role="dialog" data-action="keydown->hw-combobox#navigate" data-hw-combobox-target="dialog"> <label class="hw-combobox__dialog__label" for="search-hw-dialog-combobox">Textbook Search</label> <input id="search-hw-dialog-combobox" role="combobox" class="hw-combobox__dialog__input" autofocus="autofocus" type="text" data-action="input->hw-combobox#filterAndSelect keydown->hw-combobox#navigate click@window->hw-combobox#closeOnClickOutside" data-hw-combobox-target="dialogCombobox" aria-controls="search-hw-dialog-listbox" aria-owns="search-hw-dialog-listbox" aria-autocomplete="both" aria-activedescendant=""> <ul id="search-hw-dialog-listbox" class="hw-combobox__dialog__listbox" role="listbox" data-hw-combobox-target="dialogListbox" aria-multiselectable="false"></ul> </dialog></div> </div></fieldset> <input type="submit" name="commit" value="Go" class="primary search-button btn btn-secondary white input-group-text" data-disable-with="Go" /> </div> </form></search> </div> </header> <div class='border-top'> <nav id='library-nav'> <ul> <li> <a href="/opentextbooks/subjects">Browse Subjects</a> <ul class="subject-directory"><li><a title="135 Business textbooks" data-unhide-mouseover="nav_textbook_subject_2" href="/opentextbooks/subjects/business">Business</a><a class="galaxy" aria-label="Expand Business" data-toggle="nav_textbook_subject_2" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_2" hidden="hidden"><li><a title="16 Accounting textbooks" href="/opentextbooks/subjects/accounting">Accounting</a></li><li><a title="21 Finance textbooks" href="/opentextbooks/subjects/finance">Finance</a></li><li><a title="13 Human Resources textbooks" href="/opentextbooks/subjects/human-resources">Human Resources</a></li><li><a title="54 Management textbooks" href="/opentextbooks/subjects/management">Management</a></li><li><a title="22 Marketing textbooks" href="/opentextbooks/subjects/marketing">Marketing</a></li></ul></li><li><a title="133 Computer Science textbooks" data-unhide-mouseover="nav_textbook_subject_3" href="/opentextbooks/subjects/computer-science-information-systems">Computer Science</a><a class="galaxy" aria-label="Expand Computer Science" data-toggle="nav_textbook_subject_3" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_3" hidden="hidden"><li><a title="27 Information Systems textbooks" href="/opentextbooks/subjects/information-systems">Information Systems</a></li><li><a title="26 Programming Languages textbooks" href="/opentextbooks/subjects/programming-languages">Programming Languages</a></li><li><a title="5 Databases textbooks" href="/opentextbooks/subjects/databases">Databases</a></li></ul></li><li><a title="124 Education textbooks" data-unhide-mouseover="nav_textbook_subject_5" href="/opentextbooks/subjects/education">Education</a><a class="galaxy" aria-label="Expand Education" data-toggle="nav_textbook_subject_5" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_5" hidden="hidden"><li><a title="39 Curriculum & Instruction textbooks" href="/opentextbooks/subjects/curriculum-instruction">Curriculum & Instruction</a></li><li><a title="10 Distance Education textbooks" href="/opentextbooks/subjects/distance-education">Distance Education</a></li><li><a title="14 Elementary Education textbooks" href="/opentextbooks/subjects/elementary-education">Elementary Education</a></li><li><a title="31 Higher Education textbooks" href="/opentextbooks/subjects/higher-education">Higher Education</a></li><li><a title="10 Secondary Education textbooks" href="/opentextbooks/subjects/secondary-education">Secondary Education</a></li><li><a title="16 Early Childhood textbooks" href="/opentextbooks/subjects/early-childhood">Early Childhood</a></li></ul></li><li><a title="397 Humanities textbooks" data-unhide-mouseover="nav_textbook_subject_6" href="/opentextbooks/subjects/humanities">Humanities</a><a class="galaxy" aria-label="Expand Humanities" data-toggle="nav_textbook_subject_6" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_6" hidden="hidden"><li><a title="53 Arts textbooks" href="/opentextbooks/subjects/arts">Arts</a></li><li><a title="49 History textbooks" href="/opentextbooks/subjects/history">History</a></li><li><a title="119 Languages textbooks" href="/opentextbooks/subjects/languages">Languages</a></li><li><a title="10 Linguistics textbooks" href="/opentextbooks/subjects/linguistics">Linguistics</a></li><li><a title="122 Literature, Rhetoric, and Poetry textbooks" href="/opentextbooks/subjects/literature-rhetoric-and-poetry">Literature, Rhetoric, and Poetry</a></li><li><a title="38 Philosophy textbooks" href="/opentextbooks/subjects/philosophy">Philosophy</a></li><li><a title="19 Religion textbooks" href="/opentextbooks/subjects/religion">Religion</a></li><li><a title="16 Music textbooks" href="/opentextbooks/subjects/music">Music</a></li></ul></li><li><a title="169 Mathematics textbooks" data-unhide-mouseover="nav_textbook_subject_7" href="/opentextbooks/subjects/mathematics">Mathematics</a><a class="galaxy" aria-label="Expand Mathematics" data-toggle="nav_textbook_subject_7" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_7" hidden="hidden"><li><a title="47 Applied textbooks" href="/opentextbooks/subjects/applied">Applied</a></li><li><a title="80 Pure textbooks" href="/opentextbooks/subjects/pure">Pure</a></li><li><a title="27 Statistics textbooks" href="/opentextbooks/subjects/statistics">Statistics</a></li><li><a title="28 Algebra textbooks" href="/opentextbooks/subjects/algebra">Algebra</a></li><li><a title="31 Calculus textbooks" href="/opentextbooks/subjects/calculus">Calculus</a></li><li><a title="10 Geometry and Trigonometry textbooks" href="/opentextbooks/subjects/geometry-and-trigonometry">Geometry and Trigonometry</a></li><li><a title="8 Analysis textbooks" href="/opentextbooks/subjects/analysis">Analysis</a></li></ul></li><li><a title="236 Natural Sciences textbooks" data-unhide-mouseover="nav_textbook_subject_8" href="/opentextbooks/subjects/natural-sciences">Natural Sciences</a><a class="galaxy" aria-label="Expand Natural Sciences" data-toggle="nav_textbook_subject_8" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_8" hidden="hidden"><li><a title="84 Biology textbooks" href="/opentextbooks/subjects/biology">Biology</a></li><li><a title="30 Chemistry textbooks" href="/opentextbooks/subjects/chemistry">Chemistry</a></li><li><a title="43 Physics textbooks" href="/opentextbooks/subjects/physics">Physics</a></li><li><a title="52 Earth Sciences textbooks" href="/opentextbooks/subjects/geology">Earth Sciences</a></li></ul></li><li><a title="251 Social Sciences textbooks" data-unhide-mouseover="nav_textbook_subject_9" href="/opentextbooks/subjects/social-sciences">Social Sciences</a><a class="galaxy" aria-label="Expand Social Sciences" data-toggle="nav_textbook_subject_9" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_9" hidden="hidden"><li><a title="39 Economics textbooks" href="/opentextbooks/subjects/economics">Economics</a></li><li><a title="9 Anthropology textbooks" href="/opentextbooks/subjects/anthropology">Anthropology</a></li><li><a title="20 Geography textbooks" href="/opentextbooks/subjects/geography">Geography</a></li><li><a title="49 Psychology textbooks" href="/opentextbooks/subjects/psychology">Psychology</a></li><li><a title="30 Sociology textbooks" href="/opentextbooks/subjects/sociology">Sociology</a></li><li><a title="39 Political Science textbooks" href="/opentextbooks/subjects/political-science">Political Science</a></li><li><a title="21 Cultural & Ethnic Studies textbooks" href="/opentextbooks/subjects/cultural-ethnic-studies">Cultural & Ethnic Studies</a></li><li><a title="15 Gender & Sexuality Studies textbooks" href="/opentextbooks/subjects/gender-sexuality-studies">Gender & Sexuality Studies</a></li><li><a title="24 Library Science and Museum Studies textbooks" href="/opentextbooks/subjects/library-science-and-museum-studies">Library Science and Museum Studies</a></li></ul></li><li><a title="60 Student Success textbooks" href="/opentextbooks/subjects/student-success">Student Success</a></li><li><a title="95 Law textbooks" data-unhide-mouseover="nav_textbook_subject_11" href="/opentextbooks/subjects/law">Law</a><a class="galaxy" aria-label="Expand Law" data-toggle="nav_textbook_subject_11" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_11" hidden="hidden"><li><a title="26 Civil Law textbooks" href="/opentextbooks/subjects/law-civil-law">Civil Law</a></li><li><a title="20 Criminal Law textbooks" href="/opentextbooks/subjects/criminal-law">Criminal Law</a></li><li><a title="25 Contract Law textbooks" href="/opentextbooks/subjects/environmental-law">Contract Law</a></li><li><a title="12 Procedural Law textbooks" href="/opentextbooks/subjects/contract-law">Procedural Law</a></li><li><a title="22 Property Law textbooks" href="/opentextbooks/subjects/property-law">Property Law</a></li><li><a title="14 Administrative Law textbooks" href="/opentextbooks/subjects/administrative-law">Administrative Law</a></li><li><a title="19 Constitutional Law textbooks" href="/opentextbooks/subjects/constitutional-law">Constitutional Law</a></li></ul></li><li><a title="112 Engineering & Technology textbooks" data-unhide-mouseover="nav_textbook_subject_13" href="/opentextbooks/subjects/engineering">Engineering & Technology</a><a class="galaxy" aria-label="Expand Engineering & Technology" data-toggle="nav_textbook_subject_13" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_13" hidden="hidden"><li><a title="13 Civil Engineering textbooks" href="/opentextbooks/subjects/civil">Civil Engineering</a></li><li><a title="24 Electrical Engineering textbooks" href="/opentextbooks/subjects/electrical">Electrical Engineering</a></li><li><a title="18 Mechanical Engineering textbooks" href="/opentextbooks/subjects/mechanical">Mechanical Engineering</a></li></ul></li><li><a title="51 Journalism, Media Studies & Communications textbooks" data-unhide-mouseover="nav_textbook_subject_16" href="/opentextbooks/subjects/journalism-media-studies-communications">Journalism, Media Studies & Communications</a><a class="galaxy" aria-label="Expand Journalism, Media Studies & Communications" data-toggle="nav_textbook_subject_16" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_16" hidden="hidden"><li><a title="14 New Media Journalism textbooks" href="/opentextbooks/subjects/new-media-journalism">New Media Journalism</a></li></ul></li><li><a title="96 Medicine textbooks" data-unhide-mouseover="nav_textbook_subject_17" href="/opentextbooks/subjects/medicine">Medicine</a><a class="galaxy" aria-label="Expand Medicine" data-toggle="nav_textbook_subject_17" href="#"><span class="nova">+</span></a><ul id="nav_textbook_subject_17" hidden="hidden"><li><a title="12 Nutrition textbooks" href="/opentextbooks/subjects/nutrition">Nutrition</a></li><li><a title="20 Nursing textbooks" href="/opentextbooks/subjects/nursing">Nursing</a></li></ul></li></ul> </li> <li> <a href="/opentextbooks/books">About Open Textbooks</a> <ul> <li><a href="/opentextbooks/faq">FAQ</a></li> <li><a href="/opentextbooks/friends">Friends</a></li> </ul> </li> <li> <a href="/opentextbooks/textbooks/submit">Submit</a> <!-- / %ul --> <!-- / %li= link_to t('library.nav.menu.submit_book'), library_submit_path --> <!-- / %li= link_to t('library.nav.menu.submit_ancillary'), new_library_textbook_ancillary_path --> </li> <li><a href="/opentextbooks/discovery">Discovery</a></li> <li><a data-turbo="false" href="/oen">Open Education Network</a></li> </ul> </nav> </div> <br class='clearfloat'> <main id='main'> <h1>Textbook has moved:</h1> <p>Please update your URL to</p> <a href="https://open.umn.edu/opentextbooks/textbooks/217">https://open.umn.edu/opentextbooks/textbooks/217</a> </main> <br class='clearfloat'> </div> </div> </body> <footer class='center mt-auto'> <div class='container'> <div class='content px-5 py-3'> <div class='row'> <div class='socials left col-sm'> <p class='header'>Stay Updated</p> <a href="https://mastodon.social/@OpenEd_Network"><i class="fab fa-mastodon " alt="Open Education Network on Mastodon"></i> <p class='sr-only'>Twitter</p> </a><a href="https://www.linkedin.com/company/open-education-network"><i class="fab fa-linkedin " alt="Open Education Network on LinkedIn"></i> <p class='sr-only'>LinkedIn</p> </a><a href="https://www.youtube.com/channel/UC_lf4_Wss_uW0KGny_A3erg"><i class="fab fa-youtube " alt="Open Education Network on YouTube"></i> <p class='sr-only'>YouTube</p> </a></div> <div class='newsletter right col-sm'> <p class='header'>Join Our Newsletter</p> <div class='row'> <div class='col right offset-md-2' id='newsletter'> <form action='https://cl.exct.net/DEManager.aspx' method='post' name='subscribeForm'> <input name='_clientID' type='hidden' value='6329914'> <input name='_deExternalKey' type='hidden' value='BF8CCDC6-9A32-460A-B2A6-F74B89BA62BF'> <input name='_action' type='hidden' value='add'> <input name='_returnXML' type='hidden' value='0'> <input name='_successURL' type='hidden' value='https://open.umn.edu/opentextbooks/news?success=true'> <input name='_errorURL' type='hidden' value='https://open.umn.edu/opentextbooks/news?success=false'> <div class='input-group'> <input aria-label='Email Newsletter Signup' autocomplete='email' class='form-control email' id='newsletter_signup_email' name='Email Address' placeholder='email address' required title='Email Newsletter Signup' type='email'> <input class='btn primary' id='signup-button' type='submit' value='Subscribe'> </div> </form> </div> </div> </div> </div> <br class='clearfix'> <div class='row'> <div class='col center'> <p> CENTER FOR OPEN EDUCATION | The Open Education Network is based in the Center for Open Education in the University of Minnesota鈥檚 College of Education and Human Development. <br> University of Minnesota, 330 Wulling Hall, 86 Pleasant Street S.E., Minneapolis, MN 55455 </p> <p> <a href="http://creativecommons.org/licenses/by/4.0/"><img width="92" height="35" alt="Attribution License" class="license-img" src="/assets/library/licenses/Attribution-8d56f8d0b67f1a66715079fbcbf1b97849b5049351e7e892e758de88967e0b93.webp" /></a> Except where otherwise noted, content on this site is licensed under a <a href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a> </p> </div> </div> </div> </div> </footer> </html>